三子棋小游戏---(C语言)

news2024/11/15 1:52:19

目录

前言:

1.菜单的打印

2.三子棋构思

3.实现三子棋

3.1使用宏的方式定义数组

3.2打印棋盘

3.3玩家下棋

3.4电脑随机下棋

3.5判断结局


❤博主CSDN:啊苏要学习

  ▶专栏分类:C语言◀

  C语言的学习,是为我们今后学习其它语言打好基础,C生万物!

  开始我们的C语言之旅吧!✈

前言:

  在学完二维数组的知识后,我们来应用一下二维数组中的行列思维,敲上三子棋这个小游戏。

链接:二维数组---(行列抽象思维)

1.菜单的打印

  和前面讲到的猜数字一样。玩游戏前需要打印一个菜单,让玩游戏的人知道这是个什么游戏,怎么玩,需要玩家做什么等,我们通过封装一个菜单函数来实现

void menu()
{
    printf("********************\n");
	printf("*****  1.play ******\n");
	printf("*****  0.exit ******\n");
	printf("********************\n");
}
int main()
{
    //接收玩家输入的值
    int input = 0;
    menu();
    printf("这是一个三字棋游戏,请输入>:");
    scanf("%d", &input);
    return 0;
}

  这个时候,在控制台打印出来的效果如下:

  光标闪烁在等待我们输入值。接下来的一步就是:对玩家输入的值进行相应不同的处理,玩家输入1,进入玩游戏的分支,玩家输入0,退出程序,当然不排除一些调皮捣蛋的玩家,喜欢鼓弄,我们使用default(默认)来应付

  补充:return 0;语句在制定规则的时候,一部分人提出希望程序最后可以省略这句话,最终通过了当主函数(仅对主函数)结束时,没遇到return 0;语句,则自动使用return 0;返回。相当于有写return 0;但我们最好写上去

  当然,我们不只是每次都选择一次就结束掉程序比如我玩一把游戏后,还觉得挺好玩,想再来一把,相应的需要把这段代码写成一个循环才能实现

  分析:一运行程序就让我们选择玩还是不玩,如果不玩,选择0就退出游戏,结束循环如果玩,选择了1,在游戏结束后,再次打印菜单让我们重新选择玩不玩。还有就是输入非法值,我们得重新进行选择,最后直到我们输入0退出循环,结束程序

  在这个过程中,一运行程序,不管什么都让我们选择玩不玩游戏,这是循环里的循环部分,符合这种特性的循环是do while循环,一上来就执行一次循环体while()判断部分我们仔细一想,在选择的时候,选择0退出游戏,选择1或选择输入非法值的时候重新执行一次循环体。对应到循环,如果判断表达式是0则退出循环,非0(1或非法值)则继续循环,我们可以得出使用input做循环的判断条件最合适了

  这上面相当于是一个模块,我们理解里面的思想(主要是循环用input当判断条件)就没问题了。博主把这部分当成菜单模块。

2.三子棋构思

  在写代码之前,需要初步思考实现三子棋需要用什么方式实现

  这个棋子与棋子之间分割线,我们使用循环来控制打印就可以了然后是玩家下棋,每下一步棋,都会改变数组里的元素,接着是电脑下棋,电脑下棋也是一样会改变数组元素的,到最后直到有一方胜出或平局结束游戏

  通过简单分析,我们需要创建一个三行三列的二维数组,这个数组起初存放的值我们都初始化为空格,因为空格打印出来看不见接着就是实现玩家下棋的函数、电脑下棋的函数、判断输赢的函数

3.实现三子棋

3.1使用宏的方式定义数组

  函数的声明、头文件的包含,宏的定义都放在.h文件里。.c文件里包含.h文件就可以正常使用.h里定义的标识符以及引用的头文件里的库函数

