c语言小游戏——贪吃蛇和俄罗斯方块
c语言小游戏——贪吃蛇和俄罗斯方块
贪吃蛇
效果:
运行环境:win10,vs2017
代码地址:https://github.com/zzaiyuyu/Snake/blob/master/main.c
首先思考一下设计这个游戏的流程
model部分
实体有游戏,蛇,坐标,食物,墙,所以我们的模型先抽象出来。蛇用一个链表表示,链表的每个节点都是x,y坐标,蛇还要保存当前移动的方向,方向只有四个所以用枚举。食物也是一个单独的坐标,墙是设定好的一个长和宽。
control逻辑部分
蛇怎么沿当前方向一直移动呢?
在主控制逻辑里写一个死循环,每走一步进程沉睡一定时间,然后能根据蛇的当前方向拿到下一个要走的位置。拿到下一个位置后进行链表的头插尾删操作,这样就有了蛇移动的感觉。
怎样控制方向?
在循环条件中,每次拿到下个位置前,先异步获取键盘按键,看是不是有键被按下,如果有就改变蛇的方向。这样根据方向拿到的下个位置就是新的方向的位置了。但是这还不够,只是方向变了但蛇的身子此时还不应该摆动过来,现在只是头变了,所以考虑蛇行走的过程应该是局部刷新的形式,在循环的每一次执行中,仅仅刷新头部和尾部的显示。
游戏怎么结束?
在拿到下一个位置之前,先判断下一个位置是不是在边界,是不是自己的蛇身,是不是食物。
view部分
想要在控制台精准打印,肯定要用到windows提供的接口。
首先控制光标位置,拿到标准输出的句柄(文件指针),就可以为所欲为的打印了。
计算出游戏界面的大小,画出边界的块块。将画单个块或者擦出单个块的函数抽象出来,因为不仅要画墙,还要画蛇身,食物。
俄罗斯方块
成果:
代码地址:https://github.com/zzaiyuyu/Tetris
执行语句:gcc tetris2.c -L keyboard/keyboard -l keyboard -std=gnu99
思路:
model部分
每一个图形用一个5X5数组表示,有图案则置为1,无则0.这样总共可以把全部的7类图形用一个结构体数组描述出来。
同时游戏还需要当前正在下落的图案的坐标。
control部分
主流程:
主控制逻辑设置一个定时器,并且捕捉ALRM信号,每过一定时间就自动下落一格。
下落过程中需要判断下一个位置是不是可以走,如果可以走,就擦出当前图案,在下一个位置画出来,如果不能走,就是碰到物体了,需要检测是不是该消除,游戏结束,之后就要开始下一个块了。
其中在判断下一步是否可行时,需要当前整个图案信息才能判断是否碰到物体了,所以在每一次碰到物体首先要保存当前的整体背景。
如何控制方向?
在主控流程加一个死循环,不断的判断是否有按键产生。假如按了左键,首先判断下一个位置可行不可行。假如按上键,利用旋转函数对当前图案进行旋转。
如何设置不同颜色块,显示下一个形状?
在定时下落的函数里,如果碰到不能走的情况,说明要出下一个块了,此时设置一个随机数,造成不同颜色块的效果。同理只需要一个临时变量即可记录下一个形状。
view部分
VT100 实现终端画布式打印