编写一个 C 程序,生成跨 10x10 数组的随机游走。最初,该数组将仅包含点字符。程序必须随机地从一个元素“行走”到另一个元素,始终向上、向下、向左或向右移动一步。程序访问的元素将按照访问的顺序用字母 A 到 Z 进行标记。
它不会走到已经分配了字母的元素(被阻止的元素)。如果所有四个方向都被阻止,则程序必须终止。
我为上述问题编写了代码,但有时输出只是空白,它只是显示黑屏。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
char visited = 'A';
char a[10][10];
// assigning value '.' to array elements
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++)
a[i][j] = '.';
// the initial is set for the player.
int playeri, playerj;
srand(time(0));
// assigning numbers between 0-9
playeri = rand() % 10; playerj = rand() % 10;
a[playeri][playerj] = visited++;
int move;
// now to move the player
while (visited <= 'Z') {
// to generate numbers between 1-4
move = rand() % 4 + 1;
// to move up
if (move == 1) {
if (a[playeri - 1][playerj] == '.' && playeri != 0) {
playeri = playeri - 1;
a[playeri][playerj] = visited++;
}
}
// to move down
else if (move == 2) {
if (a[playeri + 1][playerj] == '.' && playeri != 9) {
playeri = playeri + 1;
a[playeri][playerj] = visited++;
}
}
// to move right
else if (move == 3) {
if (a[playeri][playerj + 1] == '.' && playerj != 9) {
playerj = playerj + 1;
a[playeri][playerj] = visited++;
}
}
// to move left
else if (move == 4) {
if (a[playeri][playerj - 1] == '.' && playerj != 0) {
playerj = playerj - 1;
a[playeri][playerj] = visited++;
}
}
}
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
printf("%c", a[i][j]);
}
printf("\n");
}
}
我的猜测是程序陷入了无限循环,如果是这样,我该如何解决这个问题?
最佳答案
如果您访问数组 a
,您的程序将出现未定义的行为出界。当随机方向因到达 10x10 数组的边界而无法实现时,就会发生这种情况。为了避免这种情况,请更改条件顺序以首先检查索引,例如
if (playeri != 0 && a[playeri - 1][playerj] == '.') {
在某些情况下,您可能最终所处的位置没有带点的相邻位置,因此无法继续。如visited
在这种情况下不会增加,您的循环将不会终止。
额外检查至少有一个方向未被阻塞将修复无限循环,但这不是最佳解决方案。
当更多字段被阻止时,生成随机方向然后检查该方向是否可行的实现可能需要多次尝试。 尽管不太可能,您甚至可能会获得表示长期受阻的随机数字。
为了实现当所有方向都被阻止时终止程序的要求并改善当许多方向被阻止时的行为,我建议更改算法。
建议的算法:
- 检查所有4个方向是否可以行走,将所有可能的方向放入最多4个元素的数组中,并将可能的方向计为
n
。 (例如:如果可以向上、向下和向左,则数组将包含up
、down
、left
、(invalid)
。计数将为n = 3
。) - 如果
n == 0
(全部阻塞)终止循环 - 从
0
中获取一个随机数至n - 1
(例如:0
..2
) - 从数组中选择方向(例如:随机数
1
将选择down
) - 朝选定的方向移动(之前已经检查过可以)
关于c - 10X10 数组中的随机游走,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60986945/