Hvordan lage en RPG-spillet i C ++

Hvordan lage en RPG-spillet i C ++


Når du spiller et rollespill, eller RPG, tar du på deg rollen som en imaginær karakter og oppleve sine opplevelser. Disse spillene kan være ganske komplisert og involverer tunge grafikk. Utviklere arbeider vanligvis flere måneder på koding og testing av spillet. Men du kan lage en enkel RPG spill i C ++. Videre, du trenger bare å forstå det grunnleggende C ++ programmering. Du kan lage en enkel RPG spill ved hjelp av en todimensjonal matrise som kartet og noen klasser for å styre figuren din, fiendtlige figurer og spill-spiller.

Bruksanvisning

1 Åpne din favoritt C ++ redaktør og starte et nytt prosjekt. Inkludere "iostream" og "endringsdato" biblioteker ved å bruke denne koden:

inkluderer <iostream> inkluder <ctime>

2 Opprett en ny klasse som representerer din helt og monstrene i din "fengslet" ved å bruke denne koden:

klasse CCreature
{
offentlig:

CCreature() : muiAttack(0), muiDefense(0), muiHitPoints(3)
{
for (unsigned int uiIndex = 0; uiIndex &lt; 3; ++uiIndex) {
muiAttack = muiAttack + (rand() % 34);
muiDefense = muiDefense + (rand() % 34);
muiHitPoints = muiHitPoints + (rand() % 10);
}
}
void Attack(CCreature&amp; qrDefender) {
// Generate a numbers between 1 and 100
unsigned int uiAttack1 = (rand() % 100) + 1;
unsigned int uiDefense1 = (rand() % 100) + 1;
unsigned int uiAttack2 = (rand() % 100) + 1;
unsigned int uiDefense2 = (rand() % 100) + 1;
// Did the attacker (hero) hit?
if (uiAttack1 &lt; muiAttack &amp;&amp; uiDefense1 > qrDefender.muiDefense) {
--qrDefender.muiHitPoints;
std::cout &lt;&lt; &quot;Monster Hit!&quot; &lt;&lt; std::endl;
} else {
std::cout &lt;&lt; &quot;Monster Missed!&quot; &lt;&lt; std::endl;
}
// Check if the monster hit your character
if (uiAttack2 &lt; qrDefender.muiAttack &amp;&amp; uiDefense1 > muiDefense) {
--muiHitPoints;
std::cout &lt;&lt; &quot;Hero Hit!&quot; &lt;&lt; std::endl;
} else {
std::cout &lt;&lt; &quot;Hero Missed!&quot; &lt;&lt; std::endl;
}
std::cout &lt;&lt; &quot;Your Hitpoints:&quot; &lt;&lt; muiHitPoints &lt;&lt; std::endl;
std::cout &lt;&lt; &quot;Monster Hitpoints:&quot; &lt;&lt; qrDefender.muiHitPoints &lt;&lt; std::endl;
}
bool IsDead() {
return (muiHitPoints == 0);
}

privat:

unsigned int muiAttack;
unsigned int muiDefense;
unsigned int muiHitPoints;

};

Denne klassen initialiserer tre attributter: angrep, forsvar og HIT-poeng. Den bruker da et angrep algoritme for å finne ut om angrepet var vellykket, skade av angrepet, og de resterende hit-poeng.

3 Opprett en ny klasse som representerer "dungeon" som en bi-dimensjonal array ved hjelp av denne koden:

klasse CDungeon {
offentlig:

CDungeon() {
// Create an empty maze
char caaMaze[10][11] = {
&quot;**********&quot;,
&quot;* ** ** *&quot;,
&quot;* * ** *&quot;,
&quot;* *&quot;,
&quot;* * *** *&quot;,
&quot;* ** * ***&quot;,
&quot;* * * *&quot;,
&quot;* ** *&quot;,
&quot;* * *** *&quot;,
&quot;**********&quot;};
for (unsigned int uiRow = 0; uiRow &lt; 10; ++uiRow) {
for (unsigned int uiCol = 0; uiCol &lt; 10; ++uiCol) {
mcaaMaze[uiRow][uiCol] = caaMaze[uiRow][uiCol];
}
}
}
char GetMazeSquare(unsigned int uiRow, unsigned int uiCol) {
return mcaaMaze[uiRow][uiCol];
}

privat:

char mcaaMaze[10][10];

};

Du kan endre måten din "dungeon" ser ut ved å endre plasseringen av "*" tegn.

4 Lag klassen som styrer spillet-play ved å bruke denne koden:

