APP下载

基于C语言的贪吃蛇游戏设计

2020-05-19李雨哲孙炼

河南科技 2020年7期
关键词:C语言函数

李雨哲 孙炼

摘 要:贪吃蛇是一款深受人们喜爱的游戏。在贪吃蛇游戏设计过程中,涉及蛇与食物的显示与更新、数据的收集与更新等问题。本文通过利用C语言对贪吃蛇游戏进行设计和编写,并对设计好的游戏进行测试。结果表明,程序通过编译后逻辑上没有明显漏洞,且运行结果与预期无较大出入。

关键词:C语言;贪吃蛇;函数

中图分类号:TP317文献标识码:A文章编号:1003-5168(2020)07-0031-03

Abstract: Snake is a popular game. In the design process of Snake game, it involves the display and update of snake and food, data collection and update. This paper used the C programming language to design and write Snake game, and tested the designed game. The results show that there are no obvious flaws in the program's compiling and logic, and the running results are not different from the expected ones.

Keywords: the C programming language;snake game;function

虽然现在市面上已经有各种各样的游戏,例如:王者荣耀、和平精英、狂野飙车等,并且这些游戏的可玩度较高,但贪吃蛇这款游戏的市场依然存在。贪吃蛇的游戏出现之后不断发展,从最开始用汇编语言开发在游戏机上玩,到后来用Java开发在手机上玩;从最开始的一人游戏,到现在的多人游戏。贪吃蛇吸引人的地方在于,随着游戏进程加快,节奏也不断加快,给人们带来更强的刺激感。该游戏的优势是简单易行。本文通过利用C语言对贪吃蛇游戏进行设计和编写,以更加深入地理解C语言的应用。

1 编程语言简介

1.1 C语言简介

C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言程序是由函数构成的,每一个函数完成相对独立的功能。一个C程序至少且包含一个main函数,也可以包含一个main函数和若干其他函数[1]。C语言具有丰富的运算符和数据类型,便于实现各类复杂的数据结构,并引入了指针概念,可使程序效率更高。面向对象的语言具有封装、继承、多态三大特性,决定了面向对象语言可修改性很强[2]。C语言则与面向对象的语言不同,在进行C语言程序设计时,如果开发者没有一开始就确定好合适的数据类型、结构体、变量等,那么在调试时,查到程序错误或者有漏洞,修改起来就会相当困难。

1.2 设计环境

本程序利用C-Free 5.0来进行编译。C-Free是一个支持多编译器的专业C/C++集成开发环境(IDE)。在C-Free中,用户可以自由编辑、编译、运行和调试程序。C-Free包含了C/C++源解析器。该开发工具的优势是所占资源少,具有强大的特性[3-5]。

2 程序设计

2.1 程序简介

贪吃蛇游戏是一款经典游戏,适合所有年龄段。蛇在封闭的墙壁内,食物随机出现在墙壁内。玩家可以通过按键盘上的W、A、S、D上下左右移动来确定蛇的运动,如果蛇的头碰到食物,食物被吃掉,蛇的身体就会长出一段,同时得分,然后食物随机在地图内出现,重复以上环节。如果蛇在运动中碰到墙壁或碰到自己的身体,则游戏结束。

2.2 设计思路

在设计时,需要用一个图标来代表蛇的一节身体,笔者用“@”,因为这个图标比较接近圆形,移动时不会显得突兀。每当蛇吃掉一个食物,身体就会增加一节。当蛇移动时,必须从蛇头开始,因此蛇不能向相反的方向移动,这意味着蛇尾不能变成蛇头,并且蛇体会随着蛇头的变化而变化。如果玩家不按任何键,蛇自行在当前方向上前移。当玩家按下有效的方向键时,蛇头会朝着方向按键所指的方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动。而食物的投放,也需要一个小图标来表示,这里是用“$”。用两个rand函数来产生两个随机数,用于确定食物所在地图的位置。

整個贪吃蛇游戏的过程包括以下5个环节。

环节1:初始化游戏界面,出现蛇、食物和地图。

环节2:蛇开始不停地前进。

环节3:判断蛇是否撞到自己或墙壁。

环节4 A:蛇没有撞到自己或墙壁,蛇继续前进;B:蛇撞到自己或墙壁,游戏结束(从环节4开始游戏有两种情况A和B)。

环节5:判断蛇是否吃到食物,如果蛇吃到食物,蛇身增长一节,原来的食物消失,随机在地图中出现食物;

程序重复以上环节,直至遇见情况B。

2.3 设计流程图

游戏的设计流程如图1所示。

程序初始化界面,绘制地图、蛇、投放食物,当玩家有输入时,程序会判断是否是有效输入,如果是无效输入,蛇正常运行;如果是有效输入,蛇就会朝着按键方向正常移动。程序会不断判断蛇是否吃到食物,如果吃到食物,则更新得分并进入下一个判定;如果没吃到食物也继续判断。如果蛇碰壁或碰到自己,则蛇死亡,游戏结束;如果没有,则继续循环,直到蛇碰到墙壁或自己。

3 算法分析

主函数main()首先调用函数initialize()来实现程序的初始化,然后调用函数drawMap()来画游戏地图,调用函数putFood()在地图内随机投放食物,再通过while循环来调用drawSnake()、intoKey()、move()等函数分别实现画蛇、接收玩家的按键输入、蛇的移动等功能,调用函数point()来显示和实时更新玩家所得分数,最后如果蛇撞到墙壁或自身,则通过调用函数gameOver()结束游戏。接下来对各函数进行详细分析。

