大话C语言游戏(基础篇)——三子棋游戏实现超详细剖析及优化建议

C语言实现三子棋游戏超详细剖析

目录

文章目录

一.概要

二.整体架构流程&相关知识点介绍

1.流程图

2.相关知识点介绍

三.三子棋实现

1.分文件创建项目

图例

2.整个游戏项目完整代码展示

头文件部分

被调函数文件

主函数部分

游戏各个部分设计细节思路

主函数模块分析

被调函数模块

1.login()函数:登录界面的设置

2.game()函数:游戏的接口函数,整个函数调用的核心

3.InitialBoard(InitialBoard(char chessBoard[ROW][COL], int row, int col)):棋盘初始化函数

4.Display(char chessBoard[ROW][COL], int row, int col):显示对弈过程函数

5.PlayerMove玩家下棋和RobotMove电脑下棋

6.IsFull(char chessBoard[ROW][COL], int row, int col):判断棋盘是否被棋子占满

7.IsWin(char chessBoard[ROW][COL], int row, int col):游戏输赢机制的设定

最终游戏运行过程展示

总结


一.概要

hello,各位对编程感兴趣的小伙伴们大家好鸭!首先很开心大家能够读到我写的文章,同时殷切的希望能对大家能带来一定的帮助!

本篇文章是大话C语言游戏(基础篇)专栏中创作的第一篇文章,在本篇专栏中所涉及都是一些基础的语法内容,对初学者来说是非常容易理解的,相信很多朋友在初学C语言那些枯燥语法的过程中,很容易产生排斥心理,而且对于如何将他们实践运用起来,做一些有意义的事往往无从下手,在这个专栏里由小风带着大家自己动手实现一些有趣的小项目吧,带着兴趣学习将会使得我们学起来产生事半功倍的效果!

废话不多说,我们直接进入主题吧!今天将带着大家实现我们小时候经常玩的一个简单小游戏,虽然玩起来简单,但对于初学者的我们来说还是很有挑战性的,特别是游戏当中所涉及的逻辑关系,还是有点复杂的哈哈哈,看到这里小伙伴们是不是产生了一些畏难心里?

其实完全不用过于担心,学习本就是逆水行舟,而且当我们能亲手实现一个小项目不仅能提升我们自身综合运用和实践能力,我们也会充满无比自豪和满足感,这就是我们编程的乐趣所在!并且小风会带着大家抽丝剥茧逐层理解,让小伙伴们看完后一定会有收获的,主打的就是一个干货满满哈哈!

二.整体架构流程&相关知识点介绍

1.流程图

首先当我们在进行开始着手一个项目的的时候,并不是直接上手直接编程,这样的话效率不是很高,而且如果是想到那些到哪的话,这样将会是我们的程序逻辑感很差,也难以理解,甚至到后可能不得不终止。因此在开始之前,我们的首要任务是对整个项目的框架建设及,就像盖房子一样,后面在对其不断的加工,使得整个项目条理清晰、完整而美观。

下图就是我们所要搭建的一个整体的框架了,虽然简单但却很有必要。

整个游戏我们将拆分成三大部分,登录界面,进入游戏进行对弈,最后便是退出游戏了。

2.相关知识点介绍

在该项目中,我们将会使用哪些知识来进行搭建呢?

首先最基础的便是选择分支结构。在我们项目中存在各种条件的判断及选择,因此选择分支结构使我们程序当中必不可少的一环,其中涉及的有:if...else语句、if...else if...else语句、switch...case基本都涉及,在什么样的场合下,该使用那种分支结构更加合适,相信大家学完之后一定会深有体会的哈哈。

其次便是我们的循环结构了。在游戏当中,登录界面的重置,数组的初始化,以及一些双层循环的控制等等,使用循环结构对整个程序的实现的帮助真的不容忽视。在程序当中:像while循环、for循环以及do...while三大循环均有使用,说到这大家是不是非常期待呢?

