这是有效的Tic Tac Toe获胜条件检查功能吗?
我正试着做一个抽签游戏的条件检查程序来宣布玩家何时获胜。我已经创建了如下所示的函数。然而,当我调用它并尝试应用获胜条件时,什么都没有发生。我知道这是一个乏味的功能,但我对如何使其有效和高效感到困惑 功能:这是有效的Tic Tac Toe获胜条件检查功能吗?,c,arrays,function,if-statement,multidimensional-array,C,Arrays,Function,If Statement,Multidimensional Array,我正试着做一个抽签游戏的条件检查程序来宣布玩家何时获胜。我已经创建了如下所示的函数。然而,当我调用它并尝试应用获胜条件时,什么都没有发生。我知道这是一个乏味的功能,但我对如何使其有效和高效感到困惑 功能: int checker_o(char aray[3][3]){ if(aray[0][0]=='O'&& aray[0][1]=='O'|| aray[0][2]=='O'){ system("cls"); pr
int checker_o(char aray[3][3]){
if(aray[0][0]=='O'&& aray[0][1]=='O'|| aray[0][2]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 1;
}
if(aray[1][0]=='O'&& aray[1][1]=='O' && aray[1][2]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 1;
}
if(aray[2][0]=='O'&& aray[2][1]=='O'&& aray[2][2]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 1;
}
if(aray[0][0]=='O'&& aray[1][0]=='O' && aray[2][0]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 1;
}
if(aray[0][1]=='O'&& aray[1][1]=='O' && aray[2][1]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 1;
}
if(aray[0][2]=='O'&& aray[1][2]=='O' && aray[2][2]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 1;
}
if(aray[0][0]=='O'&& aray[1][1]=='O' && aray[2][2]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 1;
}
if(aray[0][2]=='O'&& aray[1][1]=='O' && aray[2][0]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 1;
}
}
完整代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void map(char a[3][3]){
int row, column;
for(row=0;row<3;row++){
for(column=0;column<3;column++){
printf ("%c ", a[row][column]);
}
printf("\n \n \n \n \n");
}
}
float getRand() {
return ((rand() / (RAND_MAX+1.0))*8)+1;
}
int control(int ui, int kb){
if (kb=='b'){
ui--;
}
if(kb=='c' && 0<ui &&ui<4){
ui+=5;
}
else{
if(kb=='c' && 3<ui &&ui<7){
ui--;
}
else{
if(kb=='c' && 6<ui &&ui<10){
ui-=7;
}
}
}
return ui;
}
int checker_o(char aray[3][3]){
if(aray[0][0]=='O'&& aray[0][1]=='O'&& aray[0][2]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 0;
}
if(aray[1][0]=='O'&& aray[1][1]=='O' && aray[1][2]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 0;
}
if(aray[2][0]=='O'&& aray[2][1]=='O'&& aray[2][2]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 0;
}
if(aray[0][0]=='O'&& aray[1][0]=='O' && aray[2][0]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 0;
}
if(aray[0][1]=='O'&& aray[1][1]=='O' && aray[2][1]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 0;
}
if(aray[0][2]=='O'&& aray[1][2]=='O' && aray[2][2]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 0;
}
if(aray[0][0]=='O'&& aray[1][1]=='O' && aray[2][2]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 0;
}
if(aray[0][2]=='O'&& aray[1][1]=='O' && aray[2][0]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 0;
}
}
int checker_x(char aray[3][3]){
if(aray[0][0]=='X'&& aray[0][1]=='X'&& aray[0][2]=='X'){
system("cls");
printf("Player 'X' Wins!");
getchar();
return 0;
}
if(aray[1][0]=='X'&& aray[1][1]=='X' && aray[1][2]=='X'){
system("cls");
printf("Player 'X' Wins!");
getchar();
return 0;
}
if(aray[2][0]=='X'&& aray[2][1]=='X'&& aray[2][2]=='X'){
system("cls");
printf("Player 'X' Wins!");
getchar();
return 0;
}
if(aray[0][0]=='X'&& aray[1][0]=='X' && aray[2][0]=='X'){
system("cls");
printf("Player 'X' Wins!");
getchar();
return 0;
}
if(aray[0][1]=='X'&& aray[1][1]=='X' && aray[2][1]=='X'){
system("cls");
printf("Player 'X' Wins!");
getchar();
return 0;
}
if(aray[0][2]=='X'&& aray[1][2]=='X' && aray[2][2]=='X'){
system("cls");
printf("Player 'X' Wins!");
getchar();
return 0;
}
if(aray[0][0]=='X'&& aray[1][1]=='X' && aray[2][2]=='X'){
system("cls");
printf("Player 'X' Wins!");
getchar();
return 0;
}
if(aray[0][2]=='X'&& aray[1][1]=='X' && aray[2][0]=='X'){
system("cls");
printf("Player 'X' Wins!");
getchar();
return 0;
}
}
int main(){
int r,c,ui,cntr,cntr2,ran,g,x;
char kb, aray[3][3]={{'.','.','.'},{'.','.','.'},{'.','.','.'}};
srand( time(NULL) );
getRand();
map(aray);
printf("Which keyboard method would u prefer? \n \n \n");
printf("(a)\t \t (b)\t \t (c)\n \n easy \t \t mobile \t #Pad \n \n 0 1 2 \t \t 1 2 3 \t \t 7 8 9\n \n");
printf(" 3 4 5 \t \t 4 5 6 \t \t 4 5 6 \n \n 6 7 8 \t \t 7 8 9 \t \t 1 2 3 \n \n \n");
scanf("%c", &kb);
system("cls");
map(aray);
do{
printf("Your Move! \n \n");
scanf("%i", &ui);
ui=control(ui,kb);
r=ui/3;
c=ui%3;
if(aray[r][c]=='X'|| aray[r][c]=='O'){
printf("'X/O' Already exists there \n");
getchar();
getchar();
return 0;
}
else{
aray[r][c]='X';
system("cls");
map(aray);
checker_x(aray);
}
ran=getRand();
g=ran/3;
x=ran%3;
if(aray[g][x]=='.'){
aray[g][x]='O';
system("cls");
map(aray);
}else{
do{
ran=getRand();
g=ran/3;
x=ran%3;
}while (aray[g][x]!='.');
aray[g][x]='O';
system("cls");
map(aray);
checker_o(aray);
}
} while (checker_x(aray)!=1 || checker_o(aray)!=1);
getchar();
}
#包括
#包括
#包括
空图(字符a[3][3]){
int行,列;
对于(row=0;row毕竟是if语句)您需要放置语句
return 0;
if (aray[0][0]=='O'&& aray[0][1]=='O'|| aray[0][2]=='O'){
^^^
否则,函数具有未定义的行为
这句话你也有拼写错误
return 0;
if (aray[0][0]=='O'&& aray[0][1]=='O'|| aray[0][2]=='O'){
^^^
一定有
if (aray[0][0]=='O'&& aray[0][1]=='O'&& aray[0][2]=='O'){
^^^
考虑到这段代码
system("cls");
printf("Player 'O' Wins!");
getchar();
return 1;
这是重复的
您可以重写函数,使此代码段在函数中只出现一次
比如说
const size_t N = 3;
int winner = 0;
for ( size_t i = 0; !winner && i < N; i++ )
{
size_t j = 0;
while ( aray[i][j] == 'O' && j < N ) j++;
winner = j == N;
}
//...
if ( winner )
{
system("cls");
printf("Player 'O' Wins!");
getchar();
}
return winner;
const size\u t N=3;
int=0;
对于(大小i=0;!winner&&i
您可以为要检查的字符再引入一个参数。最好不要在程序中使用幻数和其他文字。为它们指定有意义的名称
考虑到最好使用英文单词array
而不是aray
你所写的不是一种特别好的书写方式。这四行
system("cls");
printf("Player 'O' Wins!");
getchar();
return 1;
重复-可能它们应该在一个函数中。对于'O'
,您有一个很长的测试集;我猜想,对于'X'
,您将有一个几乎相同的测试集。您应该能够使用一个传递给'O'
或'X'
的函数作为参数,并确定它是否成功。您还需要然后你可以决定这8个测试是否可以改进;这可能不值得这么做
您还可以使用:
if ((row1 win) || (row2 win) || … || (top-right to bottom-left win))
{
report win
}
(在一个if
语句中有8个测试,每个测试与下一个测试之间用|
分隔,在这种情况下,您可能只使用一个代码块来报告胜利。尽量避免代码中重复;这是一个bug潜入的机会
同样,如果没有win,您应该从函数返回0
这些变化导致:
int check_winner(char aray[3][3], char x_o)
{
assert(x_o == 'X' || x_o == 'O');
if ((aray[0][0] == x_o && aray[0][1] == x_o && aray[0][2] == x_o) ||
(aray[1][0] == x_o && aray[1][1] == x_o && aray[1][2] == x_o) ||
(aray[2][0] == x_o && aray[2][1] == x_o && aray[2][2] == x_o) ||
(aray[0][0] == x_o && aray[1][0] == x_o && aray[2][0] == x_o) ||
(aray[0][1] == x_o && aray[1][1] == x_o && aray[2][1] == x_o) ||
(aray[0][2] == x_o && aray[1][2] == x_o && aray[2][2] == x_o) ||
(aray[0][0] == x_o && aray[1][1] == x_o && aray[2][2] == x_o) ||
(aray[0][2] == x_o && aray[1][1] == x_o && aray[2][0] == x_o))
{
system("cls");
printf("Player '%c' Wins!\n", x_o);
getchar();
return 1;
}
return 0;
}
你可以称之为:
if (check_winner(board, 'X') || check_winner(board, 'O'))
break;
<>我想你应该考虑改写这个函数,这样它只检查和不报告结果:
int check_winner(char aray[3][3], char x_o)
{
assert(x_o == 'X' || x_o == 'O');
if ((aray[0][0] == x_o && aray[0][1] == x_o && aray[0][2] == x_o) ||
(aray[1][0] == x_o && aray[1][1] == x_o && aray[1][2] == x_o) ||
(aray[2][0] == x_o && aray[2][1] == x_o && aray[2][2] == x_o) ||
(aray[0][0] == x_o && aray[1][0] == x_o && aray[2][0] == x_o) ||
(aray[0][1] == x_o && aray[1][1] == x_o && aray[2][1] == x_o) ||
(aray[0][2] == x_o && aray[1][2] == x_o && aray[2][2] == x_o) ||
(aray[0][0] == x_o && aray[1][1] == x_o && aray[2][2] == x_o) ||
(aray[0][2] == x_o && aray[1][1] == x_o && aray[2][0] == x_o))
return 1;
return 0;
}
实际上可以简化为:
int check_winner(char aray[3][3], char x_o)
{
assert(x_o == 'X' || x_o == 'O');
return ((aray[0][0] == x_o && aray[0][1] == x_o && aray[0][2] == x_o) ||
(aray[1][0] == x_o && aray[1][1] == x_o && aray[1][2] == x_o) ||
(aray[2][0] == x_o && aray[2][1] == x_o && aray[2][2] == x_o) ||
(aray[0][0] == x_o && aray[1][0] == x_o && aray[2][0] == x_o) ||
(aray[0][1] == x_o && aray[1][1] == x_o && aray[2][1] == x_o) ||
(aray[0][2] == x_o && aray[1][2] == x_o && aray[2][2] == x_o) ||
(aray[0][0] == x_o && aray[1][1] == x_o && aray[2][2] == x_o) ||
(aray[0][2] == x_o && aray[1][1] == x_o && aray[2][0] == x_o));
}
我不确定我是否会向您推荐。但是您可以使用:
if (check_winner(board, player))
{
system("cls");
printf("Player '%c' Wins!\n", player);
getchar();
}
但是你也可以使用这个功能来测试一个可能的动作是否是一个成功的动作,而不需要在你准备好之前大声喊出来
此外,如果调试有困难,一个步骤是确保电路板(阵列)包含您期望的内容,因此也要有打印功能来显示电路板:
static void dump_board(char aray[3][3])
{
for (int i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
putchar(aray[i][j]);
putchar('\n');
}
}
static void dump_板(字符[3][3])
{
对于(int i=0;i<3;i++)
{
对于(j=0;j<3;j++)
putchar(aray[i][j]);
putchar('\n');
}
}
并用它来检查你所得到的是正确的。还要注意,8个测试之间的相似性和差异是如何清晰地显示出来的。你可以很容易地发现问题,比如一个|
,那里应该有一个&&
,因为它会像拇指酸痛一样突出。可能有助于在每个if b中删除相同的代码通过将它们移出一个单独的函数来锁定,以使其更干净、更易于阅读。重构模式应该更容易看到常见的条件……您还可以对
循环(检查行、检查列、检查对角线)进行三次,并比较array[i][0]==array[i][1]==array[i][2]
然后就是printf(“玩家\'%c\'赢!”,数组[i][0])
了……我在Uni上的是一门编码课程,而且我还没有学习你上面提到的大部分内容,非常感谢你的清晰说明。@cCode初学者我只包括foops。typename说明符size\t你可以用int代替。