阅读水平条件:
C语言的基本语法:
大概就是玩家选择对应的坐标下棋,电脑会自动下棋;直到游戏结束,或者平局。
三子棋游戏需要一个3 × 3 的棋盘,需要玩家下棋,需要电脑下棋,需要判断输赢。
前提准备文件:(笔者用vs2013创建的文件)
头文件的代码内容(具体实现在后面):
# define ROW 3 //行号
# define COL 3 //列号
# include
# include //随机数种子函数srand()的头文件
# include //时间函数time()需要的头文件
void InitBoard(char board[ROW][COL], int row, int col); //初始化棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);//打印棋盘信息
void PlayMove(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); //判断棋盘是否满了
下面的代码也是在 test.c文件中的
#define _CRT_SECURE_NO_WARNINGS 1
# include"game.h"
// 测试三子
void meun()
{
printf("*********|三子棋|********\n");
printf("*********--------********\n");
printf("*********|1.Play|********\n");
printf("*********--------********\n");
printf("*********|0.Exit|********\n");
}
// 游戏的实现
void game()
{
char ret = 0;
//创建数组——存放玩家走的棋盘信息
char board[ROW][COL] = { 0 };
//初始化棋盘
InitBoard(board, ROW, COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
//下棋
while (1)
{
//玩家下棋
PlayMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
//判断玩家是否赢
ret = IsWin(board, ROW, COL);
if (ret != 'C') //用字符C游戏结束状态
break;
//电脑下棋
ComputerMove(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 text()
{
int input = 0;
srand((unsigned int)time(NULL));//随机数为了后面电脑下棋做准备
do
{
meun();
printf("请选择->:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误请重新选择\n");
break;
}
} while (input);
}
int main()
{
text();
return 0;
}
首先看 test( )函数:
switch
语句供玩家选择,选择 1 表示进入游戏,选择 0 表示退出游戏,选择其他,就重写输入;do while
循环,为什么是do while
而不是 while
, 因为我们玩家一进入游戏就开始游戏,而不是先判断需不需要开始玩;其次看 game()函数:
InitBoard(board, ROW, COL)
函数;DisplayBoard(board, ROW, COL)
;PlayMove(board, ROW, COL)
;由于玩家下棋要一直下棋直到游戏结束和平局出现,所以用一个while
去控制,下完棋需要打印一下棋盘的信息,所以用DisplayBoard(board, ROW, COL)
去打印,打印结束后还需要判断一下玩家是否赢了,用一个IsWin(board, ROW, COL);
去封装,我们设计IsWin()
函数的返回值为char
类型,用返回值 C
来判断游戏结束状态,用字母Q
表示游戏平局;void InitBoard(char board[ROW][COL], int row, int col) //初始化棋盘本质就是给二维数组赋值空格;
{
int i = 0, 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++)
{
//打印一行数据;
for (int j = 0; j < col; j++)
{
printf(" %c ", board[i][j]); // 用字符 * 和 # 来区分玩家和电脑
if (j < col - 1) //控制条件,不打印最后一列的 竖杠 |
printf("|");
}
printf("\n");
//打印分割行;
if (i < row - 1) //控制条件,不打印最后一行的 --- 分隔符
{
for (int j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
void PlayMove(char board[ROW][COL], int row, int col) //玩家移动
{
int x = 0, y = 0; // 下棋的坐标变量
printf("玩家走->:\n");
while (1)
{
printf("请输入要下的坐标->");
scanf("%d%d", &x, &y);
//判断x,y的坐标合法性
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ') // x-1 y-1是因为数组的下标从0开始,而我们下棋的下标从一开始
{
board[x - 1][y - 1] = '*'; //玩家下棋用*号表示
break;
}
else
printf("该坐标被占用\n");
}
else
printf("输入有误,请重新输入\n");
}
}
void ComputerMove(char board[][COL], int row, int col) //电脑移动
{
int x = 0, y = 0;
printf("电脑走->\n");
while (1)
{
//设置随机下标让电脑走,控制下标为0-2
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
int IsFull(char board[ROW][COL], int row, int col) //封装函数判断三子棋是否满的状态
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
char IsWin(char board[ROW][COL], int row, int col) //判断输赢
{
//判断横三行是否相等
for (int 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 (int 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[2][0] != ' ')
return board[1][1];
if (1 == IsFull(board, ROW, COL)) //满了返回Q表示平局
return 'Q';
return 'C'; //返回C 表示游戏结束标志
}
三子棋的功能代码实现组合起来就是 game.c文件的内容了。