我正在尝试制作游戏Chomp。我已经过了一半但很困难。
游戏将有5种不同的功能。不允许使用指针和结构。
这是我走了多远,我已经有一些问题已经解决了一段时间,但我无法弄清楚如何自己解决它们,所以我想我可以在这里得到一些帮助。
BUGS
a)如果您先输入 2 2 ,然后输入 2 1 ,则会说该位置已被吃掉,即使这是一个非常有效的吃饭位置。而不是检查位置是否!='O'我应该检查它是否是 =='O',但这不会起作用,因为在 check_move()循环行和col并不总是 O ...
b)如果您输入的位置不在矩阵内(即 20 20 ),您将获得两行错误。我不明白为什么。当然我只想显示一个错误,而不是两个。
c)如果您输入已经被吃过的位置,由于循环播放的循环,您将多次收到错误“已经被吃掉!”打印几次。
问题
a)在玩家1 和玩家2 之间进行切换的最佳方式是什么?每当玩家进行有效移动时,我就会想到一个会增加 +1 的int。然后我将检查int的值是奇数还是偶数。奇数=玩家1和偶数=玩家2或副verca。但这不起作用,因为我不允许拥有比现在更多的全局变量。我只允许从一个函数返回一个值( check_move())。
#include <stdio.h>
int height = 4;
int width = 10;
char matrix[4][10];
void initialize()
{
for(int row = 0; row < height; row++)
for(int col = 0; col < width; col++)
matrix[row][col] = 'O';
}
void print_board()
{
printf("\n\n");
for(int row = 0; row < height; row++)
{
for(int col = 0; col < width; col++)
{
printf("%c", matrix[row][col]);
}
printf("\n");
}
printf("\n\n");
}
void get_move(int player, int input[])
{
printf("Player %d, make your move: ", player);
scanf("%d %d", &input[0], &input[1]);
}
int check_move(int position[])
{
int row = position[0];
int col = position[1];
int status = 1;
if(row <= height && col <= width)
{
for(row; row <= height; row++)
{
for(col; col <= width; col++)
{
// Checks if position already has been eaten
if(matrix[row-1][col-1] != 'O')
{
printf("Already eaten!\n");
status = 0;
}
}
}
}
else if(row >= height || col >= width)
{
printf("Your move must be inside the matrix!\n");
status = 0;
}
return status;
}
void update_board(int x, int y)
{
for(int xi = x; xi <= 10; ++xi)
{
for(int yi = y; yi <= 10; ++yi)
matrix[xi-1][yi-1] = ' ';
}
}
int main(void)
{
int player = 1;
int position[2];
initialize();
print_board();
while(1){
get_move(player, position);
check_move(position);
while(check_move(position) != 1)
{
printf("Try again!\n\n");
get_move(player, position);
}
update_board(position[0], position[1]);
print_board();
}
getchar();
getchar();
getchar();
return 0;
}
答案 0 :(得分:1)
错误a和c:
您的check_move
功能有误,您只应测试所播放的位置是否被吃掉,其他位置的状态无关:
int check_move(int pos[])
{
if(pos[0] < 1 || pos[0] > height || pos[1] < 1 || pos[1] > width)
{
printf("Your move must be inside the matrix!\n");
return 0;
}
if(matrix[ pos[0] - 1 ][ pos[1] - 1 ] != 'O' ) {
printf("Already eaten!\n");
return 0;
}
return 1;
}
错误b:
您收到错误消息两次,因为您在主电话中呼叫check_move
两次:
check_move(position);
while(check_move(position) != 1)
只需删除对check_move()
无用的第一次通话。
问题a:
您可以通过更新主要内容中的变量player
来切换玩家:
player = (player + 1) % maxNumberOfPlayer;
这将从0
转到maxNumberOfPlayer - 1
,因此您可以使用printf("Player %d, make your move: ", player + 1);
来获得更加用户友好的输出。此外,如果maxNumberOfPlayer = 2
,player = (player + 1) % 2;
等同于player = !player
。
答案 1 :(得分:0)
在main
中,在你的while循环中添加:
player = !player;
将在{0}和0之间切换player
。