Проблема с циклами

171
22 октября 2018, 07:00

По моей задумке персонажи меняют своё положение на 1 клетку в одно случайное направление из восьми. Проблема заключается в том, что за цикл они могут изменить своё положение на более, чем 1 клетка, а при добавлении обнуления переменных moveX и moveY программа вовсе начала крашиться.

#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;
}
Answer 1

Случайное направление не реагирует на край карты, где направлений ограниченное количество. Поэтому абонент выходит за рамки отрицательных координат. Или в бесконечность.

READ ALSO
Как вести информацию в статусбар?

Как вести информацию в статусбар?

У меня есть главное окно, нам нём кнопка, которая открывает новое модальное окно (кнопка Параметры)У этого модального окна есть кнопка, которая...

149
IO-функции в kernel-space

IO-функции в kernel-space

Env: macOS, пишу драйвер, компилятор - clang

150
Перемещение QGroupBox в пределах одной формы

Перемещение QGroupBox в пределах одной формы

Задача простая но не нашел адекватного решенияУ меня есть QTabWidget и на одной из вкладок будет набор QGroupBox'ов, которые пользователь должен иметь...

167
Как получить имя файла через аргумент в visual basic

Как получить имя файла через аргумент в visual basic

Как написать на VB программу которая будет выводить имя файла через аргумент? Если писать на c++, то будет выглядеть примерно так

219