程序界面实现如图所示的人与电脑互动的三子棋游戏
文件模块
| test.c | 测试三子棋游戏 |
| game.h | 游戏的函数声明(头文件) |
| game.c | 游戏函数的实现 |
代码模块
初始化棋盘(每个位置初始为空格)
打印棋盘观察棋盘的样式,每个部分由三个格的空间组成,填入数据的时候,为了美观形成两边空格而中间是字符的棋盘格,形成这种样式就需要在打印函数里在进行操作。
从上到下分为五个部分:即字符部分和横分隔线——相隔打印;
从左到右分为五个部分:即字符部分和纵分隔线——相隔打印;
横向:
每个棋盘格即字符部分的组成就是“空格+字符+空格”,所以就打印" %c ";
纵分隔线“|”在每个棋盘格后添加一个,每行最后一个字符后面不加,即j 纵向: 每行的字符和纵分隔线结束后,在打印横分割线“---”,最后一行不加。 注意几点问题: 1.判断坐标的合法性,横纵坐标取值是[1,row]和[1,col]; 这里用到rand()函数,电脑下的是随机位置 rand( )%m: [0,m] 从0到m-1的m个数字范围内 这里的电脑并不智能化,后期将会改善 判断指标(返回四种状态): 玩家赢 —— '*' 某方棋子赢的情况有四种: 1.横批形成连续的三颗棋子 2.纵排形成连续的三颗棋子 3.正对角线形成连续的三颗棋子 4.反对角线形成连续的三颗棋子 返回值即是这方所对应的字符'*'或*#'
2.检验坐标是否被占用,即选取的位置是否为空格;
3.对于正常玩家,他们认为的坐标的首位是从(1,1)开始选取而不是像计算机数组里面的(0,0),所以玩家选取坐标值的范围是[1,row]和[1,col];
4.在计算机处理时,再转换到数组中的语法,下标取值从0开始,所以在玩家选择值的基础上横纵坐标分别减去1。
电脑赢 —— '#'
平局了 —— 'Q'
游戏继续 —— 'C'附源码
game.h
#include
game.c
#include "game.h"//包含头文件game.h
//初始化棋盘,每个位置为一个空格
void init_board(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 display_board(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//打印数据
//printf(" %c | %c | %c n", board[i][0], board[i][1], board[i][2]);
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)//每行的最后一个数据后面不用打印竖线
printf("|");
}
printf("n");
//打印分隔线
//---|---|---
if (i < row - 1)
{
//printf("---|---|---n");
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("n");
}
}
}
//玩家下棋,下的棋子用'*'表示
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);
//1.判断坐标的合法性
//2.检验坐标是否被占用
//对于正常玩家,坐标的首位是从(1,1)开始选取而不是像计算机数组里面的(0,0)
//所以玩家选取坐标值的范围介于[1,row]和[1,col]之间
if (x >= 1 && x <= row && y >= 1 && y <= col) //判断坐标的合法性
{
//转化到计算机数组中的语法,下标取值从0开始,所以在玩家选择值的基础上横纵坐标分别减去1
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)
{
printf("电脑下棋:>n");
//0~32726
//%3-->0~2
while (1)
{
//用到随机数的生成
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
//如果棋盘满了,返回1
//不满,返回0
static 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][0] != ' ')
{
return board[i][0];
}
}
//纵排形成连续的三颗棋子
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][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 'Q';
}
//继续
return 'C';
}
test.c
#include "game.h"
void menu()
{
printf("*********************************n");
printf("******** 1. play ********n");
printf("******** 0. exit ********n");
printf("*********************************n");
}
void game()
{
char ret = 0;//ret用来判断游戏的状态
//数据的存储需要一个3*3的二维数组
char board[ROW][COL] = { 0 };
init_board(board, ROW, COL);
display_board(board, ROW, COL);
//玩游戏
while (1)
{
player_move(board, ROW, COL);
display_board(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'C')
break;
computer_move(board, ROW, COL);
display_board(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'C')
break;
}
//玩家赢 - '*'
//电脑赢 - '#'
//平局了 - 'Q'
//游戏继续 - 'C'
if (ret == '*')
{
printf("玩家赢n");
}
else if (ret == '#')
{
printf("电脑赢n");
}
else if (ret == 'Q')
{
printf("平局n");
}
display_board(board, ROW, COL);
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏n");
break;
default:
printf("选择错误,重新选择!n");
break;
}
} while (input);
return 0;
}
运行结果



