从零开始的C语言小游戏之路(总)
【
预览区
】
Ⅰ前言:
1.这里具体介绍下如何入手C语言,如何去写C语言小游戏。由于我也只是自己对于这方面有兴趣自己探索出来的学习方法所以仅供参考。
2.写C语言游戏可以增强学习的乐趣,锻炼逻辑思维,为以后的学习道路做铺垫。虽然他并没有实际价值,没有学爬虫学unity写游戏来的快,但这是对基础东西的运用。
3.本教程采用的是纯C语言内容,不附带任何复杂的图形库,api等高级操作。
后续很多是基于我的作品和知乎童晶老师的专栏进行讲解的
基础准备
1.初学:
学完基础知识,学到指针前(指针对游戏不是必要的)。千万不能跟着老师的进度。要明确老师是有计划讲课程的,不可能会走非传统路线直接给你走大纲,毕竟不是每位同学都能跟上。所以前期一定花时间自己把C语言学完,什么叫学完:把书上基础内容过一遍,书上的题目网络上都有最简单的题库,找学长或者老师推荐一些基础题库:把基础的题目全过一遍。例如水仙花数,最大公约数,鸡兔同笼这类基础。如果不写这些题目,那就相对于完全没有编码能力。这里锻炼的是你对语言的掌握能力。千万别只看书。这里大概花费1个月的时间,从大学军训到10月初,这段时间也正是最闲的。刷题其实刚刚学的时候会保持最大的兴趣,就趁这段时间能刷多少是多少。
2.入门:
掌握一定的逻辑技巧,能独立完成课本上的基础题(切勿看例题再做)这里建议初学的时候任何基础题目都要自己去想解法。比如求最小公约数:一定要当成思考题一样去用自己想法模拟出来(从2例遍去寻找等等方法),趁着大一上空闲,多思考。如果直接就上辗转相除法,除非是数学鬼才,不然就是直接看的标答,没有意义且不利于锻炼初级思维。这里是注意一些技巧,推荐
《啊哈C!思考快你一步——用编程轻松提升逻辑力》(d9oe)
这本书[有能力买书支持下,也能私信我邮箱发电子书过去]。一定在自己看完基础之后把这本书快速过一遍。因为这本书面向小学生(滑稽),会用最简单的语言给你把知识点讲透彻。可以加深理解。
3.进阶:
这里你应该用一个月时间做到了能把C语言基础小题目秒杀了,大概要刷50个简单小题目。这时候就要进阶了,有能力的可以去
PTA
做乙级题目。这里的题目十分适合进阶,增强模拟能力。写这些题目可能会很累,但通过百度解题加深理解,你可以学会许多巧妙的技巧,加深你的代码能力。能力有限就建议去
CCF
跟中小学生对线(滑稽)。开玩笑的,因为这个题库是对中小学生开放的,但也适合大学入门,这个题库难度也适中,觉得PTA太难就去这里刷题。建议刷一个月,刷上个30多道就差不多了。
等等为什么写游戏我要刷这么多题目呀
?我可以明确的是入门C语言不去锻炼代码能力是走不太远的。我算法能力可能有限,但通过这些能做到对代码掌控的很厉害。这时候你才有能力去写游戏。
注意是写游戏,不是复刻游戏
,会打字的人都完全由能力跟着教程去复刻一个游戏。关键在于他对代码能不能理解。对语言掌握熟练的人去学习别人代码能理解别人为什么这样做,学会其中的巧妙,之后能变成自己的东西,即使不是做游戏,你这种思维也能拉升到学习其他语言上去。而基础不够,课程答辩跟着网上教程写个贪吃蛇,听着部分懂,自己也敲出来了,但实际上再写一次就完全不知道该如何下手,隔段时间就差不多丢了。就完全没框架概念。所以进阶就是锻炼自己的代码水平。这里可以先尝试写个自动进行的游戏:
弹跳球
Ⅱ入门基础的wasd移动游戏
小游戏类型:走迷宫、五子棋、象棋。
我们可以带着一下问题去看这小节。
小游戏是如何让物体动起来的呢?人物是如何移动的呢?如何让棋类游戏不是简单的输入坐标下棋,而是自己控制下棋呢?如何写个游戏菜单界面呢?
一、写出第一个小游戏—走迷宫
1.预览你要学会了一下几点
- 如何建立|储存地图
- 如何读取键盘上的键位
- 如何控制移动小球(消去原来的,存储新的)
- 如何判断边界
- 如何刷新屏幕
2.具体步骤:
**重要的来了!!!**上面推荐啊哈C!这本书的第二个原因就是后面有游戏章程。你就是完全初学,跟着他通俗易懂的介绍,都能写出走迷宫出来!!这里建议跟着书一步步走,可以在达到我上面说的入门水平就进行这步了。
这里默认你做完了准备前几点。有独立思考能力,有基础码代码能力,有基础的理解能力了。
首先完成对走迷宫的复刻,自己写出代码来,(这里是我敲好的可以复制跟着那本书讲解看,有基础就直接读代码:
懒人链接
)。没基础的不建议复制代码,最好自己跟着课本走。最后保证会报错。原因在于getch()已经不是以前那个版本了,他头文件不是教程里面的stdlib,你需要改变头文件,具体把stdlib改成什么,自己学会百度。(算了,#include <conio.h> )。
3.总结:
这里你会写出能移动的小球,第一次看见枯燥的代码终于能和键盘进行交互了。我们学逻辑的适合写过猜数游戏。虽然能交互,但那并不是真正的可控制的,写完这个如果用心的人应该会感到兴奋。这时候不应该自己再创造个更大的地图,加入一些奇怪的元素去扔给同学去玩吗,哈哈。
二、走迷宫拓展-五子棋 & 中国象棋
有兴趣可以了解下这里都是基于走迷宫的拓展。
如果看不懂可以直接跳转看Ⅲ。
ps:我可以确定写游戏只需要上面的那些知识点。我后面的程序全是在这个基础上拓展的
1.知识点概览
核心:把走迷宫的小球看成你游戏的光标,在画板上绘图,我们能控制的单位体就是这个小球。
学会移动小球后原来的坐标可以保持原来的值。但按下空格后会在原来地图留下小球痕迹。
- 拓展wasd移动的利用
- 尝试把逻辑代码加入游戏(判断五子连珠,判断象棋杀棋)
2.思路介绍
下棋:
这里首先可以拓展下五子棋。在前面学会wasd移动小球的时候,思考能不能设定按下空格就把小球的残影留在原地呢?这里请先自己思考如何实现,如果你没有弄清楚前面走迷宫的代码,或者你没有思考,那么抱歉,后面的步骤都无法进行。
我们这里提供一种思路:先理解移动原理 :按下右键后系统执行的是判断右边是否墙壁-消除原坐标小球-往右边插入新小球。我们要设定这次按了空格,下一次移动后原坐标就不清除而保留在原地。这样就实现了“下棋”。具体怎么让他不清除呢。这里采用逻辑实现请自己思考(提示一种用flag控制)。
交换下棋:
我们就有问题来了,比如如何交换下棋,比如如何防止在同一个地方重复下棋,如何防止越界,如何判断游戏回合。此处我们参考
用c语言实现简单的五子棋
取棋子:
那么问题来了,如何取棋子,如何下棋子,如何判断敌人。这里跳转
用C语言实现中国象棋
3.总结
这个阶段需要不断的去探索。如果你能独立在看完教程后用自己的思路写出游戏来了那么恭喜你可以继续进阶了。
三、游戏界面基础设计
1.知识点概览
- 图书馆管理系统
2.具体
我们学图书馆管理系统可能感觉很单调。但其实他的选择结构为之后的游戏菜单做出了大铺垫。
看这里
游戏菜单界面设计 与 游戏整合
3.总结
这里就做出了像样的游戏了,有菜单,有介绍,有游戏。但是我们想想游戏是不是还缺少很多元素呢?
比如菜单选择游戏居然要输入数字去选择。游戏刷屏严重。游戏没有动态加载等等问题。这里后续进行讲解。
Ⅲ”多线程“入门
小游戏例子:打飞机,fly bird,小人枪战。
可以带着下面问题看此节。
如何同时能操作飞机,并且飞机的每颗子弹能同时自动运行呢?如何设置双角色写个双人小游戏和朋友一起快乐呢?
一、打飞机游戏(人物移动+子弹移动)
1.知识点概览
- 学会人为输入更新与系统自动更新
- 学会多角色控制
2具体
先学会如何巧妙的储存各种物体的状态。不是常规的直接用字符去存。
而是用数组去存,而画面是经过处理再出现的,这样十分方便系统后台去进行逻辑判断。
毕竟你告诉计算机1这个数字就是飞机,比告诉他飞机的概念更简单吧。再学多线程处理
这里十分推荐童晶老师的教程
多线程讲解
。跟着他学一遍如何写打飞机就清楚啦。
3.拓展:
到这里了要自己学会运用,不能就满足于复刻一遍打飞机游戏。至于怎么运用,这是你该思考的。
我就举个例子吧。这里学了打飞机,你学会了什么?控制飞机,控制子弹。那我们拓展一下。把上面学的
弹跳球
和这个结合下呢?让飞机变成小人,让子弹变成可反弹的。很简单吧。再拓展下,我们加入两个小人呢?我们把数
字键位也设置个上下左右你能思考写个游戏吗?
不能那就给你看看我写的小东西吧(滑稽)
具体实现思路在此处讲解。
双人格斗小游戏
Ⅳ减少刷屏效果 & 隐藏光标
例子:玩个贪吃蛇或者一个简单的多线程游戏画面刷新的比你按键盘还带劲。影响视线影响体验。
这时候就需要了解一个新的东西了;
1.知识点介绍
- gotoxy()函数
- HideCursor() 函数
- gotoxy巧妙使用
2.具体
函数具体就下面,直接调用就是
gotoxy是把光标定位到某个地点,然后进行操作。
HideCursor()直接表示光标下面那个杠隐藏就不会太花。
void gotoxy(int x, int y) //坐标函数
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle, pos);
}
void HideCursor() //光标隐藏
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
gotoxy(x,y)使用方法,他参数是第x列第y行,和常规二维数组有差别,注意。
这就相当于我们前面的小球啦。只不过这里是直接定位打印。
他可以全局谁动他就画谁。而不像前面system(”cls)动一个点要重绘全局。
差别是他作用的是屏幕已经打印的,不能直接作用后台的map这些存放地图的数组。
比如1移动从100 —> 010这里就先自己数清楚1的前后坐标。先gotoxy前坐标
printf 0再gotoxy后坐标printf1就这样啦。
但有个问题,比如我后台是利用map数组去判断值,我必须改变map数组呢?
这里就逻辑存储嘛。你先gotoxy到前坐标的printf 0的时候顺便map【x】【y】就等于0
gotoxy(y,x)到新坐标printf 1的时候就顺便map【x】【y】 = 1就行了。
这里我们前面的所有移动都变成每次移动不是用全屏了,而是只要有谁动了。
就马上执行上面的步骤,到就坐标消除原来的打印,再到新坐标打印新的内容。
这里可以参考这个,没用gotoxy简直就是全程刷屏,利用gotoxy后十分顺滑。
汉诺塔递归程序
(该程序采用逻辑实现,有能力也能自己去尝试喔)
3.总结
gotoxy能保证游戏不会出现很严重的刷屏,适合进阶使用。
Ⅵ高级进阶技巧
小总结(持续更新)
- 一些小技巧:next(4)(2) 数组,我们利用数组储存wasd移动的状态,然后按下a的时候对应就直接去next数组里面获取x和y应该移动的距离可以减少代码量,巧妙运用能写出很高级的东西。
- 目前没想到了,先看后面吧
一、动态加载
例子:菜单动态载入,载入菜单有进度条,
汉诺塔递归程序
提示进度,模拟笔记本的开机加载动画。
游戏怎样能花里胡巧?答案是能怎么花里胡巧就怎么花里胡巧。。。
哈哈,其实是增加细节效果啦。
1.知识点概览
- 菜单进入效果
- 伪加载条进度条效果
- 游戏结束效果;
2.具体
首先啥事动态效果,答案就是不用一次加载完啦。这里我们使用Sleep函数配合for循环打印地图的时候。我们慢慢的打印,就在for循环里面加入一个Sleep(50),就没0.05秒显示一行,就有了动态载入画面的效果了。这里的效果可以体现在我游戏里面很多地方。
其次是进度条效果,当然是伪造的啦,C语言程序时间短的你没反应过来他就加载完了,长的例如汉诺塔长的可能你挂一天电脑都打印不完。但他们都能成为我们动态加载的对象。具体方法就是设定好打印框,然后自己逻辑去实现。具体方法参考
动态加载
的前面讲菜单加载部分。
最后就是游戏结束啦,通常会写个结束画面。参考
动态加载
的结束画面。可以利用百度点阵字体,自己人工把结束页面写好然后再载入啦。
看到这里,或者能学到这里就差不多很厉害了,这里就差不多能自己去探索写游戏了。
此处我介绍几种技巧:
二、移动wasd选择菜单
例子:菜单上下移动选择功能,模拟笔记本键盘控制,模拟笔记本键盘控制模拟笔记本的桌面。
最常见的就是利用输入数字去选择程序功能。这种方法显然需要改进。但每次都写一个方法去解决不同游戏是不是太麻烦呢?显然我们需要自己构建一个函数进行显示移动选择。
1.解决思路
设定一个move函数,他要模拟游戏的选择菜单,他能做以下几件事:
- 定位初始菜单位置
- 能显示表示这是个光标
- 确定移动一次对应的距离
- 确定移动的范围
- 按下确定能区别这指向什么功能
2.具体
当我们能实现上面的功能时,假设进入菜单,我利用menu数组打印了菜单界面。
此时我们应该有个代表光标的物体指向功能一,我们按下s时,它会向下移动指向功能二。
我们按下空格确定,它能返回后台设置好的值2,然后用if语句判断到返回的2就进入功能函数二。
具体实现思路见
移动选择菜单功能
3.总结
我写的这个move函数功能十分强大,它能通过相应调整兼容不同程序。实现很强大的作用。具体还是要自己去思考。
三、游戏框架的搭建
1.知识点概况
- 写游戏流程图
- 理清函数关系
2.具体
就写游戏能有好的规划,把框架搭好后写的就很顺利,只要填补下就好了。
这里给个我经常用的小
框架
。
四、动态菜单背景
有些游戏就进入菜单的时候它的背景是游戏时的内容。比如打飞机,开始菜单他是有功能选项+游戏内容自动播放。我们这里就要实现模拟这个。
例子:神庙逃亡菜单,打砖块菜单;
1.解决思路
这类游戏进入游戏都会开始。为什么不直接在开始界面增加个判据呢?
我们flag = 0,游戏未开始,但我们先加载好游戏资源,此时我们要人为的输入只能控制菜单选项。
而游戏内容是人为输入的权限关闭,而背景是自动播放的即可。
2.具体
说起来很简单,但实现是很麻烦的,此处有能力就建议直接看源码参考,或者自己思考实现。参考代码神庙逃亡,打砖块。
五、加入创新元素
就这里差不多结束了,这里所有的功能都是我走出来的。反正加上一些逻辑处理,就能实现很多有趣的东西了。
~END
待更新。2020年的游戏都没有写教程,因为太复杂了,每个程序内容以及复杂度都是以前游戏的倍数。
而且游戏越复杂,我的逻辑越难表达。所以后续的程序教程都在源码的注释里面。有兴趣的可以去
Github
看源码学习。总之希望能帮到一些想入门C语言,或者想拓展下的人吧。