大家好,我是小突突
今天我想详细地和你讲解这个三子棋小游戏是怎样实现的。
目录
1.基本流程
2. 配置运行环境
3.代码过程
3.1菜单界面选择开始或者退出游戏
3.2.创建棋盘并初始化。
3.3打印棋盘。
4.玩家落子并打印棋盘
5.电脑落子并打印棋盘
6.判定胜负关系(输,赢,平局)
7.整体代码展示
7.1 test.c
7.2 game.c
7.3 game.h
1.基本流程
1.菜单界面选择开始或者退出游戏。
2.创建棋盘并初始化。
3.打印棋盘。
4.玩家落子并打印棋盘
5.电脑落子并打印棋盘
6.判定胜负关系(输,赢,平局)
2. 配置运行环境
1.菜单界面选择开始或者退出游戏。
2.创建棋盘并初始化。
3.打印棋盘。
4.玩家落子并打印棋盘
5.电脑落子并打印棋盘
6.判定胜负关系(输,赢,平局)
本次游戏用到三个文件,两个源文件test.c,game.c,一个头game.h。其中,game.c,game.h可以称作一个游戏模块,为什么要这样做呢?因为多个文件可以分别处理各自模块的功能,能更好处理各个模块之间的逻辑并且便于后期调试,也使得代码的可读性提高。
3.代码过程
3.1菜单界面选择开始或者退出游戏
int main()
{
test();
return 0;
}
打印菜单
void menu()
{
printf("******************n");
printf("***** 1.play *****n");
printf("***** 0.exit *****n");
printf("******************n");
}
选择数字,1代表玩游戏,0代表退出游戏
void test()
{
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("玩游戏n");//游戏
break;
case 0:
printf("退出游戏n");
break;
default:
printf("选择错误n");
break;
}
} while (input);
}
3.2.创建棋盘并初始化。
用一个二维数组创建一个3*3的棋盘。
使用宏定义的原因:
1.推高代码可读性,后续代码中遇到3,方便理解含义。
2.提高扩展性,如果将来要修改棋盘尺寸,代码修改会很方便。
char board[ROW][COL] = { 0 };
#define ROW 3
#define COL 3
在game.c中初始化棋盘
void InitBoard(char board[ROW][COL],int row,int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
3.3打印棋盘。
在game.c中实现打印棋盘
void Displayboard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//打印数据
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if(j
棋盘的搭建的本质是留出一片空间,玩家或者电脑在棋盘上进行操作。每一行和每一列都要设置分割线进行区分,才能完成打印。
4.玩家落子并打印棋盘
在game.c中实现对棋盘上空位的判断,防止一个位置多次下棋,并且显示出空位给玩家下棋,之后打印出新的棋盘。
void player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家下棋n");
while (1)
{
printf("请输入坐标:>");
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("该坐标已被占用,请重新输入n");
}
else
{
printf("数字输入非法,请重新输入n");
}
}
}
5.电脑落子并打印棋盘
玩家选择一个位置打印后,电脑通过rand()函数产生一个在限定范围内的的随机值,并产生一个随机坐标并在相应坐标打印一个字符(电脑下棋过程),滞后打印新的棋盘。注意:rand函数使用之前要调用一个srand函数。
同样也是在game.c文件中实现。
void computer_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋n");
while (1)
{
x = rand() % row; //0~2
y = rand() % col; //0~2
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
6.判定胜负关系(输,赢,平局)
在玩家与电脑多次落子之后,产生最终的结果,这时候对结果进行分析,相同的3个字符相连(行 列 对角线)即为胜利,如果棋盘已满但双方都没有完成三个字符相连即为平局。
创建一个is_win函数用它的返回值来表示游戏结果
玩家赢 :‘*’
电脑赢 :‘#’
平局 :‘E’
继续 :‘C’
char is_win(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][1] == board[i][2] && board[i][1] != ' ')
return board[i][1];
}
//判断列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
return board[1][i];
}
//判断对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && 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 (is_full(board, row, col) == 1)
return 'E';
//继续
return 'C';
}
每一次玩家与电脑落子后都要进行判断
//判断输赢的代码
char ret = 0;
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
在下棋的过程中,还要时时刻刻判断棋盘有没有满。
int is_full(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;//没满
}
}
return 1;//(满了)
}
7.整体代码展示
7.1 test.c
#include
#include "game.h"
void menu()
{
printf("******************n");
printf("***** 1.play *****n");
printf("***** 0.exit *****n");
printf("******************n");
}
void game()
{
char ret = 0;
char board[ROW][COL] = { 0 };
//初始化棋盘为全空格
InitBoard(board, ROW, COL);
//打印棋盘
Displayboard(board, ROW, COL);
while (1)
{
//玩家下棋
player_move(board, ROW, COL);
Displayboard(board, ROW, COL);
//判断输赢
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
//电脑下棋 随机下棋
computer_move(board, ROW, COL);
Displayboard(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家赢了n");
}
else if (ret == '#')
{
printf("电脑赢了n");
}
else
printf("平局n");
}
//
//什么情况,游戏就结束了
//玩家赢 - '*'
//电脑赢 - '#'
//平局 - 'E'
//继续 - 'C'
//
void test()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();//游戏
break;
case 0:
printf("退出游戏n");
break;
default:
printf("选择错误n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
7.2 game.c
//初始化棋盘
void InitBoard(char board[ROW][COL],int row,int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
void Displayboard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//打印数据
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if(j");
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("该坐标已被占用,请重新输入n");
}
else
{
printf("数字输入非法,请重新输入n");
}
}
}
//电脑下棋
void computer_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋n");
while (1)
{
x = rand() % row; //0~2
y = rand() % col; //0~2
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
//判断棋盘有没有满
int is_full(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;//没满
}
}
return 1;//(满了)
}
//判断输赢
char is_win(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][1] == board[i][2] && board[i][1] != ' ')
return board[i][1];
}
//判断列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
return board[1][i];
}
//判断对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && 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 (is_full(board, row, col) == 1)
return 'E';
//继续
return 'C';
}
7.3 game.h
#pragma once
#include
#include
#include
#define ROW 3
#define COL 3
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
void Displayboard(char board[ROW][COL], int row, int col);
//玩家下棋
void player_move(char board[ROW][COL], int row, int col);
//电脑下棋
void computer_move(char board[ROW][COL], int row, int col);
//判断输赢
char is_win(char board[ROW][COL], int row, int col);
编译环境:VS 2019
以上就是三子棋的全部实现过程。完结,撒花!
int main()
{
test();
return 0;
}
打印菜单
void menu()
{
printf("******************n");
printf("***** 1.play *****n");
printf("***** 0.exit *****n");
printf("******************n");
}
选择数字,1代表玩游戏,0代表退出游戏
void test()
{
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("玩游戏n");//游戏
break;
case 0:
printf("退出游戏n");
break;
default:
printf("选择错误n");
break;
}
} while (input);
}
3.2.创建棋盘并初始化。
用一个二维数组创建一个3*3的棋盘。
使用宏定义的原因:
1.推高代码可读性,后续代码中遇到3,方便理解含义。
2.提高扩展性,如果将来要修改棋盘尺寸,代码修改会很方便。
char board[ROW][COL] = { 0 };
#define ROW 3
#define COL 3
在game.c中初始化棋盘
void InitBoard(char board[ROW][COL],int row,int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
3.3打印棋盘。
在game.c中实现打印棋盘
void Displayboard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//打印数据
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if(j
棋盘的搭建的本质是留出一片空间,玩家或者电脑在棋盘上进行操作。每一行和每一列都要设置分割线进行区分,才能完成打印。
4.玩家落子并打印棋盘
在game.c中实现对棋盘上空位的判断,防止一个位置多次下棋,并且显示出空位给玩家下棋,之后打印出新的棋盘。
void player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家下棋n");
while (1)
{
printf("请输入坐标:>");
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("该坐标已被占用,请重新输入n");
}
else
{
printf("数字输入非法,请重新输入n");
}
}
}
5.电脑落子并打印棋盘
玩家选择一个位置打印后,电脑通过rand()函数产生一个在限定范围内的的随机值,并产生一个随机坐标并在相应坐标打印一个字符(电脑下棋过程),滞后打印新的棋盘。注意:rand函数使用之前要调用一个srand函数。
同样也是在game.c文件中实现。
void computer_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋n");
while (1)
{
x = rand() % row; //0~2
y = rand() % col; //0~2
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
6.判定胜负关系(输,赢,平局)
在玩家与电脑多次落子之后,产生最终的结果,这时候对结果进行分析,相同的3个字符相连(行 列 对角线)即为胜利,如果棋盘已满但双方都没有完成三个字符相连即为平局。
创建一个is_win函数用它的返回值来表示游戏结果
玩家赢 :‘*’
电脑赢 :‘#’
平局 :‘E’
继续 :‘C’
char is_win(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][1] == board[i][2] && board[i][1] != ' ')
return board[i][1];
}
//判断列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
return board[1][i];
}
//判断对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && 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 (is_full(board, row, col) == 1)
return 'E';
//继续
return 'C';
}
每一次玩家与电脑落子后都要进行判断
//判断输赢的代码
char ret = 0;
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
在下棋的过程中,还要时时刻刻判断棋盘有没有满。
int is_full(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;//没满
}
}
return 1;//(满了)
}
7.整体代码展示
7.1 test.c
#include
#include "game.h"
void menu()
{
printf("******************n");
printf("***** 1.play *****n");
printf("***** 0.exit *****n");
printf("******************n");
}
void game()
{
char ret = 0;
char board[ROW][COL] = { 0 };
//初始化棋盘为全空格
InitBoard(board, ROW, COL);
//打印棋盘
Displayboard(board, ROW, COL);
while (1)
{
//玩家下棋
player_move(board, ROW, COL);
Displayboard(board, ROW, COL);
//判断输赢
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
//电脑下棋 随机下棋
computer_move(board, ROW, COL);
Displayboard(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家赢了n");
}
else if (ret == '#')
{
printf("电脑赢了n");
}
else
printf("平局n");
}
//
//什么情况,游戏就结束了
//玩家赢 - '*'
//电脑赢 - '#'
//平局 - 'E'
//继续 - 'C'
//
void test()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();//游戏
break;
case 0:
printf("退出游戏n");
break;
default:
printf("选择错误n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
7.2 game.c
//初始化棋盘
void InitBoard(char board[ROW][COL],int row,int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
void Displayboard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//打印数据
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if(j");
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("该坐标已被占用,请重新输入n");
}
else
{
printf("数字输入非法,请重新输入n");
}
}
}
//电脑下棋
void computer_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋n");
while (1)
{
x = rand() % row; //0~2
y = rand() % col; //0~2
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
//判断棋盘有没有满
int is_full(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;//没满
}
}
return 1;//(满了)
}
//判断输赢
char is_win(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][1] == board[i][2] && board[i][1] != ' ')
return board[i][1];
}
//判断列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
return board[1][i];
}
//判断对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && 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 (is_full(board, row, col) == 1)
return 'E';
//继续
return 'C';
}
7.3 game.h
#pragma once
#include
#include
#include
#define ROW 3
#define COL 3
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
void Displayboard(char board[ROW][COL], int row, int col);
//玩家下棋
void player_move(char board[ROW][COL], int row, int col);
//电脑下棋
void computer_move(char board[ROW][COL], int row, int col);
//判断输赢
char is_win(char board[ROW][COL], int row, int col);
编译环境:VS 2019
以上就是三子棋的全部实现过程。完结,撒花!
用一个二维数组创建一个3*3的棋盘。
使用宏定义的原因:
1.推高代码可读性,后续代码中遇到3,方便理解含义。
2.提高扩展性,如果将来要修改棋盘尺寸,代码修改会很方便。
在game.c中初始化棋盘
在game.c中实现打印棋盘
void Displayboard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//打印数据
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if(j
棋盘的搭建的本质是留出一片空间,玩家或者电脑在棋盘上进行操作。每一行和每一列都要设置分割线进行区分,才能完成打印。
4.玩家落子并打印棋盘
在game.c中实现对棋盘上空位的判断,防止一个位置多次下棋,并且显示出空位给玩家下棋,之后打印出新的棋盘。
void player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家下棋n");
while (1)
{
printf("请输入坐标:>");
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("该坐标已被占用,请重新输入n");
}
else
{
printf("数字输入非法,请重新输入n");
}
}
}
5.电脑落子并打印棋盘
玩家选择一个位置打印后,电脑通过rand()函数产生一个在限定范围内的的随机值,并产生一个随机坐标并在相应坐标打印一个字符(电脑下棋过程),滞后打印新的棋盘。注意:rand函数使用之前要调用一个srand函数。
同样也是在game.c文件中实现。
void computer_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋n");
while (1)
{
x = rand() % row; //0~2
y = rand() % col; //0~2
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
6.判定胜负关系(输,赢,平局)
在玩家与电脑多次落子之后,产生最终的结果,这时候对结果进行分析,相同的3个字符相连(行 列 对角线)即为胜利,如果棋盘已满但双方都没有完成三个字符相连即为平局。
创建一个is_win函数用它的返回值来表示游戏结果
玩家赢 :‘*’
电脑赢 :‘#’
平局 :‘E’
继续 :‘C’
char is_win(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][1] == board[i][2] && board[i][1] != ' ')
return board[i][1];
}
//判断列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
return board[1][i];
}
//判断对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && 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 (is_full(board, row, col) == 1)
return 'E';
//继续
return 'C';
}
每一次玩家与电脑落子后都要进行判断
//判断输赢的代码
char ret = 0;
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
在下棋的过程中,还要时时刻刻判断棋盘有没有满。
int is_full(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;//没满
}
}
return 1;//(满了)
}
7.整体代码展示
7.1 test.c
#include
#include "game.h"
void menu()
{
printf("******************n");
printf("***** 1.play *****n");
printf("***** 0.exit *****n");
printf("******************n");
}
void game()
{
char ret = 0;
char board[ROW][COL] = { 0 };
//初始化棋盘为全空格
InitBoard(board, ROW, COL);
//打印棋盘
Displayboard(board, ROW, COL);
while (1)
{
//玩家下棋
player_move(board, ROW, COL);
Displayboard(board, ROW, COL);
//判断输赢
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
//电脑下棋 随机下棋
computer_move(board, ROW, COL);
Displayboard(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家赢了n");
}
else if (ret == '#')
{
printf("电脑赢了n");
}
else
printf("平局n");
}
//
//什么情况,游戏就结束了
//玩家赢 - '*'
//电脑赢 - '#'
//平局 - 'E'
//继续 - 'C'
//
void test()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();//游戏
break;
case 0:
printf("退出游戏n");
break;
default:
printf("选择错误n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
7.2 game.c
//初始化棋盘
void InitBoard(char board[ROW][COL],int row,int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
void Displayboard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//打印数据
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if(j");
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("该坐标已被占用,请重新输入n");
}
else
{
printf("数字输入非法,请重新输入n");
}
}
}
//电脑下棋
void computer_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋n");
while (1)
{
x = rand() % row; //0~2
y = rand() % col; //0~2
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
//判断棋盘有没有满
int is_full(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;//没满
}
}
return 1;//(满了)
}
//判断输赢
char is_win(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][1] == board[i][2] && board[i][1] != ' ')
return board[i][1];
}
//判断列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
return board[1][i];
}
//判断对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && 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 (is_full(board, row, col) == 1)
return 'E';
//继续
return 'C';
}
7.3 game.h
#pragma once
#include
#include
#include
#define ROW 3
#define COL 3
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
void Displayboard(char board[ROW][COL], int row, int col);
//玩家下棋
void player_move(char board[ROW][COL], int row, int col);
//电脑下棋
void computer_move(char board[ROW][COL], int row, int col);
//判断输赢
char is_win(char board[ROW][COL], int row, int col);
编译环境:VS 2019
以上就是三子棋的全部实现过程。完结,撒花!



