目录
一、游戏设计思路
二、游戏设计步骤
1.菜单创建
2.棋盘的展现
3.棋盘的初始化
4.玩家下棋
5.电脑自动下棋
6.游戏胜负的判断
三、游戏运行状况
一、游戏设计思路
三子棋游戏代码多达200多条,我们在学习时,就不能一股脑地打下去,不然在后期我们极有可能面临这大量报错的局面。所以在设计游戏代码的时候,我们应该想好从哪里入手,先设计什么再设计什么。在这里我把游戏的设计分为三个层面,一是测试(text.c)、二是函数的声明(game.h)、三是函数的实现(game.c)。
二、游戏设计步骤
1.菜单创建
每个游戏开始的时候都有选择界面,让你选择退出或开始游戏,三子棋也不例外,接下来我们要在测试层实现菜单的创建。重要的是我们需要实现连续的玩,而不是只能玩一局。这样我们需要用到do......while循环。
代码如下:
void menu()
{
printf("****************************\n");
printf("******* 0·exit ********** \n");
printf("******* 1·play ********** \n");
printf("****************************\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("请输入:>");
scanf("%d", &input);
switch (input)
{
case 0:
printf("退出游戏\n");
break;
case 1:
printf("三子棋\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
当然,菜单界面并不是唯一的,可以根据自己喜好设计。之后程序试运。
2.棋盘的展现
3*3棋盘对应着一个char类型的二维数组,我们定义一个函数display_board(board,3,3)。在定义的时候,函数当然不知道棋盘到底有多大,所以我们就需要“告诉”他有多大。但是,不排除我们之后做出更大的棋盘,超过了3*3,所以函数也得跟着改。为了一劳永逸,我们在game.h文件定义如下,
#define ROW 3
#define COL 3
之后只要在text.c用#include"game.h"包含下就可以根据之后的变动调整了。
void game()
{
char board[ROW][COL]={0};
display_board(board,ROW,COL)
}
而display_board函数,我们也需要在game.c层面进行声明,声明如下。
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");
//打印分割信息
//printf("---|---|---\n");
if (i < row - 1)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
3.棋盘的初始化
在上述代码运行后,我们会发现棋盘是歪的,没有对齐,接下来我们对棋盘进行美化。
现在text.c写上如下代码,之后在game.c进行声明。
void game()
{
char board[ROW][COL]={0};
InitBoard(board,ROW,COL);
display_board(board,ROW,COL);
}
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] = ' ';
}
}
}
棋盘展示:
4玩家下棋
接下来,我们需要在game.c层面实现玩家下棋的代码。
在这段代码中,有三点最重要的需要我们注意:
1.玩家落子需要在棋盘范围内。
2.玩家要在棋盘上空的地方落子。
3.如果输入的坐标不满足要重新输入。
结果如下:
5电脑自动下棋
在实现电脑随机落子的条件下,我们就需要注意以下几点:
1.要在主函数中使用srand((unsigned int)time(0))
将时间作为随机数种子,确保得到的行列坐标是真随机。
2.判断是否在棋盘上空的地方下棋
3.调用<stdlib.h>以及<time.h>头文件
代码如下:
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋:>\n");
int x = 0;
int y = 0;
while (1)
{
x = rand() % row;//0~2
y = rand() % col;//0~2
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
运行结果如下:
6游戏胜负的判断
每一局游戏的结束,我们都需要让电脑判断游戏胜负。在这里我们依然在game.c层面使用Iswin()函数来实现,用Isfull函数判断是否平局。在game.h层面声明函数。
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][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
return board[i][1];//
}
}
//列
int j = 0;
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
{
return board[1][j];
}
}
//对角线
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';
}