贪吃蛇论文

更新时间:2024-07-01 12:24:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

计算机科学与技术 学院

学年设计说明书(论文)

作 者:呼斯勒都仍 学 号:159040642003

院 系:计算机科学与技术学院(软件外包) 专 业:计 算 机 科 学 与 技 术 题 目:基于C语言的贪吃蛇游戏开发与设计

伴随着科学技术的发展,人们都渴望在不工作的时候有一些娱乐活动,而贪吃蛇这一款游戏正好符合大众的心理。所以,为了迎合许多用户的需求,才开发了这款叫做贪吃蛇的小游戏,并且这款小游戏适合各阶层人士,此外它还具有很强的娱乐性和交互性。 这款游戏之所以叫贪吃蛇,其真正用意并不是告诉人们要贪心,它所传递的精神是人们只有不断努力地向前才能得到自己想要的,食物就像现在社会存在的机会,而人们只有找好自己的目标才能成功。 尽管现在市面上存在的游戏版本很多,可是贪吃蛇的市场还是很大的。原因就在与它能引人入深,爱不释手。随着游戏速度的逐渐加快,其刺激性也更强。可以说该游戏的优势不仅在于它的简单易行,而且在于它很快顺利的运行。对于那些在外忙忙碌碌的人们,想让他们花费大量的时间在大型游戏上显然是不可能的,但是小游戏却刚好能够迎合他们的需求。 论文首先简单介绍了开发工具,然后从需求分析、概要设计、详细设计与实现等方面介绍了贪吃蛇游戏的设计与实现过程,最后给出了贪吃蛇的运行与测试情况。 关键词 贪吃蛇 ;C语言;函数;游戏

目录

前言 第一章 概述

1.1中国手机游戏产业现状 1.2中国手机游戏的未来展 第二章 开发工具的简介

2.1可行性分析 2.2 功能性分析 第三章 3.1概要设计

3.1功能介绍 3.2概要设计图 第四章 详细设计 第五章

南京工程学院毕业设计说明书(论文)

前言

C语言是目前世界上流行、使用最广泛的高级程序设计语言。

C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它高级语言,许多大型应用软件都是用C语言编写的。

C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画它是数值计算的高级语言。

常用的编译软件有Microsoft Visual C++,Borland C++,Watcom

C++ ,Borland C++, Borland C++ Builder,Borland C++ 3.1 for DOS,Watcom C++ 11.0 for DOS,GNU DJGPP C++, Lccwin32 C Compiler 3.1,Microsoft C,High C,等等......

C语言的发展历史

C语言的发展颇为有趣。它的原型ALGOL 60语言。

1963年,剑桥大学将ALGOL 60语言发展成为CPL(Combined Programming Language)语言。

1967年,剑桥大学的Matin Richards 对CPL语言进行了简化,于是产生了BCPL语言。

1970年,美国贝尔实验室的Ken Thompson将BCPL进行了修改,并为它起了一个有趣的名字“B语言”。意思是将CPL语言煮干,提炼出它的精华。并且他用B语言写了第一个UNIX操作系统

而在1973年,B语言也给人“煮”了一下,美国贝尔实验室的D.M.RITCHIE在B语言的基础上最终设计出了一种新的语言,他取了BGPL的第二个字母作为这种语言的名字,这就是C语言。

为了使UNIX操作系统推广,1977年Dennis M.Ritchie 发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》。

1978年Brian W.Kernighian和Dennis M.Ritchie出版了名著《The C Programming Language》,从而使C语言成为目前世界上流行最广泛的高级程序设计语言。

1988年,随着微型计算机的日益普及, 出现了许多C语言版本。由于没有统一的标准,使得这些C语言之间出现了一些不一致的地方。为了改变这种情况,美国国家标准研究所(ANSI)为C语言制定了一套ANSI标准, 成为现行的C语言

- 1 -

南京工程学院毕业设计说明书(论文)

标准 3.C语言的主要特点 。C语言发展迅速, 而且成为最受欢迎的语言之一, 主要因为它具有强大的功能。许多著名的系统软件, 如DBASE Ⅲ PLUS、DBASE Ⅳ 都是由C 语言编写的。用C语言加上一些汇编语言子程序, 就更能显示C语言的优势了,象PC- DOS 、WORDSTAR等就是用这种方法编写的。

第一章 概述

