从C语言到第一个黑框游戏

从C语言到第一个黑框游戏


0.序言

经过一整个学期的学习,同学们对于C语言是从入门到放弃呢?还是从入门到绝望

enter description here

1

其实与纯粹的理论学习不同,编程是一门实践性很强的学问,擅于将书中所学用于实践才能真正学好编程,发现编程的乐趣。在此,我想简单讲讲如何用大一上学期学会的C语言,来编写一个简单的贪吃蛇游戏。(ps:在这里,我只想写思路,而不介绍具体的编程细节,因为希望你更多的能从这篇文章中学习将知识应用于实践中的思考方式和能力。)

1. 准备

我们知道,刚开始学习编程,用C语言在黑框框中将数据输入,然后经过一系列逻辑处理再输出出来,好像就是C语言所能达到的极限了?其实不然,只要善于发挥想象力。不过,在一切开始之前,我们需要对任务进行简单(fu za)的分析:

2. 功能需求

首先,我们要有一条蛇,其次我们要让它动起来,接着再随机生成一些“食物”,当蛇头碰到食物时,蛇的长度便增加,如果蛇头撞到墙,那么游戏结束。为了美观,我们用特殊符号●表示蛇,用★表示食物,用■表示墙。这些符号不难找到,但是我们还需要知道他们对应的ASC码,怎么做呢?很简单,输入符号型,输出整型即可。

3. 一些必要的工具

根据功能分析,我们需要在屏幕上的任意位置打印出蛇和食物,所以我们需要一个能够将光标移动到运行框任意位置的函数:

#include<windows.h>
int gotoxy(int x,int y)
{
	COORD cd;
	cd.X=x;
	cd.Y=y;
	return SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cd);
}

我们还需要能够实时获取键盘输入的函数,这里要稍微提一下,我们用输入设备进行输入时,操作系统会将这些输入以队列(先进先出)的形式存储在输入缓冲区中,然后依次读出给相应的应用使用。所以我们需要有一个函数判断,当前键盘输入缓冲区中是否有值,如果有,则读出来。这个判断的函数我使用:kbhit()。所以就有:

if(kbhit())
{
		getch();
}

在写贪吃蛇之前,我也不知道有这些函数的存在,所以说需求永远是学习的第一生产力

4. 让蛇动起来

相信大家都能很轻松的将界面和蛇打印出来,例如这样:

游戏界面

游戏界面

而对于如何让它动起来可能毫无头绪。遇到毫无头绪的问题时,我们需要将问题稍微分解一下:

  • 怎样做会有动画的效果?我们知道,当变化的图片的刷新速度快达30帧时,在人眼看来就会有动画的效果。所以我们要做的就是不停的更新蛇的位置,并且打印出来
  • 如何更新蛇的位置?最朴素的方法是,我把原来的位置“擦除”,然后在再新的位置重新设定一条蛇,这样做未尝不可,但其实我们有更好的方法,那就是擦除蛇尾,并且在蛇头前进的方向添加一个蛇头,怎么做? 对应数组的写法就是 :

    二维数组

    二维数组

    对应链表的写法就是 : 就是链表插入和删除嘛,图不好做,不做了

    皮的嘛,就不谈了

    皮的嘛,就不谈了

  • 蛇如何转向?首先你要限定蛇是不能向目前前进方向或者其反方向转向的,其次你要定义一个全局变量direction(上下左右)表示蛇目前会一直往这个方向走,最后只要在读取到键盘输入时,根据输入改变前进方向,并在那个方向添加一个蛇头,前进方向自然就变了
  • 数据更新完打印界面一闪一闪的?正常,因为你把整个界面都擦除再打印,如果程序跑的不够快,那么就会出现这种情况,这里我想提一下,虽然我们是很朴素的写一个贪吃蛇,但是这里其实就已经涉及到一个很重要的知识,画面刷新。我们知道,画面的绘制对于计算机来说是一个巨大的负担,所以我们为了提高绘图的速度,在需要自己实现绘图的一些底层应用或者游戏引擎中,往往采用局部刷新、图层叠加,缓冲区绘制等的方式优化性能,即只更新需要变化的局部画面,对于可以覆盖更新的图层直接覆盖,对于需要多个图层绘制的画面绘制先在缓冲区中“绘制”,绘制完再进行真正的屏幕绘制

5. 碰撞检测

和现实世界不同,游戏世界的碰撞是我们通过数学和逻辑方法判断的,所以碰撞检测就变得极为重要,它是你的游戏世界成型的根本。如果你的目标是成为一个游戏开发人员,相信我碰撞检测将是你的朋友(e meng),和绘图方法一样,碰撞检测是一滩极深的水,而这里我们讲的是最简单的碰撞检测,点和点之间的碰撞检测,这其实很简单,判断两个点是否重复,就看坐标(x,y)值是否相同就好了,以屏幕左上角为坐标原点,建立xy坐标系,你的蛇头就是一个坐标点(x1,y1),而墙上每一块砖有它的坐标,食物也是如此。

6. 结束

其实到这里,做一个贪吃蛇游戏会遇到的一些基本难题我已经帮你一一列举并提供了基本的解决方案,而具体实现中其实你还会遇到许多逻辑上的问题,不过这都不重要,重要的是,我们通过做一个贪吃蛇,学到了最基础的绘图方法和碰撞检测。记住这些名词,它们将是你装逼的利器。

逼是一样的逼,装上见高低

-----某不知名java老师如此说道

©宇

转载于:https://www.cnblogs.com/shenhuiyu/p/8908030.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值