3.2打印棋盘

  也许对于初学者,打印棋盘是最难消化接收的一个,没事,咱们娓娓道来。

  • 打印数据行

 

  “井”字有三行,二维数组也是有三行。其实棋盘是根据二维数组的大小来变换的我们来看到数据行,数据行有两部分组成,一部分是:空格+%c+空格,另一部分是|(竖杠)

  相信大家都已经懂数据行的打印了(doge),我们看分割行的部分(---|---|---):

  • 打印分割行

  不难发现,打印分割行第的时候,最右边的|还是不需要打印,简直就像是把数据行中,用---替代空格+%c+空格,|还是|一样

  ok,到这里最难的棋盘打印就讲完了,这时候,如果我们改变标识符ROW、COL的值,棋盘的大小也会随之改变因为我们都是使用row,col做控制的,当然这个循环就有变得性啦~ 

3.3玩家下棋

  下棋就是说,把二维数组里的元素改成玩家用的棋子(字符)就行,这样打印的时候,相当于数组相应位置放了棋子一样。电脑下棋也是同理,既然这样,那我们快点来实现吧。

  这里需要提的点是:坐标合法部分为什么是x(1-3),y(1-3)。而且在下棋的时候反而减掉1,这不是没事找事做吗,直接输入(0-2)之间的数不就好了吗?是的,数组的访问下标是从0开始,我们知道是因为我们是程序猿,但玩家不知道呀,把这个游戏放出去,随便拉一个玩家让他输入一个坐标下棋子,玩家想下第一行第一列必定会输入1 1。所以我们程序猿要考虑下用户的习惯,这叫做用户友好,用户并不需要知道程序内部是进行了什么样的操作,根据常识玩游戏就可以了

3.4电脑随机下棋

  我们这里实现的是电脑随机下棋,如果想提升难度,可以对电脑下棋的位置进行更多的操作判断也就是说,当玩家下了某一个棋子后,电脑不是随机下棋,而是根据棋盘上的情况选择下棋,这个棋子对围堵玩家的棋子有效或是对电脑进一步取胜有效

  我们先看一下test.c文件里的调用接口函数情况吧:

  我们说应该是游戏有结果了,也就是人机下棋应该是一个循环,下棋下到能判断输赢还是平局才能退出来。所以应该是这样的~

  那么有读者会问了,如何退出这个一直下棋的循环呢?我们使用判断输赢的函数Is_win,玩家下棋后判断游戏是不是结束了(有一方赢了或棋盘满了),电脑下棋后判断游戏是不是结束了,来退出循环

3.5判断结局

  我们应该怎么设计这个判断结局的函数呢?我们知道三子棋要赢的话,横三列、竖三行,两条对角线都是其中一方的棋子的时候,这时就有一方获胜如果棋盘满了,我们也没有继续的必要了那么我们如何将某一方获胜或棋盘满了或还没到结局需要继续下棋的状态告诉主调函数(game)呢?我们使用如下的返回值

  • 某一方赢就返回赢的条件里任意一个位置的棋子(看下面就理解了~)
  • 棋盘没有满,返回字符'C'告诉主调函数说:"继续下棋"
  • 棋盘满了,返回字符'F'说明棋盘满了

   我们来看一下主调函数的部分:

  再来看实现判断结局部分:

  横三列和竖三行

  对角线

  判断满没满的函数

  好啦,这就是三字棋的全部实现啦。都到这份上了,不玩一把很难收场,博主替大家玩一把并把截图放出来证明可行性~

  抱歉,图片有点长,哈哈~

  其实对于三子棋还有一些改进的地方,比如我们可以设置成五子棋呀;把电脑下棋设智能一点;这些也是可以实现的。还有设置一个图形化游戏界面等等。博主暂且先不研究,后期学有余力再研究写篇博客出来~

