我一直试图做这个程序一段时间但我出于某种原因出了问题。 我应该制作一个程序,我有一个8 * 8的2D阵列,鼠标位于一个岛屿的中心,周围是1 * 1的2D水阵和一只位于另一个固定位置的猫(远离鼠标)允许鼠标每次移动一个瓷砖,不能沿对角线移动。 该移动由随机数发生器确定,该发生器限于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;
}
答案 0 :(得分: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
}
答案 1 :(得分:-1)
有一些问题:你说程序应该运行几次,但实际上只运行一次。最糟糕的是,当鼠标到达猫,桥或淹死时,程序会退出:
return 0;
如果你想运行它两次(或你想要多次运行),你应该像
那样循环for (int a = 0;a < 2;a++)
在变量声明之后和网格初始化之前。这样,每次运行循环时,它都会重新初始化除计数变量之外的所有内容。
然后,您应该用return(0)
替换break;
,因此每次发生某些事情时内部循环都退出但程序仍在运行,最后您将使用您的计数输出输出打印。 / p>
哦,我刚刚看到你打电话给direction
,第三和第四个paarmeters固定为“4”。
......哦......鼠标根本不动。您还应该在网格中更新其位置。