基本思路:
1、测试游戏的逻辑
2、游戏代码的实现
3、游戏代码的声明(函数声明,符号定义)
所以,我们要在VS编译器下分别创建
test.c
game.c
game.h
这三个文件。
首先要在命令窗口显示一个供玩家选择继续游戏或者退出游戏的菜单。为了方便后面代码的实现,我们可以设计当玩家选择1时,进行三子棋游戏。选择0时,退出游戏。
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include
menu() {
printf("******************************\n");
printf("**** 1.play 0.exit ****\n");
printf("******************************\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:\\注意这里case和1之间要有空格
printf("三子棋\n");
break;\\每写完一个case的时候最好下面要跟一个break
case 2:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
走到这里win+F5测试一下你的代码有没有什么问题
如图所示:
没有问题的话就可以改一下main函数里的代码进行进一步的实现了
int main()
{
srand((unsigned int)time(NULL));//设置随机数的生成起点的
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1: //case和1之间的空格不要丢了
//printf("三子棋\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
2、实现三子棋游戏环节
(1)初始化棋盘:
这里可以看到,一开始棋盘中已经打印了一些东西,但是看不见,就给我们一种感觉什么都没打印,其实这里已经提前把3*3的二维数数组先初始化为空格,所以这里就要写一个初始化函数把数组里的元素先都赋值为空格。
代码如下:
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++)
{
//打印数据
//printf(" %c | %c | %c \n", board[i][0]);
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");
}
}
}
(2)游戏环节:
下棋可以大致可以分为这么四步:
这里我们就先让玩家先手吧。
一、玩家下棋。
二、判断输赢。
1、我们这里约定如果玩家赢了就返回 *
2、如果电脑赢了就返回 #
3、如果平局了就返回 Q
4、如果以上情况都没发生,说明游戏还要继续,那我们就返回 c
三、电脑下棋。
四、再次判断输赢。
然后循环这个过程
当有一方胜利之后,玩家可以选择继续游戏或者是退出游戏。
void game()
{
char ret = 0;
char board[ROW][COL] = {0};
//初始化棋盘的函数
InitBoard(board,ROW, COL);
DisplayBoard(board, ROW, COL);
//下棋
while (1)
{
PlayerMove(board,ROW,COL);
//判断输赢
ret = IsWin(board, ROW, COL);
if (ret!='c')
{
break;
}
DisplayBoard(board, ROW, COL);
ComputerMove(board, ROW, COL);
//判断输赢
ret = IsWin(board, ROW, COL);
if (ret != 'c')
{
break;
}
DisplayBoard(board, ROW, COL);
}
if (ret=='*')
{
printf("太棒了,你赢了\n");
}
if (ret=='#')
{
printf("电脑赢了\n");
}
if (ret=='Q')
{
printf("平局\n");
}
DisplayBoard(board, ROW, COL);
}
玩家下棋:
玩家下棋函数的实现
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家下棋:>\n");
printf("请输入坐标:");
scanf("%d %d", &x, &y);
while (1)
{
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐标被占用啦,不能下棋了呦,换换别的位置吧!\n");
break;
}
}
else
{
printf("你输入的坐标超出了范围,请重新输入吧!\n");
break;
}
}
}
注意这里不能输错,否则下一步电脑会进行下棋
判断输赢:1、我们这里约定如果玩家赢了就返回 *
2、如果电脑赢了就返回 #
3、如果平局了就返回 Q
4、如果以上情况都没发生,说明游戏还要继续,那我们就返回 c
判断输赢函数的实现
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][0] != ' ')
{
return board[i][1];//返回什么符号,就对应的玩家赢了
}
}
//判断列 行就是0,1,2. 画图看看
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][1] && board[1][1] != ' ')
{
return board[1][1];
}
//没有人赢,棋盘满了,这时平局了
if (IsFull(board, row, col))
{
return 'Q';
}
//游戏继续
return 'c';
}
电脑下棋:
电脑下棋函数的实现
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;
}
}
}
再次判断输赢:
和判断输赢代码一样,可以点右边的目录回去看一下。
三、 最终代码game.h
game.c
test.c
这里是最终代码的链接
萌新小白结合大佬的知识写的,请大佬们多多指教
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)