klasse CRolePlayingGame
{
offentlig:

CRolePlayingGame() {
// Initlialize the random number generator
time_t qTime;
time(&amp;qTime);
srand((unsigned int)qTime);

// Initialfangehullet til å være tom
for (unsigned int uiRow = 0; uiRow & lt; 10; ++ uiRow) {
for (unsigned int uiCol = 0; uiCol & lt; 10; ++ uiCol) {
mqpaaCreatures [uiRow] [uiCol] = 0;
}
}

// Opprett en helt
bool bFoundSpot = false;
while (! bFoundSpot) {
unsigned int uiRow = 1 + (rand ()% 8);
unsigned int uiCol = 1 + (rand ()% 8);
if (QueryLocation (uiRow, uiCol) == '') {
bFoundSpot = true;
mqpaaCreatures [uiRow] [uiCol] = & amp; mqHero;
}
}
// Lag 10 monstre
bFoundSpot = false;
unsigned int uiMonster = 0;
while (! bFoundSpot) {
unsigned int uiRow = 1 + (rand ()% 8);
unsigned int uiCol = 1 + (rand ()% 8);
if (QueryLocation (uiRow, uiCol) == '') {
mqpaaCreatures [uiRow] [uiCol] = & amp; mqaMonsters [uiMonster];
++ UiMonster;
if (uiMonster == 10) {
bFoundSpot = true;
}
}
}
}
char QueryLocation (unsigned int uiRow, unsigned int uiCol) {
for (unsigned int uIndex = 0; uIndex & lt; 10; ++ uIndex) {
if (mqpaaCreatures [uiRow] [uiCol] == & amp; (mqaMonsters [uIndex])) {
avkastning (char) ( '0' + uIndex);
}
}
if (mqpaaCreatures [uiRow] [uiCol] == & amp; mqHero) {
return 'H';
} Else {
tilbake mqDungeon.GetMazeSquare (uiRow, uiCol);
}
}
bool MoveHero (const char kcDirection) {
unsigned int uiHeroRow;
unsigned int uiHeroCol;
LocateCreature (uiHeroRow, uiHeroCol, & amp; mqHero);
unsigned int uiNextRow = uiHeroRow;
unsigned int uiNextCol = uiHeroCol;
bryteren (kcDirection) {
case 'w':
case 'W':
{
--uiNextRow;
gå i stykker;
}
saker':
saker':
{
++ UiNextCol;
gå i stykker;
}
case 'z':
case 'Z':
{
++ UiNextRow;
gå i stykker;
}
case 'a':
case 'A':
{
--uiNextCol;
gå i stykker;
}
misligholde:
{
return false;
}
}
char cNextLoc = QueryLocation (uiNextRow, uiNextCol);
if (cNextLoc == '') {
mqpaaCreatures [uiNextRow] [uiNextCol] = & amp; mqHero;
mqpaaCreatures [uiHeroRow] [uiHeroCol] = 0;
return true;
} Else if (cNextLoc> = '0' & amp; & amp; cNextLoc & lt; = '9') {
mqHero.Attack (mqaMonsters [(int) (cNextLoc - '0')]);
return true;
} Else {
return false;
}
}
void PrintBoard () {
bruker namespace std;
for (unsigned int uiRow = 0; uiRow & lt; 10; ++ uiRow) {
for (unsigned int uiCol = 0; uiCol & lt; 10; ++ uiCol) {
cout & lt; & lt; QueryLocation (uiRow, uiCol);
}
cout & lt; & lt; endl;
}
}
bool HeroIsDead () {
tilbake mqHero.IsDead ();
}
void RemoveDeadMonsters () {
for (unsigned int uiIndex = 0; uiIndex & lt; 10; ++ uiIndex) {
if (mqaMonsters [uiIndex] .IsDead ()) {
unsigned int uiRow;
unsigned int uiCol;
if (LocateCreature (uiRow, uiCol, & amp; (mqaMonsters [uiIndex]))) {
mqpaaCreatures [uiRow] [uiCol] = 0;
std :: cout & lt; & lt; & Quot; Monster drept & quot!; & Lt; & lt; std :: endl;
}
}
}
}
bool AllMonstersDead () {
bool bAllDead = true;
for (unsigned int uiIndex = 0; uiIndex & lt; 10; ++ uiIndex) {
if (! mqaMonsters [uiIndex] .IsDead ()) {
bAllDead = false;
}
}
tilbake bAllDead;
}

privat:

bool LocateCreature(unsigned int&amp; uirRow, unsigned int&amp; uirCol, CCreature* qpCreature) {
for (unsigned int uiRow = 0; uiRow &lt; 10; ++uiRow) {
for (unsigned int uiCol = 0; uiCol &lt; 10; ++uiCol) {
if (mqpaaCreatures[uiRow][uiCol] == qpCreature) {
uirRow = uiRow;
uirCol = uiCol;
return true;
}
}
}
return false;
}
CDungeon mqDungeon;
CCreature mqHero;
CCreature mqaMonsters[10];
CCreature* mqpaaCreatures[10][10];

};

Denne klassen styrer helten din bevegelse. Du bruker "W", "A", "S" og "Z" for å bevege figuren din. Den gyter også 10 monstre og helten inni "dungeon" og styrer samspillet mellom dem, for eksempel dødsfall og posisjoner.

5 Opprett hovedprogrammet som kaller de forskjellige klasser og funksjoner og samhandler med brukeren. Du kan kontrollere ulike aspekter av spillet fra dette programmet. Bruk denne koden for å lage det:

int main () {

using namespace std;
// Clear the dungeon
CRolePlayingGame qGame;
bool bGameOver = false;
do {
qGame.PrintBoard();
// Get the next move
char cMove;
cout &lt;&lt; &quot;Use W, A, S, or Z to move:&quot; &lt;&lt; endl;
std::cin >> cMove;
// Check if the move is valid
if (qGame.MoveHero(cMove)) {
// If the hero is dead
if (qGame.HeroIsDead()) {
cout &lt;&lt; &quot;You have Died!&quot; &lt;&lt; endl;
bGameOver = true;
} else {
// Remove the dead monsters from the game
qGame.RemoveDeadMonsters();
// If all of the monsters are dead
if (qGame.AllMonstersDead()) {
cout &lt;&lt; &quot;Dungeon Cleared!&quot; &lt;&lt; endl;
bGameOver = true;
}
}
}
} while (!bGameOver);
return 0;

}

6 Kompilere nye prosjektet og kjøre den til å teste om det fungerer slik du forventer. Endre forskjellige innstillinger for å forbedre spillet-play til du er fornøyd med resultatet.