前言
C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。因此本文用C语言来实现。
一、问题描述
用c语言实现三子棋。
二、基本流程
1.设置菜单界面开始与退出。
2.创建棋盘并初始化。
3.打印棋盘。
4.玩家落子(玩家输入行、列坐标),‘*'表示玩家落子。
5.判定胜负关系(输,赢,和棋),'Q’表示和棋,‘C’表示继续。
6.电脑落子,‘#’表示电脑落子。
7.判定胜负关系
8.回到步骤2,进行循环。
三、功能实现
1. 菜单打印
输入1,进入游戏;
输入0,退出游戏。
void menu()
{
printf("#####################\n");
printf("#####1.play game#####\n");
printf("#####0.exit #########\n");
printf("#####################\n");
}
2.创建棋盘并初始化
创建一个3*3的棋盘,并进行初始化棋盘全为空格。
#define ROW 3
#define COL 3
//宏定义全局变量
char board[ROW][COL] = { 0 };
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.棋盘打印
进入游戏后,打印棋盘如图所示
void DispalyerBoard(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]);//%c左右都有空格
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
//打印---|---|---行符
if (i < row - 1)
{
int n = 0;
for (n = 0; n < col; n++)
{
printf("---");
if (n < col-1)
{
printf("|");
}
}
printf("\n");
}
}
}
4. 玩家落子
玩家输入行列坐标表示落子,使用’*’表示玩家落子。
键入数据共有三种情况:
1.输入的数据合法(在行row,列col之内);
2.输入的数据不合法(不在行row,列col之内);
3.输入的数据已经被占用;
void PlayerMove(char board[ROW][COL], int row, int col)
{
int m = 0;
int n = 0;
printf("玩家请下棋->\n");
while (1)
{
printf("请输入坐标:>");
scanf("%d %d", &m, &n);
if ((m >= 1 && m <= row) && (n >= 1 && n <= col))//输入的数据合法
{
if (board[m - 1][n - 1] == ' ')
{
board[m - 1][n - 1] = '*';
break;
}
else
{
printf("你输入的数据已经被占用\n");
}
}
else
{
printf("输入的数据不合法,请重新输入\n");
}
}
}
5. 电脑落子
电脑随机产生行列坐标,‘#'表示电脑落子。
这里使用rand函数产生随机数,srand((unsigned int)time(NULL));
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑请下棋->\n");
int i = 0; int j = 0;
while (1)
{
i = rand() % row;
j = rand() % col;
if (board[i][j] == ' ')
{
board[i][j] ='#';
break;
}
}
}
6.判断胜负
1.判定是否和棋
(1)调用IsFull函数。
(2)如果数组中有元素为’‘,那么没满,返回0。如果全不为’ ',满了,返回1。
(3)如果棋盘满了未分出胜负,和棋。
2.判定电脑玩家胜利
(1)判定所有的行
(2)判定所有的列
(3)判定两条对角线
此处约定返回结果的含义:
//玩家赢 - ‘*’
//电脑赢 - ‘#’
//平局 - ‘Q’
//继续 - ‘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;
}
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][0] == board[i][1] && board[i][0] == board[i][2])
{
return board[i][0];
}
}
//列
int j = 0;
for (j = 0;j < col; j++)
{
if (board[0][j] != ' ' && board[0][j] == board[1][j] && board[1][j] == board[2][j])
{
return board[0][j];
}
}
//对角线
if (board[0][0] != ' ' && board[0][0] == board[1][1] && board[1][1] == board[2][2])
{
return board[0][0];
}
if (board[0][2] != ' ' && board[0][2] == board[1][1] && board[1][1] == board[2][0])
{
return board[1][1];
}
//没有人赢,就要平局
if (IsFull(board, row, col))
{
return 'Q';
}
//游戏继续
return 'C';
}
四、结果演示
1.玩家赢
2.电脑赢
3.平局
总结
三子棋的实现主要利用C语言的分支和循环语句对数组和函数进行初始化和赋值。
三子棋完整代码