C语言——五子棋、井字棋人机对“战”
针对 “【C语言实现五子棋、三子棋人机对战,包含电脑人工智能对战(可攻可守)】(非标题党)” 的详细介绍
五子棋、三子棋人机对战
前言
本文会对这篇文章进行分解详细介绍:【C语言实现五子棋、三子棋人机对战,包含电脑人工智能对战(可攻可守)】(非标题党)
内容有点繁杂,大家可以按照目录,依据个人需要查阅内容。
一、整体思路game( )
其实整体思路可以直接参照game函数,已经很清楚地罗列了每一步:
对于随机数生成器不太熟悉的伙伴们,可以自行查阅srand()、time()、rand()库函数,srand()、rand()函数通常是一起使用的,srand()就是用来设置随机数种子的函数,rand()就是用来产生随机数的函数。time()函数使得以现在的系统时间作为随机数的种子来产生随机数 之所以把srand()函数放这,而不是和rand()函数放一起,是担心程序运行过快,产生的随机数都是同一个。
srand((unsigned int)time(NULL));
int z = rand() % k
//游戏实现
void game()
{
//设置随机数的生成器,这一步是与computer_think()中的int z = rand() % k;对应
srand((unsigned int)time(NULL));
//存储数据 - 二维数组
char board[ROW][COL];
//初始化棋盘 - 初始化空格
board_init(board, ROW, COL);
//打印一下棋盘
board_display(board, ROW, COL);
char ret = 0;
while (1)
{
//玩家下棋
PlayerMove(board, ROW, COL);
//清屏
system("cls");
board_display(board, ROW, COL);
//判断游戏输赢
ret = board_wolf(board, ROW, COL);
if (ret != 'C')
break;
//电脑下棋
printf("对方正在下棋......\n");
Sleep(1000);//让电脑假装思考
ComputerMove(board, ROW, COL);
//清屏
system("cls");
board_display(board, ROW, COL);
//判断游戏输赢
ret = board_wolf(board, ROW, COL);
//C是游戏继续,在判断平局isfull函数中出现
//此行就是说ret不是游戏继续的情况,就结束循环
if (ret != 'C')
break;
}
switch (ret)
{
//正好是玩家棋子的字符
case 'O':
printf("玩家赢了\n");
break;
//正好是电脑棋子的字符
case 'X':
printf("电脑赢了\n");
break;
case 'Q':
printf("平局\n");
break;
}
}
二、函数实现
1.棋盘初始化board_init( )
首先将棋盘初始化为空字符,给我们的棋子留下可落子坐标,其中棋盘大小可通过更改game.h头文件中宏定义的ROW(行),COL(列)来更改棋盘的大小。实现:将二维数组board初始化为空字符。
void board_init(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] = ' ';
}
}
}
2.打印棋盘board_display( )
假设棋盘大小为10×10。棋盘是由一行( %c |)循环10次,一行(———|)循环10次,这两行×10组成。
不清楚我在说什么就看下图:
注意:每输入一行“ %c | %c | %c | %c | … | %c ”就在末尾添加上数字,方便玩家使用时看横坐标。 对应代码已在下方
void board_display(char board[ROW][COL], int row, int col)
{
int i = 0;
int k = 1;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
//同上面介绍一样,一个空字符 + 棋子 + 一个空字符
printf(" %c ", board[i][j]);
//忽略最后一组" %c |"的 "|"
if (j < col - 1)
{
printf("|");
}
}
//给最右侧一列加上行数,方面玩家输入坐标
//每输入一行"( %c |) × 10"就在末尾加上一个数字
printf(" %d", k);
k++;
//每输出一行都要加上\n回车
printf("\n");
if (i < row - 1)
{
int j = 0;
for (j = 0; j < col; j++)
{
//输出三个短横一个竖杠的组合---|,且忽略最后最后一组的 |
printf("———");
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
//给最后一行加上列数,方便玩家输入坐标
int z = 0;
//从1~10