По моей задумке персонажи меняют своё положение на 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;
}
Случайное направление не реагирует на край карты, где направлений ограниченное количество. Поэтому абонент выходит за рамки отрицательных координат. Или в бесконечность.
У меня есть главное окно, нам нём кнопка, которая открывает новое модальное окно (кнопка Параметры)У этого модального окна есть кнопка, которая...
Задача простая но не нашел адекватного решенияУ меня есть QTabWidget и на одной из вкладок будет набор QGroupBox'ов, которые пользователь должен иметь...
Как написать на VB программу которая будет выводить имя файла через аргумент? Если писать на c++, то будет выглядеть примерно так