2017-02-10 81 views
0

我一直在试图做这个程序一段时间,但我有一个问题,出于某种原因。 我应该做一个程序,我有一个8 * 8的2D阵列,鼠标位于1 * 1二维水阵列和一个位于另一个固定位置(远离鼠标)允许鼠标每移动一个瓷砖并且不能对角移动。 运动由一个随机数发生器决定,它限制在0,1,2和3(每个数字代表一个方向)。鼠标被允许100次移动,然后游戏停止,当鼠标碰到猫(死亡),穿过位于右侧中间的一座桥(逃生)或进入水中(淹没)时,它也停止程序应该运行几次并记录死亡人数,逃跑次数和溺死次数。但是每次我尝试运行该程序时,我都会收到零死亡,零逃逸和零淹没。 这里是我的代码:为什么我的代码不能记录游戏的结果?

#include<iostream> 
#include<stdlib.h> 
#include <time.h> 
using namespace std; 
#define N 9 
#define M 9 
int direction(int x, int A[M][N], int row, int col) 
{ 
    int m; 
    if (x == 0) 
     m = A[row - 1][col]; //North 
    if (x == 1) 
     m = A[row+1][col]; //South 
    if (x == 2) 
     m = A[row][col - 1]; //West 
    if (x == 3) 
     m = A[row][col + 1]; //East 
    return m; 
} 

int main() 
{ 

    int v, S1, S2, S3, S4; 
    int Mouse, Cat, Bridge; 
    int death = 0, escape = 0, drown = 0; 
    int A[M][N]; 
    for (int a = 0;a < 10;a++) 
    { 
     for (int i = 0;i < M;i++) 
      S1 = A[i][0] = 4; 
     for (int i = 0;i < M;i++) 
      S2 = A[i][8] = 4; 
     for (int j = 0;j < N;j++) 
      S3 = A[0][j] = 4; 
     for (int j = 0;j < N;j++) 
      S4 = A[8][j] = 4; 
     for (int i = 1;i < M;i++) 
     { 
      for (int j = 1;j < N;j++) 
       A[i][j] = 0; 
     } 
     Mouse = A[4][4] = 1; //mouse 
     Cat = A[5][2] = 2; //cat 
     Bridge = A[4][8] = 3; //bridge 
     srand((unsigned)time(NULL)); 
     for (int b = 0;b < 100;b++) 
     { v = rand() % 4; 
      int m=direction(v, A, 4, 4); 
      if (m == Cat) 
      { 
       death++; 
       break; 
      } 
      else if (m == Bridge) 
      { 
       escape++; 
       break; 
      } 
      else if (m == S1 || m == S2 || m == S3 || m == S4) 
      { 
       drown++; 
       break; 
      } 
     } 
    } 
    cout << "The mouse died " << death << " times and escaped " << escape << " times and drowned " << drown << " times" << endl; 
    return 0; 
    } 
+1

鼠标可能选择留在岛上。我可以理解,因为其他选择可能是致命的。 – dlatikay

+0

当鼠标死亡时,你是否真的想结束程序而不打印任何东西?如果没有,你需要摆脱循环中的一些'return 0;'。 – drescherjm

+0

使自己熟悉调试器,并逐步执行代码。您将能够轻松发现并修复大部分语义错误。如果C++特定的东西仍然存在,请编辑您的帖子。 – dlatikay

回答

-1

存在一些问题:你说的程序运行应几次,但实际上它运行一次。最糟糕的是,当鼠标到达猫,桥,或淹死,程序退出时:

return 0; 

如果你想运行两次(或你想要的很多次),你应该把一个循环如

for (int a = 0;a < 2;a++) 

刚刚在变量声明之后和网格初始化之前。这样,每次运行循环时,它都会重新初始化除计数变量之外的所有内容。 然后,你应该用代替break;,这样内部循环每次发生时都会退出,但程序仍然运行,最后你会用输出打印输出结果。

哦,我刚刚看到你打电话给direction,第三和第四个参数表固定为“4”。

......哦......并且鼠标根本不动。您还应该更新网格中的位置。

+0

感谢您的回复。我如何更新鼠标的位置?还有我使用的功能是否正确? (我希望这个功能可以改变鼠标的位置) – FlareM

+0

你的意思是“方向”功能吗?这只是检查鼠标想要移动的框中的内容,并没有问题。您应该使用鼠标x和y位置声明两个新的int变量,并在所有使用固定4,4的位置使用它们。然后在循环结束时更新鼠标所在的网格位置,更改鼠标的x(或y)值,重新更新网格1. – Dippi

+0

对不起,但我不太了解你的点。 – FlareM

0

鼠标不会从初始位置移动,并且鼠标附近的地形是安全的。所以什么都不会发生。 在代码中替换Cicle

int x = 4,y=4;  // Mouse coords 
    for (int b = 0;b < 100;b++) 
    { v = rand() % 4; 
     int m=direction(v, A, x, y); 
     if (m == Cat) 
     { 
      death++; 
      break; 
     } 
     else if (m == Bridge) 
     { 
      escape++; 
      break; 
     } 
     else if (m == S1 || m == S2 || m == S3 || m == S4) 
     { 
      drown++; 
      break; 
     } 
     // Nothing happened, move the mouse 
     A[x][y] = 0;   // Clear the actual mouse location 
     if(v==0) x--; 
     if(v==1) x++; 
     if(v==2) y--; 
     if(v==4) y++; 
     A[x][y] = 1;  // Mark the mouse on the map 

    } 
+0

ohh谢谢@恩佐,我现在明白了,但该计划仍然没有记录死亡人数,逃跑和溺水事件的最终数字? – FlareM

+0

现在完美,谢谢@Enzo,但是当我运行该程序时,它有时会给我一个调试错误,说“运行时检查失败#2-S”有什么想法可能导致这种情况? – FlareM

+0

也出于某种原因,结果是所有的死亡或所有的淹死(超过100次运行),我有一个“逃生”代码的问题,或者它只是一个渺茫的机会,鼠标逃脱? – FlareM

相关问题