我正在尝试用c语言创建一个蛇和梯子游戏。在蛇与梯子游戏中,有梯子可以把你带到棋盘上,也有蛇可以把你带到棋盘上。我正在制作一个项目,其中我的板每行只能有一个向上的瓷砖(梯子)和一个向下的瓷砖(蛇)。我能够创建两个名为 up_num 和 down_num 的函数,它们为每个数组随机生成 6 个值,以确保我的棋盘中只有一个向上的图块和一个向下的图块。然而,我的问题是,有时向上的图块与向下的图块具有相同的值。这意味着有时 up 数组中的元素之一会作为 down 数组中的元素出现。我正在尝试创建一个函数来检查两个名为 up[][] 和 down[][] 的数组。它们之所以是 2D 数组,是因为我希望一个数字是让玩家在棋盘上上下移动的图块,而另一个数字是玩家将着陆的图块。
这是我迄今为止所做的检查功能。
void check(int up[][2], int down[][2])
{
printf("\n\n");
int h = 0, i, j, k, l, m = 0;
int check[12];
int check_up[6];
int check_down[6];
int counter = 0;
for (k = 0; k < 6; k++) {
if(counter == 0) {
h = 0;
for (i = 0; i < 3; i++) {
for(j = 0; j < 2; j++) {
check_up[h++] = up[i][j];
check_down[h++] = down[i][j];
}
}
}
counter++;
for(j = 0; j < 6; j++) {
if (check_up[k] == check_down[j]) {
up_num(up);
down_num(down);
k = 0;
counter = 0;
}
}
}
for(i = 0; i < 3; i++) {
for (j = 0; j < 2; j++) {
printf("%d, ", up[i][j]);
}
printf("\n");
}
printf("\n\n");
for(i = 0; i < 3; i++) {
for (j = 0; j < 2; j++) {
printf("%d, ", down[i][j]);
}
printf("\n");
}
}
有时我仍然会得到重复的值,但我想不出解决问题的方法。我尝试创建一个嵌套循环,只要找到重复值就会重新启动,然后调用之前创建的两个函数来再次生成随机值,这将确保我的板上只有一个向上的图块和一个向下的图块。我确保检查我创建的两个函数是否有问题,但过了一会儿我发现不是。我只是在检查二维数组的值以确保一个数组中的元素不会出现在另一个数组中时遇到问题。
我尝试通过为蛇和梯子创建二维数组来测试您的代码,但是缺少函数信息来获得干净的编译(例如,没有“up_num()”和“down_num()”函数的定义) 。通过尝试解释您的最终目标是不在同一行中放置多个梯子或蛇,并且也不将梯子和蛇放在同一位置,执行这些测试的代码实际上似乎过于复杂。
我对这个测试函数应该做什么的解释可能偏离了基础,但以下是该函数的重构版本以及一个“主”程序,该程序为蛇和梯子构建了一个简单的二维数组,然后测试一些不同的场景。
#include <stdio.h>
#include <stdlib.h>
#define ROWS 6 /* To give flexibility to board size and design */
#define COLS 12
int check(int up[ROWS][COLS], int down[ROWS][COLS])
{
int counterLadder = 0;
int counterSnakes = 0;
/* Testing for duplicate ladders and/or snakes in a row */
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
if (up[i][j] == 1)
counterLadder++;
if (counterLadder > 1)
{
printf("More than one ladder was found in row %d\n", i);
return 1;
}
if (down[i][j] == 1)
counterSnakes++;
if (counterSnakes > 1)
{
printf("More than one snake was found in row %d\n", i);
return 1;
}
}
}
/* Checking to see that a ladder and a snake do not exist at the same location */
counterLadder = 0;
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
if ((up[i][j] == down[i][j]) && (up[i][j] == 1))
{
counterLadder++;
printf("A ladder and a snake are located at row %d, column %d\n", i, j);
return 1;
}
}
if (counterLadder > 1)
return 1;
}
printf("All clear\n");
return 0;
}
int main() /* Basically a simple test harness program to build and then test out location issues with the ladder and snake locations */
{
int Ladder[ROWS][COLS], Snakes[ROWS][COLS];
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
Ladder[i][j] = 0;
Snakes[i][j] = 0;
}
}
if(check(Ladder, Snakes) == 1)
printf("Some type of error occurred - retry\n");
Ladder[2][4] = 1;
Ladder[2][9] = 1;
if(check(Ladder, Snakes) == 1)
printf("Some type of error occurred - retry\n");
Ladder[2][9] = 0;
Snakes[2][4] = 1;
if(check(Ladder, Snakes) == 1)
printf("Some type of error occurred - retry\n");
return 0;
}
对于重构代码的长度,我们深表歉意,但我想为您提供整个内容,以供您深思。当我运行此示例时,创建了以下终端输出。
craig@Vera:~/C_Programs/Console/SnakesAndLadders/bin/Release$ ./SnakesAndLadders
All clear
More than one ladder was found in row 2
Some type of error occurred - retry
A ladder and a snake are located at row 2, column 4
Some type of error occurred - retry
正如我所说,我可能在测试中遗漏了一些微妙的问题,但这似乎简化了重复和重叠的测试。将其视为您的休闲。