用c语言实现三子棋小游戏(人机对弈)
2. 题目分析- 创建并打印菜单
- 创建并初始化棋盘
- 打印棋盘
- 玩家下棋
- 电脑下棋
- 判断输赢,并展示结果
void menu()
{
printf(" ------------------------------n");
printf("| |n");
printf("| 1. game 0. exit |n");
printf("| |n");
printf(" ------------------------------n");
}
2) 初始化棋盘
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] = ' ';//可下棋位置初始化为空格
}
}
}
3) 打印棋盘
//打印棋盘
void DisplayBoard(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++)
{
printf(" %c ", board[i][j]);
//打印列分隔符
if (j < col-1)
{
printf("|");
}
}
printf("n");
//打印行分隔符
if (i < row-1)
{
printf("---|---|---n");
}
}
}
4) 玩家下棋
//玩家下棋 用“O”表示
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;//横坐标
int y = 0;//纵坐标
printf("玩家下棋:");
scanf("%d%d", &x, &y);
if (x > 0 && x <= row && y > 0 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = 'O';
}
else
{
printf("非法输入n");
PlayerMove(board, row, col);
}
}
else
{
printf("非法输入n");
PlayerMove(board, row, col);
}
}
5)电脑下棋
//电脑下棋 用“X”表示 版本1
void ComputerMove(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
while (1)
{
//IsFull函数在 6)判断胜负 中有说明
int flag = IsFull(board, row, col);//判断是否有位置可下 0--有
if (flag == 0)
{
//电脑下棋
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = 'X';
break;
}
}
}
}
6) 判断胜负
char IsWin(char board[ROW][COL], int row, int col)
{
//行
int i = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][0] == board[i][2]&&board[i][0]!=' ')
return board[i][0];
}
//列
int j = 0;
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[0][j] == board[2][j]&&board[0][j]!=' ')
return board[0][j];
}
//对角线
if (board[0][0] == board[1][1] && board[2][2]==board[1][1] && board[1][1] != ' ')
return board[1][1];
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1]!=' ')
return board[1][1];
//判断棋盘是否满
if (IsFull(board, row, col))
return 'y';//满了
return 'n';//未满,继续
}
4. 程序演示
1)菜单展示
2)打印棋盘
3)玩家获胜
4)电脑获胜
5)平局
5. 源代码
#define _CRT_SECURE_NO_WARNINGS //使用宏定义,便于更改游戏阶数,增加代码的灵活性 #define ROW 3//行数 #define COL 3//列数 #include#include #include //----函数声明------- //初始化棋盘 void InitBoard(char board[ROW][COL], int row, int col); //打印棋盘 void DisplayBoard(char board[ROW][COL], int row, int col); //玩家下棋 void PlayerMove(char board[ROW][COL], int row, int col); //电脑下棋 void ComputerMove(char board[ROW][COL], int row, int col); //判断输赢 char IsWin(char board[ROW][COL], int row, int col); //判断棋盘是否已满 int IsFull(char board[ROW][COL], int row, int col); void menu() { printf(" ------------------------------n"); printf("| |n"); printf("| 1. game 0. exit |n"); printf("| |n"); printf(" ------------------------------n"); } //----结束函数声明------ //进行游戏 void game() { char board[ROW][COL] = { 0 }; char ret = 0; //初始化棋盘 InitBoard(board, ROW, COL); //打印棋盘 DisplayBoard(board, ROW, COL); //下棋 while (1) { //玩家下棋 PlayerMove(board, ROW, COL); //判断输赢 ret = IsWin(board, ROW, COL); if (ret != 'n') { //打印最后的棋盘 DisplayBoard(board, ROW, COL); break; } //电脑下棋 ComputerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); //判断输赢 ret = IsWin(board, ROW, COL); if (ret != 'n') break; } if (ret == 'O') printf("玩家获胜n"); else if (ret == 'X') printf("电脑获胜n"); else if (ret == 'y') printf("平局n"); } int main() { srand((unsigned)time(NULL));//要产生随机值,用时间戳 int input = 0;//输入选项 do { //打印菜单 menu(); scanf("%d", &input); switch (input) { case 1: printf("游戏开始n"); game(); break; case 0: printf("游戏已退出n"); break; default: printf("无效输入n"); break; } system("pause"); system("cls"); } while (input); 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 DisplayBoard(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++) { printf(" %c ", board[i][j]); //打印列分隔符 if (j < col-1) { printf("|"); } } printf("n"); //打印行分隔符 if (i < row-1) { printf("---|---|---n"); } } } //玩家下棋 O void PlayerMove(char board[ROW][COL], int row, int col) { int x = 0;//横坐标 int y = 0;//纵坐标 printf("玩家下棋:"); scanf("%d%d", &x, &y); if (x > 0 && x <= row && y > 0 && y <= col) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = 'O'; } else { printf("非法输入n"); PlayerMove(board, row, col); } } else { printf("非法输入n"); PlayerMove(board, row, col); } } //棋盘是否已满 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;//已满 } //电脑下棋 X 版本1 void ComputerMove(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; while (1) { int flag = IsFull(board, row, col);//判断是否有位置可下 0--有 if (flag == 0) { //电脑下棋 随机位置下棋 int x = rand() % row; int y = rand() % col; if (board[x][y] == ' ') { board[x][y] = 'X'; break; } } } } //判断输赢 char IsWin(char board[ROW][COL], int row, int col) { //行 int i = 0; for (i = 0; i < row; i++) { if (board[i][0] == board[i][1] && board[i][0] == board[i][2]&&board[i][0]!=' ') return board[i][0]; } //列 int j = 0; for (j = 0; j < col; j++) { if (board[0][j] == board[1][j] && board[0][j] == board[2][j]&&board[0][j]!=' ') return board[0][j]; } //对角线 if (board[0][0] == board[1][1] && board[2][2]==board[1][1] && board[1][1] != ' ') return board[1][1]; if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1]!=' ') return board[1][1]; //判断棋盘是否满 if (IsFull(board, row, col)) return 'y';//满了 return 'n';//未满,继续 }



