C语言三子棋(不知道是否有bug的版本)
—参考B站鹏哥C语言
void menu()
{
printf("**************************\n");
printf("***** 1.play 0.exit *****\n");
printf("**************************\n");
}
void game()
{
char ret = 0;
char board[ROW][COL] = {0};
//初始化棋盘
InitBoard(board,ROW,COL);
//打印棋盘
PrintBoard(board, ROW, COL);
while (1)
{
PlayerGame(board,ROW,COL);
PrintBoard(board, ROW, COL);
ret = IfWin(board,ROW,COL);
if (ret != 'c')
{
break;
}
ComputerGame(board, ROW, COL);
PrintBoard(board, ROW, COL);
ret = IfWin(board, ROW, COL);
if (ret != 'c')
{
break;
}
}
if (ret == '*')
{
printf("Player win!\n");
}
else if (ret == '#')
{
printf("Computer win!\n");
}
else if(ret=='d')
{
printf("The game is a draw!\n");
}
}
int main()
{
srand((unsigned int)time(NULL));
int enter;
do
{
enter = 0;
menu();
scanf("%d", &enter);
//也可以用switch
if (enter == 1)
{
printf("The game begins:>\n");
game();
}
else if (enter == 0)
{
printf("Game over!\n");
break;
}
else
printf("Typing error!\n");
} while (1);
return 0;
}
//初始化棋盘
void InitBoard(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++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
void PrintBoard(char board[ROW][COL], int row, int col)
{
int i;
int j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
//玩家下棋
void PlayerGame(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("Player play chess:>\n");
while (1)
{
printf("The coordinates of the choice:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("The location is already occupied!\n");
}
}
else
{
printf("Typing error!\n");
}
}
}
//电脑下棋
void ComputerGame(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("Player play chess:>\n");
while (1)
{
x = rand() % row;//随机出来的数为0-2
y = rand() % col;
if (board[x][y] == ' ')
{
break;
}
}
printf("The coordinates of the choice:");
printf("%d %d \n", x+1, y+1);
board[x][y] = '#';
}
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 IfWin(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
int num1 = 0;
int num2 = 0;
int num3 = 0;
int num4 = 0;
//判断行
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == board[i][j + 1] && board[i][j] != ' ')
{
num1++;
if (num1 == col-1)
{
return board[i][j];
}
}
else
{
break;
}
}
num1 = 0;
}
//判断列
for (j = 0; j < col; j++)
{
for (i = 0; i < row; i++)
{
if (board[i][j] == board[i+1][j] && board[i][j] != ' ')
{
num2++;
if (num2 == row - 1)
{
return board[i][j];
}
}
else
{
break;
}
}
num2 = 0;
}
//判断主对角线
for (i = 0; i < row; i++)
{
if (board[i][i] == board[i + 1][i + 1] && board[i][i] != ' ')
{
num3++;
if (num3 == row - 1)
{
return board[i][i];
}
}
else
{
break;
}
}
//判断副对角线
for (i = 0; i < row; i++)
{
if (board[ROW/2][ROW/2] == board[i][2 - i] && board[ROW / 2][ROW / 2] != ' ')
{
num4++;
if (i == ROW / 2)
{
num4--;
}
if (num4 == row - 1)
{
return board[ROW / 2][ROW / 2];
}
}
else
{
break;
}
}
num4 = 0;
if (IsFull(board, ROW, COL))
{
return 'd';
}
return 'c';
}
最后是头文件
#include<stdio.h>
#define ROW 3
#define COL 3
void InitBoard(char board[ROW][COL], int row, int col);
void PrintBoard(char board[ROW][COL], int row, int col);
void PlayerGame(char board[ROW][COL], int row, int col);
void ComputerGame(char board[ROW][COL], int row, int col);
char IfWin(char board[ROW][COL], int row, int col);
目前测试是没问题,不知道还有没有逻辑是我没有考虑到的