这些年中国的手机行业在硝烟与战火中度过,拍照手机、音乐手机等各领风骚。然而,人们玩得最多的手机 游戏却在市场上显得平淡无奇,谁又曾想到在这看似平常的手机游戏中却蕴藏着巨大的商机?近年来,中国的手机游戏市场已具雏形,并朝着健康有序的方向发展。本文通过对中国目前的手机游戏现存的一些问题和发展方向进行了分析,为如何促进我国手机游戏发展提出了一些看法和建议。

如今,用手机看新闻、发邮件、拍照、聊天已不再新鲜,用手机玩游戏已经成为时下比较流行的一种消遣方式。手机游戏的发展离不开手机终端的普及和数据服务的推广。近几年来,随着手机游戏技术自身的日益成熟,手机游戏的巨大商机开始展现在人们面前。现在传统游戏产业的商家已经开始从家用机游戏、PC游戏等传统的游戏领域逐渐向手机游戏领域扩张,并尝试与手机游戏开发商以及服务提供商进行更加紧密地合作,这一切都证明手机游戏市场已成为目前移动领域最具有活力的市场。因此,让我们来关注一下未来手机游戏的发展动态吧!

1.1中国手机游戏产业的现状

在中国,手机游戏产业的发展比较缓慢,随着手机自身性能的发展到一个手机游戏的普及,经历了较长的时间,大概分为三个阶段。第一个阶段是手机游戏的孕育期。以第一款手机游戏在诺基亚手机上诞生的时候,最早的给手机用户提供消遣,带来快乐,从而也拓展了手机的功能。从那时候开始手机不再只限于单一的通信。该阶段的以普通屏为基础,游戏简单,易操作。第二阶段是手机游戏的快速发展期。随着彩屏手机的快速发展,移动终端性能的不断提高与完善,使WAP游戏和单机版JAVA成为该阶段的主流。 此阶段的特点是随着手机软

- 2 -

南京工程学院毕业设计说明书(论文)

图4-1 概要设计图

背景音乐 3.2.1画面设计

(1)主要是对边框、食物、蛇的设计,起用了一些链表和库函数; (2)画面的启动的问题,紧接着就是是画面的绘制

(3)食物和蛇放在游戏的具体过程中,因为食物是随机的,而蛇是移动的。

3.2.2游戏过程

主要是对食物和蛇的设置。在这个环节过程中有几个重要的算法,是程序能否成功地运行的关键。其主要有蛇是如何移动身体的;蛇怎样才能吃到食物;随着游戏得分增加,游戏的等级也增加,同时蛇的爬行速度也加快了;怎样判断蛇的死亡等。

3.2.3游戏结束

蛇如何死亡

蛇死亡后即意味着游戏的结束

3.2.4添加功能

(1)在游戏的开头添加“WELCOM TO GAME”的语句,并添加“ 按任意键继续”以提示用户;

(2)添加背景音乐“筷子兄弟——小苹果”,可以在玩游戏的 过程中,边玩游戏边听音乐。

第四章 详细设计

- 8 -

南京工程学院毕业设计说明书(论文)

4.1程序设计分析

N 游戏结束? 游 戏 过 程 背 景 音 乐 开 始 欢 迎 界 面 游 戏 界 面

Y 结 束 游 戏

退 出 游 戏 结 束 图5-1 程序设计流程图

这是一个简单的游戏,所以循环和分支之类的函数在大的面上运用较少,主要体现在计算上,尤其是坐标上的计算较为突出。简单易懂,一目了然

- 9 -

南京工程学院毕业设计说明书(论文)

4.2主要函数:

表5-1贪吃蛇主要函数

