According to my idea, the characters change their position by 1 square in one random direction out of eight. The problem is that during the cycle they can change their position by more than 1 cell, and when adding the zeroing variables moveX and moveY, the program began to crumble.
#include <iostream> #include <fstream> #include <cstdlib> #include <time.h> #include <conio.h> #include <dos.h> using namespace std; static const int width = 1000; //Π΄Π»ΠΈΠ½Π° ΠΈ ΡΠΈΡΠΈΠ½Π° ΠΊΠ°ΡΡΡ static const int length = 1000; int playField[width][length]; //ΠΌΠ°ΡΡΠΈΠ² ΠΊΠ°ΡΡΡ int moveX, moveY; //ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π½ΠΎΠ²ΡΡ
ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ class Characters{ private: int id; int hp; //Ρ
Π°ΠΏΡΡΠΊΠΈ public: int area; int posX, posY; //ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ° void moveTo(int newX, int newY, int ID){ area = playField[moveX][moveY]; //ΡΠΎΡ
Ρ. Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠ»Π΅ΡΠΊΠΈ posX = newX; posY = newY; playField[newX][newY]=ID; } void setId(int newID){ id = newID; } void showId(){ cout<<"ID: "<<id<<endl; } void showPosition(){ cout<<"X: "<<posX<<endl<<"Y: "<<posY<<endl; } }; /////////////////////////////////////////////////////////// class PlayField{ private: int area; public: void fillMap(){ //ΡΠ΅ΡΡ ΡΡΠ½ΠΊΡΠΈΡ for (int i=0; i<=width-1; i++) //Π²Π±ΠΈΠ²Π°Π΅ΠΌ Π½ΡΠ»ΠΈ Π² ΠΌΠ°ΡΡΠΈΠ² for (int j=0; j<=length-1; j++) playField[i][j]=-1; } void moveToFile(){ ofstream file; file.open("C:\\Users\\NoName\\Desktop\\Game\\PlayField.txt",ios::out); cout<<"file status: "<<file.is_open()<<endl; //ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ°ΠΉΠ»Π° for (int i=0; i<=width-1; i++){ //ΠΏΠ΅ΡΠ΅Π½ΠΎΡ ΠΌΠ°ΡΡΠΈΠ²Π° Π² ΡΠ°ΠΉΠ» file<<endl; for (int j=0; j<=length-1; j++) file<<playField[i][j]; } file.close(); } void moveCh(int x, int y, int id){ //playField[x][y]=id; } }; ///////////////////////////////////////////////////////////// int main(){ cout<<"Welcome, nine tailed fox. Please input number of characters: "; bool cycleRunning = 1; //Π²ΡΠΊΠ»ΡΡΠ°ΡΠ΅Π»Ρ Π΄Π»Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π° bool busy = 0; //ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΡΡΠΈ ΠΊΠ»Π΅ΡΠΊΠΈ int chX, chY; //ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΡΠΏΠ°Π²Π½Π° int way; //Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ». ΡΠ°Π³Π° int seconds = 0; //Π΄Π»Ρ ΡΠ°ΠΉΠΌΠ΅ΡΠ° srand(time(NULL)); //ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ°Π½Π΄ΠΎΠΌΠ°ΠΉΠ·Π΅ΡΠ° int numOfChar; cin>>numOfChar; //ΠΊΠΎΠ»-Π²ΠΎ ΡΠ°ΡΠΎΠ² int *charId = new int[numOfChar]; //ΠΌΠ°ΡΡΠΈΠ² ΠΈΠ΄ int lastID = 0; //ΠΏΠΎΡΠ» ΠΈΠ΄ PlayField field; field.fillMap(); Characters *ch = new Characters[numOfChar]; //ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ΅ΠΉ for(int i=0; i<numOfChar; i++){ busy = 0; ch[i].setId(i); do{ chX = rand()%1000, chY = rand()%1000; //Π½Π°ΡΠ°Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ if (i<2) if (i==1) if(ch[0].posX==chX) if(ch[0].posY==chY) busy = 1; else for(int j=i-2; j>=0; j--){ if(ch[j].posX==chX) //ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π°Π»ΠΈΡΠΈΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ
ΡΠ°ΡΠΎΠ² Π½Π° ΠΊΠ»Π΅ΡΠΊΠ΅ if(ch[j].posY==chY) busy = 1; } }while(busy == 1); ch[i].moveTo(chX, chY, i); ch[i].showPosition(); ch[i].showId(); cout<<endl; } while(cycleRunning != 0){ if(kbhit()==1) cycleRunning=0; if(seconds != time(NULL)){ //ΡΠ°ΠΉΠΌΠ΅Ρ seconds = time(NULL); for(int i=0; i<numOfChar; i++){ do{ busy = 0; if (i<2) switch (i){ case 0: { way = rand() % 8; switch (way) //Π²ΡΠ±ΠΎΡ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ { case 0: {moveX = ch[i].posX - 1; moveY = ch[i].posY + 1;} break; case 1: {moveY = ch[i].posY + 1;} break; case 2: {moveX = ch[i].posX + 1; moveY = ch[i].posY + 1;} break; case 3: {moveX = ch[i].posX + 1;} break; case 4: {moveX = ch[i].posX + 1; moveY = ch[i].posY - 1;} break; case 5: {moveY = ch[i].posY - 1;} break; case 6: {moveX = ch[i].posX - 1; moveY = ch[i].posY - 1;} break; case 7: {moveX = ch[i].posX - 1;} break; } if(moveX<0) if(moveY<0) busy = 1; } break; case 1: { way = rand() % 8; switch (way) { case 0: {moveX = ch[i].posX - 1; moveY = ch[i].posY + 1;} break; case 1: {moveY = ch[i].posY + 1;} break; case 2: {moveX = ch[i].posX + 1; moveY = ch[i].posY + 1;} break; case 3: {moveX = ch[i].posX + 1;} break; case 4: {moveX = ch[i].posX + 1; moveY = ch[i].posY - 1;} break; case 5: {moveY = ch[i].posY - 1;} break; case 6: {moveX = ch[i].posX - 1; moveY = ch[i].posY - 1;} break; case 7: {moveX = ch[i].posX - 1;} break; } if(moveX<0) if(moveY<0) if(ch[0].posX==moveX) if(ch[0].posY==moveY) busy = 1;} break; } else{ way = (rand() % 8); cout<<way<<endl; switch (way) { case 0: {moveX = ch[i].posX - 1; moveY = ch[i].posY + 1;} break; case 1: {moveY = ch[i].posY + 1;} break; case 2: {moveX = ch[i].posX + 1; moveY = ch[i].posY + 1;} break; case 3: {moveX = ch[i].posX + 1;} break; case 4: {moveX = ch[i].posX + 1; moveY = ch[i].posY - 1;} break; case 5: {moveY = ch[i].posY - 1;} break; case 6: {moveX = ch[i].posX - 1; moveY = ch[i].posY - 1;} break; case 7: {moveX = ch[i].posX - 1;} break; } for(int j=i-2; j>=0; j--){ if(moveX<0) if(moveY<0) if(ch[j].posX==moveX) //ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π°Π»ΠΈΡΠΈΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ
ΡΠ°ΡΠΎΠ² Π½Π° ΠΊΠ»Π΅ΡΠΊΠ΅ if(ch[j].posY==moveY) busy = 1; } } }while(busy == 1); playField[ch[i].posX] [ch[i].posY] = ch[i].area; //Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ΅ΡΡΠΈΡΠΎΡΠΈΠΈ ch[i].moveTo(moveX, moveY, i); //field.moveCh(moveX, moveY, i); ch[i].showPosition(); ch[i].showId(); cout<<endl<<endl; } } } //field.moveToFile(); delete[] charId; return 0; }