Итак, я пытаюсь написать программу, которая решает проблему «Dungeon Crawl» здесь: http://www.cplusplus.com/forum/articles/12974/. Если вы слишком ленивы, чтобы прочитать ссылку (что вполне понятно), основная предпосылка игры состоит в том, что игрок перемещается по сетке 10x10 и пытается достичь сокровища, избегая ловушек и движущихся врагов. Поскольку все раскрывается игроку, это не очень большая игра, но я думал, что это будет хорошая практика кодирования. К сожалению, я ржав на пользовательском входе и никогда не научился совмещать всю программу, а это значит, что у меня серьезные проблемы с правильными функциями.Функции, которые не выполняются должным образом
Основная функция заключается в следующем:
int main()
{
int turn=0,enemyCount=0;
bool end=false;
srand (time(NULL));
node* world;
world = new node[100];
generateWorld(world);
drawWorld(world);
do {
playerMove(world);
enemiesMoves(world,enemyCount);
drawWorld(world);
end = endCheck(world);
turn++;
} while (end == false);
return 0;
}
Я думаю, что это нормально, как есть, так как оно следует простой процесс сбора движений, обновляя мир, а затем проверить, чтобы увидеть, если конечное условие было достиг. Проблема в том, что многие функции не работают, как я ожидал бы их, и я не могу понять, почему они не являются. Это включает проверку входных данных пользователей, обновление движения врагов, привлечение мира и проверку завершения игры. Я пойду в порядок.
Это playerMove()
функция:
void playerMove(node* array){
int i,playerLocation,oldLocation;
bool valid=false;
char move;
for (i=0;i<100;i++){
if (array[i].player == true){
playerLocation = i;
oldLocation = playerLocation;
}
}
while(!valid){
if (cin >> move){
if (move=='w' || move=='s' || move=='a' || move=='d')
valid = true;
}
if (move=='w'){
playerLocation = oldLocation-10;
if (playerLocation < 0){
cout << "You can't swim." << endl;
valid = false;
}
}
else if (move=='s'){
playerLocation = oldLocation+10;
if (playerLocation > 99){
cout << "You can't swim." << endl;
valid = false;
}
}
else if (move=='a'){
playerLocation = oldLocation-1;
if (playerLocation % 10 == 9){
cout << "You can't swim." << endl;
valid = false;
}
}
else if (move=='d'){
playerLocation = oldLocation+1;
if (playerLocation % 10 == 0){
cout << "You can't swim." << endl;
valid = false;
}
}
}
array[oldLocation].player = false;
array[playerLocation].player = true;
}
Он должен собрать вход игрок, ничего не делать, если игрок входит ключ, который не WASD (они могут двигаться только в четырех основных направлениях), отклонить вход, если игрок пытается покинуть край мира и обновить позицию игрока. Он успешно выполняет последнее, но он не поймает недопустимый ввод, и если переход не удался, он отказывается отображать сообщение, которое оно должно использовать.
Это enemiesMoves
функция:
void enemiesMoves(node* array,int enemyCount){
int i,j=0,n,enemyLocations[enemyCount],oldLocations[enemyCount];
bool valid = false;
for (i=0;j<enemyCount;i++){
if (array[i].enemy==true){
enemyLocations[j] = i;
cout << enemyLocations[j] << endl;
j++;
}
}
for (j=0;j<enemyCount;j++){
oldLocations[j] = enemyLocations[j];
}
for (j=0;j<enemyCount;j++){
while (!valid){
n = rand() % 4 + 1;
if (n = 1){
enemyLocations[j] = oldLocations[j]-10;
if (enemyLocations[j] < 0)
valid = false;
}
else if (n = 2){
enemyLocations[j] = oldLocations[j]+10;
if (enemyLocations[j] > 100)
valid = false;
}
else if (n = 3){
enemyLocations[j] = oldLocations[j]-1;
if (enemyLocations[j] % 10 == 9)
valid = false;
}
else if (n = 1){
enemyLocations[j] = oldLocations[j]+1;
if (enemyLocations[j] % 10 == 0)
valid = false;
}
}
array[enemyLocations[j]].enemy = true;
array[oldLocations[j]].enemy = false;
}
}
Предполагается переместить врагов в случайном направлении, но отвергают движение, если противник движется от мира. Хотя я думал, что правильно переписал код playerMove()
, он отказывается обновлять положение врагов; они остаются в том же месте, что и после поворота.
Это drawWorld()
функция:
void drawWorld(node* array){
int i;
for (i=0;i<100;i++){
if (array[i].player==true)
cout << "P";
else if (array[i].trap==true)
cout << "T";
else if (array[i].enemy==true)
cout << "E";
else if (array[i].treasure==true)
cout << "X";
else if (array[i].player==true && array [i].treasure==true)
cout << "W";
else if ((array[i].player==true && array[i].trap==true) || (array[i].player==true && array[i].enemy==true))
cout << "L";
else {
cout << "O";
}
if ((i+1 % 10) == 0){
cout << endl;
}
}
cout << endl << endl;
}
Он рисует мировой штраф, за исключением того, что он не будет переносить текст каждые десять символов, как это ясно сказано сделать. Я не могу понять, что мне здесь не хватает.
Наконец, это endCheck()
функция:
bool endCheck(node* array){
int i;
for (i=0;i<100;i++){
if (array[i].player==true && array[i].treasure==true){
cout << "You found the treasure and now enjoy a life of unmitigated opulence." << endl;
return true;
}
else if (array[i].player==true && array[i].trap==true){
cout << "You fell into a conspicuous trap and became tiger food." << endl;
return true;
}
else if (array[i].player==true && array[i].enemy==true){
cout << "You were captured alive by angry natives and enjoyed as part of their New Year's feast." << endl;
return true;
}
else
return false;
}
}
Это просто не выполняется вообще. Я могу переместить игрока в ловушку, и ничего не происходит.
Эти проблемы невероятно расстраивают, потому что я просто не могу понять, что не так с кодом. Я знаю, что сообщение длинное, но если кто-нибудь может указать, что не так, то это будет очень признательно. Также следует отметить, что я искал ответы, прежде чем публиковать это, но поскольку я считаю, что проблемы являются неотъемлемой частью моего кода, я не смог найти никаких полезных ответов.
Какие функции вы говорите? – ameyCU
TL; DR. Постройте пример *** MINIMAL ***. –
Я не совсем уверен, как я мог бы построить что-нибудь более минимальное, чем это. Весь код, который я опубликовал, имеет значение. –