如何用c语言实现三子棋

前言

本篇文章主要运用C语言中二维数组的知识来一步步实现三子棋小游戏,进而巩固对知识的理解,提升代码能力。

一:三子棋的游戏规则

开始游戏后玩家会看到一个3✖️3的网格,玩家输入坐标后电脑自动下棋 ,如果三个相同的棋成行,列,或者对角则一方胜利,如果棋盘下满未分胜负,则游戏结束,玩家现选择是否重新玩。

二:创建源文件和头文件

头文件:game.h
源文件:text.c      game.c
text.c包含主函数,用来判断游戏逻辑是否正确。
为了让代码更加简洁,更易于维护,我们把每一个功能的实现封装成函数,game.h用来定义这些函数。
其中头文件game.h用来包含需要用到的头文件,宏定义一些符号常量和声明game.c中的函数。

game.h中包含的头文件:

043e3ecdb8304fc48b5ff27a8324198c.png

 

 三:代码基础逻辑和菜单的打印。

基础逻辑:为了让玩家进行一次游戏后依然能够选择是否重新开始,我们需要在text.c中设计一个循环,并设计一个game()函数,我们将游戏的逻辑写入game函数()中,运行一次game()函数就代表进行了一次游戏。
菜单:在进行游戏以前我们需要知道玩家是否想玩,我们在game.h中声明一个函数DisMenu()并在game.c中进行函数定义(后续函数声明定义都是如此),通过scanf()函数获取到玩家输入的信息,如果为1就进行游戏,0就跳出循环,结束程序 其他就打印输出错误提示,进行新一次循环。

主函数:

4f7213bb4a8f4666a08e0bc43902b81f.png

 DisMenu函数():

67effee313994aceb90ef9092bb22219.png

四:初始化棋盘。

我们先在game.h中宏定义棋盘的规格,ROW代表函数,COL代表列数。

303afa6587794b239e4e4e3a21bd36c5.png

然后在game()函数中定义一个char类型的数组Board[ROW][COL]用来保存棋盘每一格的信息。

16497a9fa1f143d5be4c486323b9ee19.png

声明并定义函数initBoard(),函数传入的参数为数组和棋盘行列数,此时Board数组并没有初始化,为了方便后续判断网格状态,我们统一初始化为’ ’(即空格)。

2886353a41c345b3a9d659ec9b9d3c80.png

五:打印棋盘。

声明并定义一个函数DisPlayBoard(),函数参数为Board数组和棋盘行列数。在主函数中调用DisPlayBoard()函数。注意棋盘打印到每一行最后时一定要进行换行,并且每一行元素打印要用下划线间隔开。

8c9a8d43d94143daa79d1762c7a57ab2.png

2975c6fc01274767aa17b94aa1a2c81b.png

六:玩家下棋

声明并定义一个函数playerMove(),函数参数为Board数组和棋盘行列数。
下棋其实就是通过玩家输入的坐标来改变对应数组中的元素,我们规定玩家的棋为*。

注意:玩家输入的坐标应当是行标列标均从1开始,使用数组进行修改时要将下标改为x-1和y-1,避免数组越界访问。

67ab21f1e4e74771884b08210c3b03b0.png

七:电脑下棋。 

声明并定义一个函数computerMove(),函数参数为Board数组和棋盘行列数。
我们选择让电脑随机下棋 (我不会设计算法,大家可以自己尝试一下),调用srand()函数取当今时间为随机数生成的种子,rand()函数随机生成不为负数的整数,用rand()对任意整数x取余可以得到[0,x)范围内的整数。

b088f56400c84a9585b5f4b00789206d.png

 八:game()函数中的设计

我们想让一次game()函数的执行代表一次游戏结束,三子棋在两方下完棋后如果游戏未结束就继续下棋,使用我们将玩家和电脑的下棋设计成一个循环,如果游戏结束就跳出一次循环。

439da4cffdc0452ebf1b28fc9cbca0e6.png

九:判断游戏是否结束。

我们声明并定义一个函数IsWin(),函数参数为Board数组和棋盘行列数,并且返回可以判断游戏状态的字符。
平局:如果上述情况都不成立,我们考虑是否平局,如果棋盘全满就返回Q,我们声明并定义函数IsFull(),函数参数为Board数组和棋盘行列数,函数返回值为int类型,如果全满返回1,否则返回0。
每一次玩家电脑下完棋我们都进行判断,如果返回值不为C就分别打印结果,并跳出game()函数中的循环,否则玩家继续下棋。

b3721cece57e4dac9e61493eb63a8b45.png

bec64989c72d465a93c98bad3cb284fe.png

我们将判断游戏状态的函数IsWin()放入game函数的循环中,并依据返回值判断游戏是否继续

53a88e5bca4143a69e531eafc14097ae.png

十:完整代码

 game.h

de7b0631d8cf4bc58ecb3edb0a31dfb4.png

game.c

d6f4f7d6f53d4b1d8b9b8b10bf5583cd.png

text.c

94b39a56a98645be9bcd567e92abceb4.png

实际效果图 

f16bafd475e649adbc42545362345f48.png3c5a9d017c0b425e8ebc9d56ffcc3062.png

 欢迎各位指出不足之处,end!

 

猜你喜欢

转载自blog.csdn.net/2301_76269963/article/details/129322381
今日推荐