初学三子棋-人机对战

** 三子棋的胜负规则与五子棋类似,只要三颗棋子连成一条直线就可以获胜,不同的是三子棋只有九个棋点,在一个九宫格内进行游戏,那我们如何用c语言来实现三子棋的人机对战呢
**首先,我们先设置一个游戏菜单来进入游戏
菜单设置
在这里插入图片描述
**在这里对不同的情境进行选择,选择1让我们进入游戏
**我们需要一个3*3的棋盘,所以这里需要一个board[3][3]的二维数组。
**第一步要进行的就是对二维数组的初始化
在这里插入图片描述
这是我们想要的棋盘效果
在这里插入图片描述
**打印一行数据行,打印一行分割行,如此重复。
**那我们何不把一行数据行和一行分割行放到一起,最后一次打印不打印分割行
在这里插入图片描述
**棋盘打印完毕,我们就要往里面下棋啦~
**首先由玩家开始下棋
在这里插入图片描述
**然后电脑下棋,如此轮换

**这里调用了rand函数来让电脑随机的将棋子下在一个地方
**游戏又开始就有结束,我们来用一个return值来判断游戏的进程吧
在这里插入图片描述
**对判断棋盘是否满了的情况,我们又引入了一个IsFull函数
在这里插入图片描述
**在游戏的最后,用返回值来确定输赢
在这里插入图片描述
至此,函数结束,代码的讲解就结束了。

***下面是完整代码块
//test.c部分
#define _CRT_SECURE_NO_WARNINGS
#include “game.h”
void game()
{
char ret = " “;
//数组-存放棋盘信息
char board[ROW][COL] = { 0 };
//初始化棋盘
InitBoard(board, ROW, COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
while (1)
{
//玩家走
PLMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);//打印棋盘
//判断输赢
ret = IsWin(board, ROW, COL);
if (ret != ‘C’)
{
break;
}
//电脑走
PCMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
//判断输赢
ret = IsWin(board, ROW, COL);
if (ret != ‘C’)
{
break;//棋盘未满继续游戏
}
}
if (ret == '’)//利用返回值来判断输赢
{
printf(“玩家赢\n”);
}
else if (ret == ‘#’)
{
printf(“电脑赢\n”);
}
else
{
printf(“平局\n”);
}
}
void menu()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
printf("
\n");
printf("
1.play 0.exit \n");
printf("
*\n”);
printf(“请选择—>:”);
scanf("%d", &input);
switch (input)
{
case 1:
printf(“三子棋\n”);
game();
break;
case 0:
printf(“退出成功\n”);
break;
default:
printf(“选择错误,请重试\n”);
break;
}
} while (input);
}
int main()
{
menu();
return 0;
}
//程序分为菜单 初始化 打印 玩家执棋 电脑执棋 判断游戏进程等部分 用模块化的方式来分别执行

**//game.c部分(游戏算法)
#define _CRT_SECURE_NO_WARNINGS
#include “game.h”

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;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c “, board[i][j]);//打印一行数据
if (j < col - 1)
printf(”|");
}
printf("\n");
for (j = 0; j < col; j++)
if (i<row-1)
{
printf("—");//打印一行分割行
if (j < col - 1)
printf("|");
}
printf("\n");
}
}

void PLMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf(“请输入坐标:>”);
scanf("%d%d", &x, &y);
if (x <= row&&y <= col)
{
if (board[x - 1][y - 1] == ’ ')
{
board[x - 1][y - 1] = ‘*’;
break;
}
else
printf(“输入错误,请重新输入\n”);
//检验坐标合法性
}
}
}

void PCMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
x = rand() % 3;
y = rand() % 3;
if (board[x][y] == ’ ')
{
board[x][y] = ‘#’;
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][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 (IsFull(board, ROW, COL))
{
return ‘Q’;
}
return ‘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;
}**

**最后这一块是函数的声明game.h文件(注意自己定义的头文件引用要用“”)
#define ROW 3
#define COL 3

#include <stdio.h>
#include<stdlib.h>
#include<time.h>
void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void PLMove(char board[ROW][COL], int row, int col);
void PCMove(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);**
感谢大家的观看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值