三子棋的设计以及设计思路

顾名思义,三子棋,是一种游戏吧,而当我们进入游戏时,往往是能看见一个游戏菜单的。所以,我们的第一步就是制作一个游戏菜单。让我们先来设计一个游戏菜单。

1.游戏菜单

应用库函数自带的printf函数打印游戏菜单,自定义的menu函数没有返回值,故用void的类型。不过这个游戏菜单可以根据各位老铁的喜好,自行调整。

但光有一个菜单空壳,我们没法进入游戏哈,所以我们该咋办呢?

当然是给我们上面菜单的两个选项对接接下来的操作啦。

我们可以输入“1”来开始游戏,或者“0”退出游戏,还有些老铁很调皮就是不输入“1”或者“0”,输入一些其他的数字。

我们瞧,我们有这三个选项,所以我们可以用快乐的选择语句。if语句当然可以,不过我更喜欢switch语句。不过如果有些老铁输错了数字,我们总得给这些老铁一次机会吧,让他们重新试一次,那我们就在switch语句再来个循环语句。当然我们肯定得先输入数字,再判断老铁要不要再输入一次,所以我们选择先执行后判断的do-while语句。

游戏菜单做好了,接下来让我们进入游戏 。

想必老铁们肯定注意到了上面的game()了吧,那就是我们进入游戏的端口了。

2.棋盘的相关设计

当然,三子棋,三子棋,我们肯定得有棋子啦。所以我们的第一步就是做出几个棋子了。

不过我们总不可能去店里买几个棋子塞进电脑里吧,那该咋办呢?

 棋子是放在棋盘上的,像不像我们把值放在数组里呢,要不我们试试用数组里的值来当棋子呢?先试试再说。

我们想想啊,三子棋需要几个棋子呢?3×3=9。棋子数=行数×列数;而行数和列数我们是经常用到的,我们不妨定义列数和行数的标识符常量。

我就用“*”作为自己的棋子,用“#”作为电脑的棋子。

那现在让我们来定义一个char类型的二维棋盘数组

而接下来,让我们来初始化数组来设置棋子。

定义一个棋盘数组初始化函数

因为我们还没落子嘛,所以我们先把棋子初始化成“ ”,当我们或电脑落子时,用“*”或者“#”替换“ ”

因为我们需要利用到棋盘数组,以及棋盘的行数和列数,故我们引入这三个值作为形参(之后定义的函数也是如此),且我们不返回值,故函数类型为void类型。再利用两次for循环,将棋盘数组初始化。

棋子已经做好了,接下来就是画棋盘了

这就是三子棋的棋盘了,一个九宫格。 

我们的棋子,也就是数组里的值就放在这里。可以看出我们棋盘的分界线都是出现的第1,2行和第1,2列后面,或者说是第1,2,row-1行和第1,2,col列后面。我们从第一行开始演示,我们可以先用printf(“ %c ”,board[1][1])在左上角的位置落子,然后用printf(“|”)打印后面的分界线,然后再用printf(“ %c ”,board[1][2])在下一个位置落子,然后用printf(“|”)打印后面的分界线,之后是用printf(“ %c ”,board[1][2])在下一个位置落子。再利用printf(”\n“)换行,同理,我们用"---"替换上述的数组,其他操作不变,打印处行的分界线。所以我们就可以得到

 现在我们已经把棋盘和棋子做好了,现在该我们上场表演了。

3.玩家操作设置

我们落子肯定需要一个坐标(x,y),而我们的棋盘是二维的,所以我们需要输入两个数字进行定位。

可万一我们的老铁输入的坐标(x,y)超出我们的棋盘,又或者是上面已经有棋子咋办呢?

我们可以通过if语句对x和y的范围进行判断,看看老铁们的坐标是否超出我们的棋盘。

那如果对应位置上已经有棋子了怎么办?

老铁们,还记得我们对棋盘进行初始化吗?

倘若没人在上面落子,则该位置的值应为" "。如果该位置的值不为" ",则说明该位置已有人落子。

所以我们可以得到

我们设置完玩家操作以后,继续设置电脑操作。

4.电脑操作设置

这是我第一次编程三子棋,且对编程的技术不太了解,我试着将两个随机数作为电脑落子的坐标。要获取随机数,我们需要rand函数。

但要注意的是,引用rand函数的前置条件是引用srand函数,而引用srand函数又需要引用一个随机的无符号整形,如果无符号整形不是随机的话,则每一盘游戏中,电脑获得的坐标获得的坐标都是一样,导致电脑操作过于呆板,让玩家有迹可循。这个时候我们就需要调用时间戳。格式如下

需要注意的是,时间戳只需要在主函数内调用一次便可,如果放在电脑操作函数内可能因玩家操作过快,导致电脑获得的随机数过于接近。

而获得两个随机数肯定是有大于棋盘范围的数存在的,这时我们可以采用求模运算,来获得棋盘范围内的随机数。其他操作与玩家操作相同。具体步骤如下

 玩家操作和电脑操作都设置完以后,我们发现我们好像还缺点什么。

5.胜负判断设置

我们总不可能一直落子下去吧,肯定是有胜负关系的。

当率先三子练成一线的一方获得胜利。

倘若棋盘下满,却无人获得胜利,则双方达成平局。

因此,我们还需要一个判断胜负的函数。

数字连成一线可以是一行的三个棋子,也可以是一列的三个棋子,或者是主对角线或副对角线的三个棋子。我们可以通过返回棋子的值来判断该棋子属于玩家还是电脑。

判断(行)

 判断(列)

判断(对角线) 

而进行判断的前置条件则是棋盘没有下满,故我们还应先设置一个人判断棋盘是否下满的函数

 

倘若下满后则返回1,未下满则返回0;

故如果在判断胜负的函数内加入 

倘若下满后,进入if语句,返回‘Q’,若未下满,则返回‘C’。

到这,我们已经把所有需要的前置工作干完了

6.相关函数的声明,以及对三子棋代码的逻辑排序 

首先是对相关函数的声明,定义一个头文件,将相关声明放入。

 其次是三子棋代码的逻辑排序首先是主函数

其次是game函数 

 

就这样,一个简单的三子棋代码完成了。

 

我赢了,老铁们,你们呢?

 

这是我第一次编写三子棋,并对相关操作和思想进行解释,如果有什么不足或者有什么可以优化的地方,我在这向各位老铁求教,也谢谢各位老铁能看到这里。

https://gitee.com/LJX551126953/c-language(内附三子棋代码)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值