所以我正在尝试编写一个解决“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;
}
}
根本就没有执行。我可以将玩家移到陷阱上,但没有任何反应。
这些问题非常令人沮丧,因为我根本无法辨别出代码有什么问题。我知道帖子很长,但是如果有人能指出什么是错的,那就非常感激。还应该注意的是,我在发布之前搜索了答案,但是因为我认为问题是我的代码所固有的,所以我无法找到任何可用的答案。
答案 0 :(得分:2)
您将在第一次迭代结束时返回。所以它只检查第一个字段然后返回false(如果第一个字段中没有玩家和宝藏/陷阱/敌人)。
将您的功能更改为:
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;
}
}
return false;
}
在返回false之前,您必须检查所有可能的字段,表示没有冲突。
答案 1 :(得分:2)
在enemiesMoves()
,您正在检查if(n = 1)
,我确定您的意思是if(n == 1)
。
这样做:
....
n = rand() % 4 + 1;
if (n == 1){
.....
此外,n == 1
案例被检查两次!进入if
然后进入最后else if
。
要使rand()
函数在每次运行时实际生成随机数,请先使用srand()
初始化随机种子,如下所示:
/* initialize random seed: */
srand (time(NULL));
n = rand() % 4 + 1;