简单的贪食蛇程序,希望发散GVMaker初学者的编程思想

本文介绍了如何设计一个简单的贪食蛇游戏,讲解了程序的逻辑和数据结构,包括蛇的身体用链表表示,边界用大数组记录,以及游戏规则的实现。通过这个游戏,初学者可以理解程序设计思路,特别是数据结构和游戏逻辑的运用,为后续的编程学习打下基础。
摘要由CSDN通过智能技术生成
贪食蛇其实是一个既统又简单的小游戏,制作也非常简单,看过网上的一些现成代码,多半是从以前黑白色的文曲星机型的程序改过来的,而且很多地方没有说清楚,或者可以说设计得不精心。本人也才开始进入“星界”,没有什么资格说其他人的代码怎么样,毕竟这个思路都是一样的,只是对于一些具体细节的设计不同的人看法不太一样,今天我把自己的设计详细的跟大家说说,特别是那些初学的新手,看了以后应该能够放开思想,发散思维,文曲星编程的大概思路也图像处理基本上能从中体现,如果懂了以后基本上可以开始做比较复杂的东西了。首先,想做什么程序,你必须要把程序要实现什么功能完全的搞清楚,这样才能设计,也就是通常所说的,程序的需求分析,没有这个需求,我们做的东西也就没有用,我们只做有用的东西,那么贪食蛇需要什么呢?1,贪食蛇首先需要移动,2,而且它必须有自己的躯干,3,它喜欢吃东西,这样我们就有大概的设计目的了,蛇的躯干是一个链条似的,每次都是由蛇头先动,蛇头向前移动一个单位,蛇尾才能向前移动,而且在移动过程中,躯干的长度是不变的,但是在蛇吃了东西以后,它就会长一截长度,这个是从头长起的,这个时候蛇尾可以不动,就这样的移动思路就确定了,我们可以设计一个链表来保存蛇的躯干,每个链表的节点表示蛇身的每个点所在屏幕的位置,如果吃了一个事物,那么链表自动加一节,移动的时候我们从蛇尾开始更新坐标信息,蛇尾继承前一个节点的坐标位置信息,依此类推直到蛇头,这时蛇头必须是一个新的信息,因为它是不断前进的,蛇在移动的时候可能遇见什么呢?它前面可能是墙壁,也有可能是事物,更有可能是自己的身体,这个时候我们就需要判断,用什么判断呢?我们用一个大的数组纪录蛇的活动范围内有的东西,食物根据不同的等级而有不同的事物数量,而且只在空位产生,墙壁是四方的(简单起见),然后就是身体了,身体每移动到一个新的像素点,相应的数组位置就变为1,然后蛇尾移开的位置变为0,事物寻找到空位后把相应的位置变为2,这样蛇每次移动都要先判断前面是什么,如果是墙壁或则是自己的身体,那么游戏就结束了,如果是事物,那么它的身体就加长!有了前面的思路我们大概旧能写出程序的主要数据结构的设计了: struct Point{int x;int y;}; //首先是这个点数据结构,它可以表示点的坐标位置 struct Point SnakeBody[WIDTH*HEIGHT+1];//然后用点数据结构初始化一个数组,数组的每//个元素都是蛇的身体一部分,每个点都纪录了蛇身体所在的位置。这里的WIDTH与//HEIGHT是蛇能活动的范围,这个范围有多大,蛇身体就有可能长这么大。 struct Point Boll[5];//用点结构初始化,蛇的事物所在的位置结构; int snakehead,snaketail;//用着两个数据指向蛇头和蛇尾,这样就有点向链表了。 char Border[HEIGHT][WIDTH];//这个数组非常重要,它纪录了蛇能活动的屏幕范围,更重要//的是它也纪录事物以及蛇身在屏幕的位置,有了这个信息蛇的活动才会有所限制,才能分//辨出游戏是否结束 int ballhead,balltail;//指向事物的头和尾,有了它,事物也象一个链表了,到底有多少事物,//计算一下balltail-ballhead就知道了! int pointwidth;//用来设置蛇与事物的像素宽度,这里我用的2; int offsetx,offsety;//边界宽度,用它可以准确定位活动空间的起始位置 int level;//难度等级,设置了它以后,游戏的速度与过关的难度大大加大 long passlevel;//过关所需要吃的食物数,这里的这个设计算是巧妙; long baselevel;//用于纪录这关之前所吃的事物总数,snaketail-baselevel就等于这关蛇已经吃//下的事物数了,这个可以用于是否过关 int speed;//延迟速度,这个与level有关,level越大speed=10-level,延迟就越小,速度也越快 int snakepoint[]={655,655,655,655};//蛇身的点,这就是一个蛇身节点的颜色值,它又四个像//素组成 int ballpoint[]={255,255,255,255};//球的点,也由四个像素组成 char direction;//设置蛇的移动方向,这是非常重要的变量,用它纪录当前蛇的移动方向,如//果按键方向与这个方向相同或相反,蛇的行动路线不变,否则蛇的移动方向改变。 char helpstat;//设置帮助状态,如果当前显示帮助栏,那么蛇的运动占停,不对方向按键做任//何反映,当按了跳出之后,helpstat=0,这个时候跳出帮助栏,蛇继续运动; char ballcount;//这也是一个非常重要的变量,其实它是纪录当前事物数量的,它不同于//balltail,balltail永远停留在当前难度等级所应有的事物数的地方,而ballcount可以变动,//当蛇把事物吃下一个,ballcount --,当ballcount<balltail的时候,事物自动寻找空地产生,//ballcount++直到ballcount==balltail。   以上就是程序所需要的全部的全局变量,每个变量都是相当的重要,它们纪录着重要的数据,只有有了这些数据,我们的蛇宝贝才能贪吃!!!下面看下其余的代码把:特别要注意每个函数的功能设计。   #define WIDTH 120 //蛇的活动范围宽度 #define HEIGHT 80 //蛇的活动范围高度 #define FrontColor 1000 #define KeyLeft 20 #define KeyUp 21 #define KeyRight 22 #define KeyDown 23 #define KeyHelp 28 #define KeyQuit 27 #define KeyY 89 #define KeyN 78 #define UP 1 #define DOWN 3 #define LEFT 0 #define RIGHT 2 #define POWER 3  //这个常量用于设置难度等级的时候用到 //以上都是定义一些常量,看了都懂,中间都是按键常量,用于判断键盘输入 void ClearText(int x,int y,char text1[]) { //这个函数其实不是重要的函数,但是对于我这个没有windows外观的程序来说,它可//以帮我扫清文字,要外观变得好控制,只要知道文字在屏幕的其实位置x,y就能把它//清除掉        int fontsize;        int textlong;        fontsize=GetFontSize();        textlong=strlen(text1);        ClearScreenRange(x,y,x+textlong*fontsize/2,y+fontsize); //     RefreshRange(x,y,x+textlong*fontsize/2,y+fontsize); } long Power(int base,int power) { //计算以base为底,power为指数的指数计算结果        int i;        long result;        result=1;        for(i=0;i<power;i++)               result=result*base;         return result; } void DisplayLevel() { //在屏幕空地现实当前的难度等级以及一些提示信息        char textlevel[30];        char texthelp[20];        SetFgColor(0);        sprintf(textlevel,"您现在选择的难度 Level:%d",level);        TextOut(40,12,textlevel);        sprintf(texthelp,"帮助=[F1] 退出=[跳出]");        TextOut(strlen(textlevel)*8,12,texthelp);        SetFgColor(FrontColor); //     Refresh(); } void DisplayPass() { //显示过关的信息        char textpass[20];        SetFgColor(0);        sprintf(textpass,"顺利通过第 %d 关",level);        TextOut(12,205,textpass);        SetFgColor(FrontColor);        Delay(5000); } void ClearPass() { //清除过关信息,这个函数就利用了ClearText这个函数        char textpass[20];        sprintf(textpass,"顺利通过第 %d 关",level);        ClearText(12,205,textpass); } void PassLevel() { //这个函数是在过关的时候,用于初始化当前难度等级,包括此关的速度与所需的食物数量        int l;        long points;        points=1;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值