函数 HideCursor() GotoRood(int x, int y) Random(int n) BuildSnk(SNAKE *head) RemoveSnk(SNAKE *head) Move(int *d) IniScreen(SNAKE *head) *snk) CollisionTest(SNAKE *head) Eated(SNAKE *head, FOOD 蛇是否吃到食物 *fd) GameOver(SNAKE *head) gameing() PlaySound() 判断游戏结束了没 游戏过程 播放背景音乐 隐藏光标 功能 光标跳跃到(x,y)位置 随机生成食物 构造蛇身 清除函数 控制蛇懂得移动 初始化屏幕 蛇体发生冲突 碰撞测试 CreatFood(FOOD *fd, SNAKE 做蛇的食物,增加一个的功能就是让食物不与

4.3主要代码 4.3.1 Main()主函数

主函数是程序的主流程,首先定义使用到的常数、全局变量及函数原型说明,然后初始化图形系统,调用函数gameing(),即玩游戏的具体过程,游戏结束后执行return 0;语句关闭图形系统,结束程序。

代码如下:

int main()

{

- 10 -

南京工程学院毕业设计说明书(论文)

GotoRood(START_X + SCREEN_WIDTH / 2, START_Y + SCREEN_LENGTH

/ 2);

printf(\

GotoRood(START_X + SCREEN_WIDTH / 2-2, START_Y + SCREEN_LENGTH

/ 2+10);

system(\

system(\清除屏幕内容

PlaySound(TEXT(\

SND_ASYNC | SND_NODEFAULT); while (1)

{

gameing(); return 0;

NULL,

}

}

程序分析:

一般而言,编写一个能运行在操作系统上的程序,都需要一个主函数。主函数意味着建立一个独立进程,且该进程成为了程序的入口,对其它各函数(在某些OOP语言里称作方法,比如Java)进行调用,当然其它被调用函数也可以再去调用更多函数.......这样整个程序的运行轨迹就像一种栈,有时我们称之为调用栈。主函数既是程序的入口,又是程序的出口,通常我们还可以指定一个exit code再退出,以表明程序最后的结果是什么样的。

自然而然的,这里的main函数就是贪吃蛇游戏程序的入口函数,通过该入口函数,进而可以调用gameing()函数,使游戏运行起来

4.3.2 游戏界面设计

主界面就是一个密封的矩形框,在矩形框的左边是游戏的操作说明,在框内主要是蛇和食物。游戏边框流程图如图5-2所示。

开 始 - 11 -

南京工程学院毕业设计说明书(论文)

定位光标(15,4) i=0

N i<47

Y

画上边围墙的一个矩形框

画下边围墙的一个矩形框

i=i+1

j=1

N j<15

Y 画右边围墙的一个矩形框 画左边围墙的一个矩形框

j=j+1

代码如下:

结 束 图5-2 游戏边框流程图

void IniScreen(SNAKE *head) /*初始化屏幕*/

{

- 12 -

南京工程学院毕业设计说明书(论文)

int i,j;

SNAKE *p1, *p2; HideCursor();

GotoRood(START_X,START_Y);

/*-------------画游戏边框---------------*/ for (i = 0; i < SCREEN_WIDTH + 2; i++) printf(\

for (j = 1; j <= SCREEN_LENGTH; j++)

{ }

GotoRood(START_X, START_Y + SCREEN_LENGTH + 1); for (i = 0; i < SCREEN_WIDTH + 2; i++)

GotoRood(START_X + SCREEN_WIDTH + 1, START_Y + j); printf(\

printf(\

for (j = 1; j <= SCREEN_LENGTH; j++) {

GotoRood(START_X,START_Y + j); printf(\ }

GotoRood(START_X + 20, START_Y - 1); printf(\贪吃蛇 作者:唐姜明\ GotoRood(0,START_Y + 2);

printf(\游戏说明:\\n\\n↑设置等级\\n\\n按〖回车〗开始\\n\\n↑↓←→\\n控制方向\\n\

/*--------------孵化蛇-------------------*/ head->x = START_X + SCREEN_WIDTH / 2;

head->y = START_Y + 8; head->pre = NULL; p1 = head;

- 13 -

南京工程学院毕业设计说明书(论文)

i = 0;

while (++i < 3) {

p2 = p1;

p1 = (SNAKE *)malloc(sizeof(SNAKE)); p1->x = START_X + SCREEN_WIDTH / 2;

p1->y = START_Y + 8 + i; p1->end = NULL; } 程序分析:

这里的游戏边框设计的主要思想是利用for循环语句中的嵌套循环实现的。如 for (i = 0; i < SCREEN_WIDTH + 2; i++) printf(\这句话的意思是画出游戏边框的上边框,画完之后,再通过GotoRood(START_X + SCREEN_WIDTH + 1, START_Y + j);语句实现光标定位,并且与for (j = 1; j <= SCREEN_LENGTH; j++)语句结合使用,进而画出游戏边框的右边框。同样的道理,其他两个边框的实现也可以用这种方法去实现。

}

p1->next = NULL; head->end = p1;

p2->next = p1; p1->pre = p2;

4.3.3 游戏的具体过程函数gameing()

这个函数是游戏的主要部分,难点是在表示蛇的新位置,采用的方法是链表传递的方法。

另外,食物的出现要是随机的,蛇吃到食物的判断是蛇头的坐标和食物的坐

- 14 -

南京工程学院毕业设计说明书(论文)

标相等。游戏过程流程图如图5-3所示。

开始

游戏初始化界面

游戏开始运行按

键选择

N N 蛇行进方向为按蛇正常行驶 键方向

蛇吃到食物

N 蛇头与蛇身交叉

Y

蛇死亡

玩家结束游戏

图5-3游戏过程流程图

代码如下:

void gameing() /*游戏过程*/

{

int i = 0, eat = 0, rank, scorelimit = 0, score = 0;

- 15 -

南京工程学院毕业设计说明书(论文)

int direct = up; /* 初始方向为向上 */ time_t grade = 2; /* 初始等级为2 */ FOOD *fd;

SNAKE *head, *ptemp, *pnew; /*最少3个蛇身 + 1个蛇头的时候

才会挂。感觉用C++改成类来做会好一些。。*/

head = (SNAKE *)malloc(sizeof(SNAKE)); fd = (FOOD *)malloc(sizeof(FOOD)); GotoRood(START_X, START_Y - 1); printf(\

GotoRood(START_X + 10, START_Y - 1); printf(\IniScreen(head); CreatFood(fd, head);

while(rank = getch()) /*接受按键...↑设置等级【空格】开始游戏*/

{

if (rank == 72)

{

grade = ++grade % 10; if (grade == 0) grade = 1;

GotoRood(START_X, START_Y - 1);

printf(\ }

else if (rank == 13) }

while (1) {

RemoveSnk(head);

ptemp = (SNAKE *)malloc(sizeof(SNAKE)); /*临时的,用来增加在

- 16 -

break;

南京工程学院毕业设计说明书(论文)

蛇的头部*/

Move(&direct); /*....接受用户选择蛇的运动方向*/ switch(direct) {

case up: ptemp->x = head->x; ptemp->y = head->y - 1; break;

case down: ptemp->x = head->x;

ptemp->y = head->y + 1;

break;

}

if (!eat) /*如果没吃到,那自然增加蛇的长度*/

case left: ptemp->x = head->x - 1; ptemp->y = head->y; break;

case right: ptemp->x = head->x + 1; ptemp->y = head->y; break;

{

ptemp->end = head->end->pre; /*将蛇的尾端位置改变,变为倒

数第二个*/

head->end->pre->next = NULL; /*再连接下...*/

free(head->end); head->end = NULL;

} else {

ptemp->end = head -> end;/*吃到了。。在原有的基础上换一个头,

这样就多了一节*/

}

head->pre = ptemp; /*。。队列连接*/

- 17 -

南京工程学院毕业设计说明书(论文)

ptemp->next = head; ptemp->pre = NULL; head = ptemp;

if (eat = Eated(head, fd))

{

CreatFood(fd,head);

score += grade; /*吃到了,就加分*/ scorelimit += grade;

if (scorelimit / 50 && grade <= 10) /*这个用来增加等级。*/

{ /*每过一次50分,等级

增加一次,10级是上限 */

GotoRood(START_X, START_Y - 1); printf(\ scorelimit = score % 50; }

GotoRood(START_X + 10, START_Y - 1);

printf(\ }

if (GameOver(head)) /*游戏是否结束....*/ {

BuildSnk(head); /*留下最后的英姿。。。吃货该死..*/ GotoRood(START_X + SCREEN_WIDTH / 2, START_Y + SCREEN_LENGTH

/ 2);

puts(\小菜鸟,你输了\\n\ return; }

CollisionTest(head); /*碰撞测试*/ BuildSnk(head);

Sleep((10 - grade) * 50); /*延时...程序会暂停(10 - grade)*50ms 的

时间, windows.h里的函数*/

}

- 18 -

南京工程学院毕业设计说明书(论文)

} 程序分析:

gaming()函数是游戏的主要部分,难点在表示蛇的新位置并消除前一次的图形。采用的方法是每次移动的时候从最后一节开始到倒数第二节(因蛇头为两节),将前一节的坐标赋值给后一节的坐标,移动后只要把最后一节用背景色去除即可,因为新位置0到n-l节还是要出现在画面上的。然后蛇头按照方向键来更改位置。

另外,食物的随机出现要确保它的位置在10的倍数位置上,因为蛇的坐标都是以10为模的,这样的话就可以让蛇吃到,蛇吃到食物的判断是蛇头的坐标和食物的坐标相等。 其算法过程为:

(1)设置初始值。为防止食物总出现在一个位置上,要设置随机数发生器,真正产生随机数。初始时,蛇只有蛇头,设定一个开始的方向。

(2)循环执行,直到按Esc键退出。 (3)没有按键的情况下,循环执行。

如果没有食物,随机出现食物;如果有食物,则显示食物,蛇移动身体,根据蛇的方向改变坐标值,并判断蛇是否自己吃了自己,如果出现这种情况,则蛇死,调用游戏结束函数GameOver(),结束本次游戏,重新开始。如果蛇吃到了食物,蛇身体长一节,数组元素增加一个,身体节数、分数都进行相应的改变。在新位置画出蛇。

(4)如果有按键,则识别键值。如果按键为Esc键则结束游戏,程序运行结束;如果所按键为方向键,则根据该键改变代表蛇方向的变量direction的值,要考虑相反方向键无效。

4.4其他函数的代码: 4.4.1 构建蛇身

void BuildSnk(SNAKE *head) /*构造蛇身*/ {

SNAKE *p = head;

- 19 -

南京工程学院毕业设计说明书(论文)

}

while (p != NULL) {

GotoRood(p->x, p->y); printf(\ p = p->next; }

4.4.2蛇的移动方向函数

void Move(int *d) /*移动方向。。。 上下左右 上:72 下:80 左:75 右:77*/

{

char ch; while(_kbhit()) {

ch = getch(); if (ch == 72) {

if ((*d == left || *d == right) && *d != down) *d = up; }

else if (ch == 80)

{

if ((*d == left || *d == right) && *d != up)

*d = down;

}

else if (ch == 75) {

if ((*d == up || *d == down) && *d != right) *d = left;

- 20 -

}

南京工程学院毕业设计说明书(论文)

else if (ch == 77)

{

if ((*d == up || *d == down) && *d != left)

}

*d = right;

}

程序分析:

这里我们首先要明确一个函数kbhit()函数(VC++6.0下为_kbhit()),该函数的功能及返回值为:检查当前是否有键盘输入,若有则返回一个非0值,否则返回0。那么接下来所有的问题便可迎刃而解了

这里用到的是C语言当中的if语句和复合运算符,例如 if (ch == 72)

{

if ((*d == left || *d == right) && *d != down) *d = up; }

其中,ch == 72 和(*d == left || *d == right) && *d != down为真的意思是说,如果贪吃蛇之前的运动为向左或者向右但是绝对不会是向下时,那么贪吃蛇接下来的运动只会是向上。同理,贪吃蛇向左、向右、向下的实现也是一样的。

第五章 结 论

我做的是贪吃蛇游戏。简单的一个,但对我一个初学者来说却是一个很大的困难。更加是第一次做毕业设计,所以在后期编写程序时老是停滞不前,最主要是不知从何开始,这个时候才知道上课老师们不厌其烦的教导是多么的宝贵,这个时候才后悔上课的时候没有认真的听讲。可是现在一切都晚了,还好时间还算是充裕,只好拿出书本重新复习一下。特别是结构体,指针的部分,几乎是一片空白。不过经过几天的努力,大体上把课本上的知识点看了一遍,知识点也都基

- 21 -

南京工程学院毕业设计说明书(论文)

本是撑握了,所以下一步就是开始正式的编写程序了。不过毕竟是个新手,还是不知如何下手,于是就在网上下了一篇类似的程序,经过仔细的研究,终于读懂了C语言编程的基本过程和方法。 经过一波三折,终于开始正式编程。

编程是一件很枯燥很无聊的事情,但是出于完成作业,得到学分的压力,还必须强破自己坚持下去,按照老师所说的模块化思想,分部分的进行编写。而且编程是一件高精度、模范化的事情,稍有疏乎都会影响全局,也可能因为某一处的小的错误而导致整个程序的无法运行。所以认真仔细就是非常重要的了。开始的时候真的感觉编程是一件很无聊的事情,不过当一个程序运行成功的时候那种喜悦是无法言语的,那种成就感是无法比拟的。又经过几天的努力,终于把程序完成了,尽管程序还是有很多错误和漏洞,不过还是很高兴的。无论如何是自己的劳动成果,是自己经过努力得到的成绩,同时也是学习C语言的一次实践作业,自己进步的证明。

虽然说,设计的过程是艰苦的,但是其中所带给我的快乐却是不言而喻的。但看到贪吃蛇游戏活灵活现地呈现在屏幕上时,给我的感觉是皇天不负苦心人,台上十分钟,台下十年功啊!!

- 22 -

本文来源:https://www.bwwdw.com/article/jfc.html

Top