结语:希望读者读完有所收获!在学C的路上,祝福我们能越来越C!✔

  读者对本文不理解的地方,或是发现文章在内容上有误等,请在下方评论区留言告诉博主哟~,也可以对博主提出一些文章改进的建议,感激不尽!最后的最后!

  ❤求点赞,求关注,你的点赞是我更新的动力,一起努力进步吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/511961.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kyligence Zen产品体验——一站式指标平台泰酷辣~

文章目录 一、前言二、为什么需要指标化平台三、什么是Kyligence Zen四、Kyligence Zen新特性五、Kyligence Zen注册篇六、Kyligence Zen体验篇七、Kyligence Zen实战篇7.1 导入数据7.2 创建指标7.3 指标分析 八、Kyligence Zen总结篇九、参考资料 一、前言 随着互联网和物联网…

tomcat集群下的session共享和负载均衡(redis实现)

环境 操作系统:windows tomcat1:Apache Tomcat/7.0.52(8085) tomcat2:Apache Tomcat/7.0.52(8086) jre:1.7.0_80 nginx:nginx-1.20.1(8070) redis…

基于 SpringBoot+WebSocket 无DB实现在线聊天室(附源码)

文章目录 基于 SpringBootWebSocket 无DB实现在线聊天室0 项目说明0.1 样例展示0.2 源码地址 1 WebSocket 简介1.1 HTTP1.2 WebSocket1.2.1 WebSocket 协议1.2.2 WebSocket 交互 2 使用教程2.1 客户端(浏览器)2.1.1 WebSocket 对象2.1.2 WebSocket 事件2…

重装系统后,qt5.11.3升级到qt5.12.6所遇到的问题

前提:重装了系统: c/qt windows10 语音模块TTS异常,数据库缺少驱动 一:语音模块不能播放 qt使用语音模块时,在初始化时出现异常: onecore\com\combase\dcomrem\resolver.cxx(2299)\combase.dll!00007FF8…

Oracle存储过程~封神之路

简介 Oracle 存储过程是 Oracle 数据库中的一种数据处理对象,它可以在数据库中定义一组预定义的 SQL 语句,用于完成特定的数据库操作。存储过程可以被授权的用户调用,并且可以执行多个语句,这些语句可以被视为一个单独的操作&…

“深圳首届十大金口碑人物”优必选科技创始人兼CEO周剑获此殊荣

深圳晚报社联合深圳市诚商信用评级有限公司、深圳市诚信营商促进会和中国善网,共同举办了首届“金口碑”评选活动。活动涵盖多个领域,历经多个环节的评定和实地走访,最终有10名个人、20家企业和70家商户成功获得“深圳首届十大金口碑人物”、…

Visual C++实现推箱子游戏的核心算法设计与实现(附源码和和资源)

需要源码和资源请点赞关注收藏后评论区留言私信~~~ 在前面的博客中已经讲解了推箱子游戏的菜单和各种对话框的实现,下面对推箱子游戏的核心算法设计和实现进行讲解 一、地图文件读取模块的设计与实现 地图文件读取模块,主要负责将地图文件进行读取&…

【AI大模型】“讯飞星火”认知大模型正式发布 计划10月底赶超ChatGPT

文章目录 前言你使用过这种对话式AI吗?有什么看法或感受?“讯飞星火大模型将超越chatgpt?”这类型的人工智能对现在的社会有什么意义?这类型的人工智能,未来前景如何?申请体验写在最后 前言 5月6日&#xf…

科普:跨链桥是如何被黑的?

