gpt4 book ai didi

c - C 中的 Tic tac Toe 游戏在为对手找到随机数时陷入循环

转载 作者:行者123 更新时间:2023-11-30 20:30:50 26 4
gpt4 key购买 nike

我开始 C,我正在尝试与对手编写一个 tic tac toe,该对手搜索 1 到 9 之间的随机数,然后用“O”填充插槽。然而,当随机数检测到已占用的槽位时,它将继续填充其他空槽位,而不给玩家轮到的机会。我该如何解决这个问题?

我做了两个数组,一个用于游戏屏幕,一个用于插槽内存。

很抱歉,我无法删除代码,因为我认为这很重要,有没有更好的方法来做到这一点?如果我的写作风格有点令人困惑,我很抱歉,而且我认为其中存在不重要的变量。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

char values[3][4] = { // screen board
{46, 46, 46,'\n'},
{46, 46, 46,'\n'},
{46, 46, 46,'\n'}
};

double memory[3][4] = { // memory board to put values
{0, 0, 0,'\n'},
{0, 0, 0,'\n'},
{0, 0, 0,'\n'}
};

int player(int i, char values[3][4]) {
int input;

printf("enter position: ");
scanf("%i", &input);

int x = (((input) / 3.3) - 3) * -1; // important math to convert to num
int y = (input + 2) % 3; // important math to convert to num

if (memory[x][y] == 0) {
values[x][y] = 'X';
memory[x][y] = 1;

printf("%s", values);
getchar();
return 0;
getchar();
} else {
printf("Wrong!, choose another line\n");
printf("%s", values);

getchar();

player(i, values);
}
}


int opponent(char values[3][4]) { //function opponent
int count = 0;
srand(time(NULL));

int random = (rand() % 9) + 1; // create random number

for (count = 0; count < 9; count++) {
int x = (((random) / 3.3) - 3) * -1;
int y = (random + 2) % 3;

if (memory[x][y] == 0) { // if memory is empty, do the following, loop stucks here
values[x][y] = 'O';
memory[x][y] = 2;

printf("Opponent Move\n");
printf("%s", values);

count++;

return 0;
} else { // if memory is not 0, do this. Error starts here
getchar();
printf("Move is %i", random);

opponent(values); // it calls itself to do a loop,
}
}
}

int main() {
int input;
int i = 2;;

for (i = 2; i < 9; i++) {
player(i, values); //Player goes first
getchar();
opponent(values);
}
}

最佳答案

不要使用两个独立的内存,而是使用enum数组来表示游戏 map 。

enum Square { VACANT, X, O } squares[3][3], move = X;

根据The initialization of static variables in C初始化.

您可能需要一个函数来确定玩家是否获胜,

/* Checks if the player who's move it was won. */
static int is_win(void) {
return (squares[0][0]==move && squares[0][1]==move && squares[0][2]==move)||
(squares[1][0]==move && squares[1][1]==move && squares[1][2]==move)||
(squares[2][0]==move && squares[2][1]==move && squares[2][2]==move);
/* Etc. */
}

以及打印电路板的功能,

static const char letters[] = { '/', 'X', 'O' };

static void print_board(void) {
printf("%c %c %c\n%c %c %c\n%c %c %c\n",
letters[squares[0][0]], letters[squares[0][1]], letters[squares[0][2]],
letters[squares[1][0]], letters[squares[1][1]], letters[squares[1][2]],
letters[squares[2][0]], letters[squares[2][1]], letters[squares[2][2]]);
}

您拥有的代码通过函数的参数来隐藏全局状态。这很令人困惑。考虑一下您是否需要参数来完成函数的工作。当一个人有在多个文件中定义的复杂状态时,最好有一个聚合游戏对象,但对于简单的游戏,我认为拥有一个全局状态就可以了。

不要玩到 7 步,而是使用简单的状态机来跟踪游戏状态。人们可以typedef函数(How do function pointers in C work?)playeropponent并将它们放入静态数组中,以大大简化游戏循环。考虑一下,

/* Move returns whether we should continue. */
typedef int (*Move)(void);

/* Implements Move. */
static int player(void) {
printf("player:\n");
/* FIXME: player move. */
return is_win() ? 0 : (move = O, 1);
}

/* Implements Move. */
static int opponent(void) {
printf("opp:\n");
/* FIXME: Chose randomly from all of it's allowed moves? */
return is_win() ? 0 : (move = X, 1);
}

static const Move states[] = { 0, &player, &opponent };

那么你的主要就是,

int main(void) {
while(states[move]()) print_board();
printf("%c wins.\n", letters[move]);
return 0;
}

编辑:肯定会出现平局的状态,也许是在没有剩余棋步的情况下。

关于c - C 中的 Tic tac Toe 游戏在为对手找到随机数时陷入循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53233270/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com