#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void OriginBoard(char board[ROW][COL], int row, int col)//1st初始化棋盘函数
{
int i = 0;
int j = 0;
for (i = 0;i < row;i++)
{
for (j = 0;j < col;j++)
{
board[i][j] = ' ';//初始化棋盘放空格
}
}
}
void PrintBoard(char board[ROW][COL], int row, int col)//2nd将棋盘打印出来
{
int i = 0;
int j = 0;
for (i = 0;i < row;i++)
{
for (j = 0;j < col;j++)
{
printf(" %c ", board[i][j]);
if (j < col)
{
printf("|");
}
}//打印数据
printf("\n");//勿忘
if (i < row - 1)
{
for (j = 0;j < col;j++)
{
if (j < col)
{
printf("---");
printf("|");
}
}
}//打印分割行
printf("\n");//一开始一直卡这里了卧槽,忘记打印完分割行也要换行了(要根据错误的形状来推错误的原因!!)
}
}
void Player(char board[ROW][COL], int row, int col)//3rd玩家下棋
{
printf("玩家下棋,请输入诸如1*1这样的坐标,你的棋子是*\n");
int i = 0;
int j = 0;
scanf("%d*%d", &i, &j);
while (1)
{
if (i >= 1 && j>=1&& i <= row && j <= col && board[i - 1][j - 1] == ' ')//你不加个循环万一输入错误就没了
{
board[i - 1][j - 1] = '*';
break;//跳出去就好了
//PrintBoard(board, row, col);写game里
}
else
{
printf("坐标非法,请重新输入\n");
}
}
}
void Computer(char board[ROW][COL], int row, int col)//4th电脑下棋
{
printf("电脑下棋\n");
row = ROW;
col = COL;
int i = rand() % row;
int j = rand() % col;
//scanf("%d*%d", &i, &j); 你md又忘了,scanf是手动输入,你要电脑自己下就不用scanf了
while (1)
{
if (i>=1&&j>=1&&i < row && j < col && board[i][j] == ' ')
{
board[i][j] = '#';
break;
//PrintBoard(board, row, col);
}
}
}
//玩家赢返回*
//电脑赢返回#
//平局返回Q
//继续返回C
int Isfull(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0;i < row;i++)
{
for (j = 0;j < col;j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
char WOL(char board[ROW][COL], int row, int col)//5th判断输赢:分横竖斜
{
int i = 0;
for (i = 0;i < row;i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2]&&board[i][1]!=' ')//写横的
return board[i][1];
}
int j = 0;
for (j = 0;j < col;j++)//写竖的
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
return board[1][j];
}
//两种斜的
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
return board[1][1];
if (board[1][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
return board[1][1];
//平局逻辑
if (Isfull(board, row, col))
{
return 'Q';
}
return 'C';
}
void GAME()
{
//初始化棋盘(就是个二维的数组)
char board[ROW][COL];
int row = ROW;
int col = COL;
int i = 0;
int j = 0;
OriginBoard(board,row,col);
PrintBoard(board, row, col);
char ret = 0;//char ret = WOL(board, row, col);//我懂了,难怪返回空格,因为你一开始就初始化它是空格了
while (1)//只要棋盘没满就一直循环下
{
Player(board, row, col);
PrintBoard(board, row, col);//(少了的)
ret = WOL(board, row, col);//chatgpt发现的,你没有及时更新ret的值
if (ret != 'C')
{
break;
}
//判断输赢(少了的)
Computer(board, row, col);
//你写这个干嘛WOL(board, row, col);
PrintBoard(board, row, col);
ret = WOL(board, row, col);//chatgpt发现的,你没有及时更新ret的值
if (ret != 'C')
{
break;
}
//判断输赢(每次下完棋判断输赢)
}
if (ret=='*')
printf("玩家赢\n");
else if (ret=='#')
printf("电脑赢\n");
else
printf("平局\n");
PrintBoard(board, row, col);
}
为什么我的三子棋下到一半就电脑下棋就不会下了,目前只有玩家赢的情况可以正常运行,真看不出来问题了