大前端

前端学习之家-大前端

C语言简易三子棋-设计与代码实现

三子棋:玩家下棋使用'*',电脑下棋使用'#',哪一方先将三点连成一条线(横着竖着斜着都可以)则获胜。

我的思路是这样的:

分成三部分 test.c, game.c, game.h

其中game.h主要放头文件和各类函数的声明

game.c主要包含游戏的各类逻辑比如电脑是如何下棋的

test.c主要实现游戏主逻辑以及测试

1.test.c

首先,为了使主函数看起来更简洁所以我只放了一个test()函数在主函数内.

 接着,实现test()函数

首先,需要一个菜单让玩家选择玩游戏还是退出,所以我们还需要放一个menu()函数放在test()函数内部. 

接着构思,玩家肯定不会只玩一次游戏,所以函数内部需要用循环实现,因为第一次无论如何都会实现,所以选择do while()循环

因为菜单给了玩家两个选择所以使用switch case语句来判断玩家是想玩游戏还是退出

我们还需要一个整型数字来接受指令(input)

如果玩家输入1则运行game()函数(下面会写), 如果玩家数入2则会退出游戏,如果玩家输入别的内容则会输出”选择错误“,并重新打印菜单让玩家继续选择(不会退出循环)

接下来,需要实现游戏内部的主要逻辑game()函数

首先,需要一个棋盘,我们用二维数组来实现

因为游戏的棋盘需要最先创建所以我们需要两个函数输出这个棋盘

1.初始化棋盘

首先在game.h声明,并引用需要的头文件

 首先,需要定义三个参数,棋盘,行,列

由于考虑到简便原因所以使用

这样如果想更改棋盘的行数和列数会更为方便,不需要一个一个的去改

接着,在game.c里面将棋盘初始化为空格

 

2. 输出棋盘

首先在game.h声明函数

 接着,思考输出棋盘的格式

可以看出*左边和右边都有一个空格,所以打印*和#要注意左右各留一个空格

使用嵌套for循环打印棋盘

首先打印数据,拿3x3的游戏棋盘举例:因为每一行可以放三个数据但是只有两个|,所以打印|的时候j必须小于col-1

接着打印分割行

由于分割行只有两行,永远比总行数少一,所以线判断,如果i<row-1,则打印分割行

接着,思考玩家下棋逻辑,玩家必须下在坐标内值空的位置

先在game.h声明

 

 

 因为需要玩家输入一个二维坐标,所以需要两个输入值

首先使用while循环,因为没有固定次数

 因为坐标为二维数组,下标是从0开始,然而玩家输入是从1开始,所以想要得到玩家输入的坐标是数组的哪个下标需要-1

所以x和y必须大于等于1并且小于总行/列数

如果坐标被占用,则提示玩家并让玩家重新输入新坐标,不会退出while循环

如果坐标非法,原理同上

接着,实现电脑下棋逻辑

 首先,在game.h声明

因为电脑下棋是随机的,所以需要在test()函数内创建随机数

 

然后在game.c中使用computer_move函数

 因为举例用的是3x3数组,所以ROW和COL都为3,x和y都会随即在0-2之间取值

游戏主逻辑最后一步

判断游戏输赢

首先在game.h声明

我使用的,如果判断为玩家赢则返回'*',如果电脑赢则返回'#',如果平局则返回'Q',如果游戏没结束则继续并返回'C'

平局的情况为棋盘上没有空位并且玩家与电脑都没有三点一线

首先我们需要判断棋盘是否满了

 如果有一个坐标是空格则返回0,如果都不是,则返回1

 有三种赢的方式,同一排三个,同一列三个或者对角线三个

如果上述情况都不符合则返回'C'继续游戏

现在,需要回到test.c里面的game()函数完成最后判断步骤

在定义完board数组之后我们需要首先初始化棋盘然后打印

设一个char型代表之前判断游戏输赢的返回值

由于每一回合都需要判断所以使用while循环

在每一次玩家和电脑走完一步之后都需要打印棋盘并判断游戏是否继续,如果返回值不为'C',则跳出循环

 

如果返回值不为C则只剩下三种情况:

1.为'*',玩家赢

2.为'#',电脑赢

3.为'Q',平局

 

发表评论:

Copyright Your WebSite.Some Rights Reserved.