科普:跨链桥是如何被黑的? [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hbvPVTkb-1666679410875)(htTPS://tva1.sinaimg.cn/large/e6c9d24ely1h4r0auxvmxg20tr04ojug.gif)] 跨链桥是一种允许两个独立区块链网络之间进行通信…

【git】用好 stash,工作超nice

一、介绍 如果修改后的内容还不想commit,就可以用git stash命令。它会将工作区和暂存区中的修改(也就是还没commit的内容)都会被保存到堆栈里,并在之后恢复到任意指定的分支上。 二、应用场景 1、在分支a进行开发feature 1时,突然需要紧急…

【AI大模型】讯飞星火大模型能否超越chatgpt?

文章目录 前言你使用过这种对话式AI吗?有什么看法或感受?“讯飞星火大模型将超越chatgpt?”这类型的人工智能对现在的社会有什么意义?这类型的人工智能,未来前景如何?申请体验写在最后 前言 5月6日&#xf…

机器学习-10 聚类算法

聚类算法 算法概括聚类(clustering)聚类的概念聚类的要求聚类与分类的区别 常见算法分类聚类算法中存在的问题 距离度量闵可夫斯基距离欧式距离(欧几里得距离)曼哈顿距离切比雪夫距离皮尔逊相关系数余弦相似度杰卡德相似系数 划分…

建造者模式详解:建造随意搭配的肯德基套餐

一、简介 建造者模式(Builder Pattern)是五种创建型设计模式之一,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。这句话怎么理解呢:一个对象的构建过程本质上就是这个对象包含的所有成员…

一觉醒来IDEA感觉不香了,AI智能编程工具Cursor使用

一、简介 为使用人工智能编程而构建的编辑器,一款人工智能编程软件、智能Ai代码生成工具。 它有什么特点呢? 集成了GPT-4,国内可用,不仅有ChatGPT的聊天功能,还有强大的自动代码生成能力,简直是编码神器。 …

Java中常见的几种数组排序方法

这篇文章总结一下我学习到的几种常见的数组排序方法 冒泡排序 冒泡排序在我看来是最简单、最基本的排序方法,我们应当将冒泡排序的原理和代码熟记于心。 冒泡排序的原理十分简单:用数组的第一个元素和第二个元素进行比较,将大的放到后面&a…

【Java编程系列】Minio实现文件上传下载

热门系列: 【Java编程系列】Amazon S3实现文件上传下载 目录 热门系列: 1、前言 2、Minio实战代码 2.1 Minio环境部署 2.2 Minio的Sdk对接实现 2.2.1 Minio Maven依赖 2.2.2 minio配置与初始化 2.2.3 上传文件 2.2.4 下载文件 2.2.5 生成文件…

【LLM大模型】LLM模型和指令微调方法

note 文章目录 note零、AIGC生成式模型1. 核心要素2. LLM evolutionary tree3. 几个bigScience里的概念 二、LLM大模型1. ChatGLM(1)GLM-130B(2)ChatGLM-6B 2. LLaMA3. RoBERTa4. Bloom5. PaLM 三、模型指令微调1. 指令微调的注意…

使用Vue+Vue-router+el-menu实现菜单功能实战

前言 上节回顾 上一小节我们使用H5+CSS3实现了管理平台的架构布局,并且通过Vuex的使用,获取到前端数据本地化存储的username,绑定到右上角进行全局展示。还不了解上下文的同学可以回顾一下 使用Vue+Vuex+CSS3完成管理端响应式架构模板实战 。 本节介绍 本小节已经是专栏的…

【C语言】字符串---刷题篇

1.统计字符串中元音字母的字数 2.使用起泡法和选择法将字符串按ASCII码值从小到大排列 3.将字符串中的数字字符倒置,即‘0’变‘9’、‘1’变‘8’、…、‘9’变‘0’.例如:字符串“a1b2c3d4e9f0”倒置变为“a8b7c6d5e0f9 4.将一个字符串中从第m个字符开…

187页9万字企业大数据治理与云平台实施方案(word)

1 项目背景概述 1.1 项目背景理解 1.2 项目需求范围 2 项目技术方案 2.1 咨询研究服务方案 2.1.1 咨询研究服务内容 2.1.2 咨询服务方案 2.2 第三方独立评估 2.2.1 概述 2.2.2 管理办法 2.2.3 考核机制 2.3 安全咨询研究服务方案 2.3.1 安全咨询服务内…