然后就是我们的函数了。整个程序当中封装了很多的函数,函数的特点在这就不多说了,但我们设计函数的时候最好是本着高内聚低耦合的特点来设计(即我们设计函数要求独立性强,模块化程度高,每一个函数的分工明确)。向我们项目所涉及的函数有:

  • void Login():登录函数,打印出游戏的登录界面
  • void game():游戏进入窗口函数,调用该函数,开始进入对局之中
  • void InitialBoard(char chessBoard[ROW][COL], int row, int col):棋盘初始化函数,打印棋盘
  • void Display(char chessBoard[ROW][COL], int row, int col):显示函数,将对弈过程中的器具显示出来
  • void PlayerMove(char chessBoard[ROW][COL], int row, int col):玩家下棋函数,让玩家能够操作下棋的位置
  • void RobotMove(char chessBoard[ROW][COL], int row, int col):电脑下棋函数,模拟电脑下棋,其中下的位置设置成为随机值
  • char IsWin(char chessBoard[ROW][COL], int row, int col):判断输赢函数,通过返回特定的字符代表输、赢、平局的各种情况、‘*’表示玩家获胜、‘#’表示电脑获胜,‘Q’表示平局,‘C’表示并未分出输赢并继续进行下棋、
  • int IsFull(char chessBoard[ROW][COL], int row, int col):判断棋盘的位置是否已经全部落有棋子 

这样看下去是否思路已经比较清晰了呢,现在我们只需要完善每个函数的内容就可以了。相信细心地的小伙伴发现了我们的函数名的命名都会尽可能的表示其功能,这样也更能方便我么理解和维护

最后我们涉及的最后知识点便是数组。因为棋盘是一个二维的界面,因此我们想通过二维数组对其进行打印和填充值

三.三子棋实现

1.分文件创建项目

首先介绍一下我们的使用的编辑软件是Visual Studio 2019(其他版本同样可以运行),比较推荐初学者通过这个软件进行学习C语言(当然也有很多其他好用的软件),目前很多高校仍然使用非常古老VC++6.0等一些比较落后的软件,完全跟不上实际的应用而且有些育发液已经过时了,因此我们需要有自己的判断和选择。

为什么推荐读者开发项目,采取份文件的方式?

分文件开发是目前主流开发方式,基本上所有的工程都是这样开发的。分文件可以将将我们的整个项目大致分为三大部分:

  1. 自定义头文件:用于封装整个项目所需调用的头文件、常量的定义、自定义函数的声明。
  2. 函数封装文件:通常需要引用我们自定义的头文件,在这个文件中主要包含的是实现各种功能的函数的定义(也可以将单独一个函数进行封装成一个文件,根据具体的需求)
  3. 主函数文件:整个项目的入口,即只包含了一个main函数

分文件操作的好处:

  1. 便于复用代码。通用性强的重复的功能只要写一遍就可以了,下次要用在其它程序上时只要更改很小的部分或者可以不用更改。
  2. 便于多人协作。在设计软件之初就可以很清楚地分配各个开发部门的任务。模块的编写者本身只要关注他所写的东西,清楚这一部分的功能,留出接口就可以了。另外,对于整个工程的负责人而言,这样会方便浏览全局的工作进度,统筹人员安排。
  3. 便于修改和维护。如果能确定只是某个模块有问题,在模块内解决即可,不需要牵一发而动全身。要升级某一部分的功能,可以只针对具体的模块重新开发,节约成本。

图例

通过上面的图例,我们不仅会产生一个疑问:他们之间是如何建立联系的?

首先,对于这个问题我们不难发现不管是在主函数文件还是封装其他调用的函数文件中他们的头文件中都是引用的我们自定义的头文件:“game.h”

其次就是这个函数文件和主函数文件时通过主函数的调用建立联系,这样三个部分就有机的连成了一个整体

<
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

whelloworldw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值