3.1 主函数main()

主函数是程序的主要流程,用来调用各个函数。各函数最终都在主函数中被直接或间接的调用执行。

3.2 初始化函数initialize()

用srand()函数设置随机数种子为现在的时间,清除并隐藏光标,初始化蛇的坐标并给蛇头坐标赋值,让蛇的最初长度为4,因为蛇的长度只有在大于4时才会撞到自身,所以蛇的长度初始化为4。最后要初始化地图,为绘制地图做铺垫。

3.3 绘制地图函数drawMap()

地图实际上是一个封闭的矩形墙壁,其是用一个嵌套的双重for循环分别在屏幕的[X]轴和[Y]轴连续打印出图标,代表地图的墙壁,形成一个长为70个字符、宽为30个字符的密闭围墙。

3.4 投放食物函数putFood()

在while循环中调用两次rand函数生成两个随机数,直到产生的随机数满足新食物生成点的条件,移动光标到这个点并画出食物。

3.5 移动光标函数goToXy()

在本程序中,该函数是比较重要的一个部分,虽然代码量很少,但是用处很大。在添加了windows.h头文件后,就可以使用COORD这个结构,它能定位到屏幕上的坐标。此后就能方便蛇的移动、投放食物等函数的编写。

本函数代码如下:

void goToXy(int i,int j) //移动光标

{

COORD position={j,i};

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position);

}

3.6 蛇的移动函数move()

蛇的移动是程序中的主要部分,笔者用move函数用来描述蛇的移动。通过调用自定义的移动光标函数来擦除尾巴,擦除尾巴可以直接调用goToXy()函数,从尾巴开始,每一个点的位置等于它前面一个点的位置,用direction表示蛇移动的方向。如果吃掉了食物,蛇的长度增加1节。

move函数定义如下:

void move()

{

int i;

goToXy(Snake[Slength-1][0],Snake[Slength-1][1]);//擦除尾巴

printf(" ");

for(i=Slength-1;i>0;i--) //从尾巴开始,每一个点的位置等于它前面一个点的位置

{

Snake[i][0]=Snake[i-1][0];

Snake[i][1]=Snake[i-1][1];

}

switch(direction)

{

case UP:Snake[0][0]--;break;

case DOWN:Snake[0][0]++;break;

case LEFT:Snake[0][1]--;break;

case RIGHT:Snake[0][1]++;break;

}

if(pdEatFood)

{

Slength++;

pdEatFood=false;

}

}

3.7 游戲结束函数gameOver()

判断游戏是否结束,如果结束返回true,否则返回false。需要注意的是,在ISO/IEC 9899:1999标准中有bool类型,在添加stdbool.h头文件后就可以使用。

3.8 分数函数point()

该函数是用于实时更新并显示玩家得分。

3.9 检查函数check()

判定该点是否能投放食物,如果该点能投放则返回1,不能返回0,返回值会被putFood函数调用。

4 程序测试

程序测试的目的是检测程序有无编译上的漏洞和逻辑上的漏洞。

在编写程序期间,设置断点进行调试可以很好地帮助程序员进行调试。笔者在测试运行时发现,蛇已经在行走,但蛇之前行走的痕迹却依然存在,在move函数处设置断点,程序执行到move函数会暂停,在设置断点后运行发现move函数有漏洞。找到漏洞后就需要程序员思考如何清除漏洞。这里添加goToXy(s[sLength-1][0],s[sLength-1][1]); printf(" ");两个语句在move函数体的开头,蛇的尾部添加空格,把蛇的尾巴擦除,以达到擦除痕迹的效果。

程序编写完成,进行最终测试。在键盘输入时,需要把输入法调成英文。给程序W、A、S、D以外的按键输入,会发现蛇依旧按照程序中设定的线路走;而按照W、A、S、D键输入时,蛇按照键入方向改变了原本的线路,说明程序输入和蛇的移动没有问题。对于程序界面,需要设计者自行观察,看运行界面与预期的界面有无较大误差,若误差较大,可以用设置断点的方法来判断在哪个函数出现了漏洞。如果发现蛇移动的速度过快或过慢,或者想要改变速度,可以在程序中修改之前已经定义好的静态变量WAIT_TIME。经过最终测试,本程序通过编译后逻辑上没有明显漏洞,且运行结果与预期无较大出入。

5 结语

本文基于C语言,在C-Free5.0下完成了对贪吃蛇游戏的程序设计,阐述了设计工具、设计思路,并对设计的程序进行测试。结果表明,程序通过编译后逻辑上没有明显漏洞,且运行结果与预期无较大出入。

参考文献:

[1]苏小红.C语言大学实用教程学习指导[M].4版.北京:电子工业出版社,2017.

[2]王一萍,梁伟,李长荣.C语言从入门到项目实战[M].北京:中国水利水电出版社,2019.

[3]孙霄霄.C语言程序设计与应用开发[M].3版.北京:清华大学出版社,2018.

[4]谭浩强.C程序设计[M].5版.北京:清华大学出版社,2017.

[5]严蔚敏.数据结构(C语言版)[M].北京:清华大学出版社,2018.

猜你喜欢

C语言函数
“C语言程序设计”课程混合教学探索
基于C语言的计算机软件编程技术探究
中职计算机C语言教学的探讨与研究
中职C语言单片机课堂教学中的趣味性探讨
计算机原理中C语言的应用价值
关于函数的一些补充知识
高中数学中二次函数应用举隅オ
无独有偶 曲径通幽
函数与导数
函数部分(一)