Linux平台下基于C的贪吃蛇游戏设计_第1页
Linux平台下基于C的贪吃蛇游戏设计_第2页
Linux平台下基于C的贪吃蛇游戏设计_第3页
Linux平台下基于C的贪吃蛇游戏设计_第4页
Linux平台下基于C的贪吃蛇游戏设计_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录TOC\o"1-2"\h\u299601绪论 128801.1论文选题依据 1210101.2贪吃蛇游戏选题背景 1153881.3贪吃蛇设计概述 1290972平台简介 1103582.1系统介绍 198322.2开发工具 329352.3GTK环境的搭建 3117193系统分析 4183813.1可行性分析 4221593.2需求分析 4135024系统概要设计 5225284.1程序初始化 5238674.2程序流程 5182275系统详细设计 621105.1系统界面 6175305.2对象模型设计 8238405.3食物及蛇状态的初始化及食物的出现 922505.4游戏运行中的设计思路 9194305.5游戏规则 9316075.6游戏实现及其代码 9247096调试及测试结果分析 10314326.1系统测试 1086206.2测试出现的问题 1156746.3系统需要的改进与提高 1124225结论 1112050致谢 12江苏海洋大学Linux课程设计(论文)第5页共22页1绪论论文选题依据Linux挟其价格低廉、品质良好与稳定的竞争优势,正无形无影地吸引众多以PC为主工作平台上的人们。随着科学技术日新月异的发展,Linux提供了更多图形接口的桌面操作环境和应用软件,操作更加简单方便。Linux是源代码开放的操作系统,是当今优秀的操作系统之一。标准Linux经过小型化裁剪之后的专用Linux操作系统即嵌入式Linux,已成为当今的一大热点,它能够固化于容量只有几KB或者几MB的存储器芯片或者单片机中,适合于特定嵌入式场合,目前已经开发成功的嵌入式系统中,大约一半的系统使用嵌入式Linux。此次游戏设计环境也采用Linux系统。   Linux内核的大部分代码是由C语言编写的, Linux应用程序也多由C语言编写。C语言是结构化、模式化的语言,程序可移植性好,运算符丰富、代码效率高,它兼有汇编语言和高级语言的优点,既适合于开发系统软件,也适合于编写应用程序,被广泛应用于事务处理、科学计算、工业控制、数据库技术等领域。此次设计语言环境也选用C语言。GTK是Linux平台下比较好的一个C语言图形开发工具,所以本次也选择了GTK图形开发工具。贪吃蛇游戏选题背景随着人们生活品质的提高,游戏进入人们的视野,电脑游戏也越来越多元化,贪食蛇就是其中一种。贪吃蛇这一游戏简单易行、操作方便和娱乐性较强,在很大程度上满足人们对游戏的追求和喜爱。这一款游戏紧紧地抓住了人们的心理,虽然简单,却起乐无穷,贪食蛇游戏操作简单方便,老少皆宜,是一款不错的小游戏。该游戏给人们带来了追逐的快感,以及成功后的满足感,对于一直处于高压下的现代人是很好的放松工具。 贪吃蛇设计概述该游戏的功能包括:开始游戏、游戏等级和当前速度显示、退出游戏。开始游戏:玩家通过方向键去改变蛇的行动方向,每吃一个食物蛇身加长,分数加1。 游戏等级和当前速度显示:玩家可以即时了解蛇的当前状态。退出游戏:“q”退出游戏。 2平台简介2.1系统介绍2.1.1Linux简介Linux,全称GNU/Linux,是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。伴随着互联网的发展,Linux得到了来自全世界软件爱好者、组织、公司的支持。它除了在服务器方面保持着强劲的发展势头以外,在个人电脑、嵌入式系统上都有着长足的进步。使用者不仅可以直观地获取该操作系统的实现机制,而且可以根据自身的需要来修改完善Linux,使其最大化地适应用户的需要。Linux不仅系统性能稳定,而且是开源软件。其核心防火墙组件性能高效、配置简单,保证了系统的安全。在很多企业网络中,为了追求速度和安全,Linux不仅仅是被网络运维人员当作服务器使用,它还被当作服务器,甚至当作网络防火墙,这是Linux的一大亮点。

Linux具有开放源码、没有版权、技术社区用户多等特点,开放源码使得用户可以自由裁剪,灵活性高,功能强大,成本低。尤其系统中内嵌网络协议栈,经过适当的配置就可实现路由器的功能。这些特点使得Linux成为开发路由交换设备的理想开发平台。

2.1.2Linux系统的主要特点Linux操作系统作为当今主要的操作系统之一具有以下这些特点: 开放性 多用户多任务 良好的用户界面设备独立性 提供了丰富的网络功能 可靠的安全系统 良好的可移植性 2.1.3Linux的组成LINUX的内核:内核是系统的核心,是运行程序和管理 像磁盘和打印机等硬件设备的核心程序。     LINUX SHELL: Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。     LINUX文件系统: Linux文件系统是文件存放在磁盘等存储设备上的组织方法。Linux能支持多种目前主流的文件系统,如EXT2、EXT3、FAT、VFAT、ISO9660、NFS等。LINUX应用系统:标准的Linux系统都有一整套称为应用程序的程序集,包括文本编辑器、编程语言、X Window、办公套件、Internet工具、数据库等。2.2开发工具Linux的内核主要是由C语言编写的,所以C语言在Linux下的软件开发具有独到的优势。本次游戏设计用到的语言就是C。2.2.1C语言简介C语言是目前世界上流行、使用最广泛的高级程序设计语言。C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它高级语言,许多大型应用软件都是用C语言编写的。C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画它是数值计算的高级语言。C语言的特点有: 简洁紧凑、灵活方便。运算符丰富。数据结构丰富。  C是结构式语言。   (5) C语法限制不太严格、程序设计自由度大。   (6) C语言允许直接访问物理地址,可以直接对硬件进行操作。2.2.2GTK简介GTK(GIMP Toolkit)是一套跨多种平台的图形工具包,按LGPL许可协议发布的。虽然最初是为GIMP写的,但目前已发展为一个功能强大、设计灵活的一个通用图形库。特别是被GNOME选中使得GTK+广为流传,成为Linux下开发图形界面的应用程序的主流开发工具之一,当然GTK+并不要求必须在Linux上,事实上,目前GTK+已经有了成功的windows版本。 2.2.3Linux编译工具gcc介绍GCC是一个用于linux系统下编程的编译器。GCC=GNU Compiler Collection,是由Stallman所开发的linux下的编译器,可以编译的语言包括:C, C++, Objective-C, Fortran, Java,Ada等。不过,现在GCC也有了许多Win32下的移植版本。如今的GCC借助于他的特性,具有了交叉编译器的功能,即在一个平台下编译另一个平台的代码。 2.3GTK环境的搭建我们以Linux系统Ubuntu为例简要介绍GTK环境的搭建,Ubuntu桌面环境是gnome。gnome就是使用GTK+编写,所以运行环境不需要另外配置了,要做的是安装开发所需要的环境。 刚安装好的Ubuntu已经默认安装了gcc,但是并没有安装所需要的头文件,我们需要手动添加,使用命令:sudo apt-get install build-essential 然后再安装gnome开发包,使用命令:sudo apt-get install gnome-core-devel 系统会自动找到所依赖的库,并一起下载下来这样安装过后使用下面的命令编译上面的代码:     gcc main.c -o main `pkg-config --cflags --libs gtk+-2.0 注意,这里的`是键盘上1左面的反引号,不是单引号。 KDE桌面配置GTK,步骤也类似,但是需要先安装GTK的运行环境。本次开发所使用的操作系统平台是Fedora 12完整版 安装时选择安装GTK开发工具与gnome桌面,因此当系统完成安装所有GTK的运行和开发环境就已搭建好。3系统分析3.1可行性分析3.1.1技术可行性本系统的设计要求是一个能在Linux操作系统下运行且界面美观运行稳定,将来可能用于嵌入式移植的系统。所以,选择C语言与GTK技术来实现本系统。C语言是一门成熟的高级语言,可用于开发各种系统,也可用于开发游戏系统。同时C语言也拥有相当多的技术人员。GTK是Linux下的一个图形化编程工具,其开发出来的程序能在装有GTK环境的Linux系统下顺利运行。可以说在技术方面开发此系统不会有什么问题。3.1.2经济可行性随着手机和电脑的普及,这样的小游戏也将随着普及因此其需求也将不断上升,而由于技术的成熟与为数众多的开发人员使得此系统的开发并不困难,再者此系统运行的平台Linux操作系统是开源和免费的,所以开发此系统的成本并不会很高。因此此系统具有相当的经济利益,到时候我们也可以静观其成。3.1.3操作可行性本系统是一个简单的单机游戏系统,对于这样一个系统,其操作只需要使用简单的几个按键和鼠标点击按钮就可以实现,因此本系统的操作简单易记,可以说一看就会的,系统在操作上是不会存在问题的,本系统需要在Linux操作系统下运行,用户上手也快,有着很好的游戏体验。3.2需求分析3.2.1功能需求本系统是一个简单的单机游戏,界面分为两个部分。一个是游戏区,在游戏区中,用户可通过键盘上的W、S、A和D来控制蛇的移动方向,及时了解贪吃蛇当前的状态。用户可通过q随时退出游戏。另一个是日志区,包含游戏的玩法介绍和说明。3.2.2性能要求游戏操作要求简单易行,游戏过程中画面移动要流畅,通过键盘对蛇移动方向控制时无明显延迟,由于本系统将来有可能在嵌入式Linux上移植,而嵌入式系统一般存储较小,处理器的处理速度也不是很快,因此本系统对内存和处理器的使用的要求都要尽可能的小。3.2.3运行要求本系统由于要使用到GTK图形化编程工具,而图形化编程工具GTK开发出来的程序需要有GTK环境才能运行,由于是用C语言实现,因此系统对硬件的要求并不是很高。所以本系统的运行要求是搭建有GTK环境或是安装gnome桌面环境的Linux操作系统。 4系统概要设计4.1程序初始化程序的初始化主要由函数initsnake()在游戏开始时对蛇的进行初始化赋值,每次重新开始游戏时,蛇都会恢复为原始状态,游戏模式与地图不变。4.2程序流程4.2.1系统模块本系统分为:创建日志窗口WINDOW*logwin模块;蛇初始化initshake()模块、创建新游戏窗口WINDOW*newgame()模块;游戏中,蛇通过跑断是否撞墙或吃到自己来判断蛇的死亡。4.2.2系统流程本游戏作为一个简单的linux小游戏,当运行程序是默认程序开始启动,程序启动后,随着所吃食物的增多,每当吃到一定程度的食物,则系统会提示“LevelUP!”,随着等级的升高,蛇的移动速度会越来越快。游戏过程中,玩家可以按“q”或“Q”来终止游戏,如果蛇死亡则系统提示“Gameover!”,玩家可以选择重新开始游戏和退出。系统流程图如下图4-1所示:图4-1系统流程图系统构架图如下图4-2所示:图4-2系统构架图5系统详细设计5.1系统界面用户界面是现代软件重要的组成部分,界面的好坏对于游戏软件来说也相当的重要,因为一个用户友好的界面能让玩家在游戏过程中感觉更舒心,而一个不友好的界面将使游戏的品质大打折扣。本系统界面的设计遵循如下的指导规则: 让用户驾驭软件,而不是软件驾驭用户。尽可能减少用户的记性。 保持界面的一致性。游戏界面如图5-1所示:图5-1主界面游戏界面:标志着贪吃蛇的活动范围,主要为游戏显示区;另外还有等级划分和速度划分,简单明了。游戏界面窗口代码如下:

#define

INITRUNLOG()logwin

=

newlogw()

#define

GAMEWIN_YLEN

15//设计游戏窗口的宽度

#define

GAMEWIN_XLEN

60//设计游戏窗口的长度#define

RUNLOG(str)

runlog(logwin,

str)//代表蛇的移动界面图5-2游戏界面图日志界面:日志界面中主要描述贪吃蛇的操作按键以及如何退出游戏日志界面代码如下:#define

LOGWIN_YLEN

7//使日志界面的宽度为7#define

LOGWIN_XLEN

(GAMEWIN_XLEN)//使日志界面的长度与游戏界面一样

图5-3日志界面图5.2对象模型设计在本系统中对象模型的设计主要是蛇的设计、食物的设计。蛇的设计主要是通过drawsnakew()函数画出蛇的身体。而食物也是通过drawfoodw()函数画出。蛇身代码如下:

void

drawsnakew(WINDOW

*win,

struct

TSnake

*psnake)

{

static

int

taily

=

0;

static

int

tailx

=

0;

if

(taily

!=

0

&&

tailx

!=

0)

{

mvwaddch(win,

taily,

tailx,

'

');

}食物代码如下:

void

drawfoodw(WINDOW

*win,

struct

TFood

*pfood,

struct

TSnake

*psnake)

{

do

{

pfood->y

=

random()

%

(GAMEWIN_YLEN

-

1)

+

1;

pfood->x

=

random()

%

(GAMEWIN_XLEN

-

1)

+

1;

}

while

(False

==

checkfood(pfood,

psnake));

checkfood(pfood,

psnake);

mvwaddch(win,

pfood->y,

pfood->x,

SHAPE_FOOD);

wrefresh(win);

}图5-4中***就是蛇,@即是食物。图5-45.3食物及蛇状态的初始化及食物的出现蛇状态的初始化是由定义蛇结构体时初始化决定的,每一次开始蛇的长度,出现位置和移动方向都是一样的,它们长度都为4个结点,方向都向右。无论是在游戏的开始还是进行中,食物都是随机出现的,通过checkfood()函数随机产生食物出现的坐标,在产生的随机坐标上画出食物。5.4游戏运行中的设计思路游戏中蛇的运动是靠通过对画面的不断清除与重画而实现的,每一次运动时先用背景色擦除掉原有蛇的图像,再将蛇画在其新出现的位置,由于每一次擦除与重画间隔的时间非常短,利用人的视觉暂留性,让蛇看上去就像在连续不断的运动。而食物未被吃前,传送点和墙体被擦除后重画的位置与原来一样,所以让人感觉其并没有变化。 蛇身的移动与运动方向主要是受头结点控制,因为蛇每一次运动就是靠后一结点画在前一结点的位置上来实现的,所以对蛇的控制主要是对头结点的控制。用户通过键盘上的w、s、a和d对蛇身进行操控。5.5游戏规则本系统是一个简单的单机游戏,界面分为两个部分。用户可通过键盘上的W、S、A和D来控制蛇的移动方向,及时了解贪吃蛇当前的状态。用户可通过q随时退出游戏。5.6游戏实现及其代码5.6.1蛇的移动蛇的移动方向主要受头结点控制,所以每次画蛇时只要把前一结点的值赋给后一节点即可。 当蛇头的移动方向向右时,y值不变x的值不断增加。    当蛇头的移动方向向左时,y值不变x的值不断减少。当蛇头的移动方向向下时,y值增加x的值不变。当蛇头的移动方向向上时,y值减小x的值不变。蛇身移动代码如下: void

movesnake(struct

TSnake

*psnake)

{

int

hy

=

psnake->head->y;

int

hx

=

psnake->head->x;

psnake->head

=

GetSnakeTail(psnake);

switch

(psnake->dir)

{

case

DIR_UP:

psnake->head->y

=

hy

-

1;

psnake->head->x

=

hx;

break;

case

DIR_DOWN:

psnake->head->y

=

hy

+

1;

psnake->head->x

=

hx;

break;

case

DIR_LEFT:

psnake->head->y

=

hy;

psnake->head->x

=

hx

-

1;

break;

case

DIR_RIGHT:

psnake->head->y

=

hy;

psnake->head->x

=

hx

+

1;

break;

5.6.2蛇的死亡当蛇头的值与蛇身或与墙的值相等时,蛇即算死亡,代码如下:

void

gameover(WINDOW

*win,

char

*str)

{

mvwprintw(win,

(int)(GAMEWIN_YLEN/2),

(GAMEWIN_XLEN/2

-

strlen(str)/2),

str);

mvwprintw(win,

(int)(GAMEWIN_YLEN/2

+

1),

20,

"Press

any

key

to

quit...");

wrefresh(win);

}6调试及测试结果分析6.1系统测试1测试用例: 使蛇经过各个边界的情况。使蛇达到各个传送点。 (3)测试蛇死亡和游戏时间到的情况。 (4)测试使蛇撞墙。(5)测试软件的各个命令。 2预期出现的情况: 蛇能够从一方边界进去及时的从另一边界出来。蛇到达传送点时能够正确的从被传送点出来。 (3)当蛇死亡时和时间到了的时候,能够实现游戏停止和正确输出游戏信息。 (4)当蛇撞墙将死亡。 (5)系统能正确响应命令时的操作。3实际结果: 游戏测试的结果基本上符合预期目标,但也还有几个小问题。6.2测试出现的问题游戏过程中,当用户以非常快的速度同时按下几个控制键,蛇有可能会出现死亡现象。分析原因有可能是当以很快的速度按下多个控制键时蛇的方向的值已经变化而实际移动方向却未来得及改变,在这同时又按下了另一方向键,由此蛇就直接按后一方向的值的方向运动,于是就发生撞到自己死亡的现象。  贪吃蛇到达边界时不能及时从另一边出现。 系统虽然存在些问题,但系统的功能与模块都成功实现且系统总体运行良好且稳定,系统的下一阶段将主要解决这些问题。6.3系统需要的改进与提高由于各种原因,本系统依然存在着许多缺点如有BUG的存在。针对本系统的一些缺点,在后期开发时主要在以下方面进行改进: 完善系统,解决系统所出现的问题。改善与完善算法,使电脑的能变得高些。 增加游戏地图、游戏模式和游戏难度选择,使游戏的可玩性大大增加。加上网络功能,实现游戏更好的交互。 丰富界面,使界面更美观与拥有良好的可操作性。 对游戏进行优化,使游戏具有更广阔的前景。结论Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。Linux不仅系统性能稳定,而且是开源软件。其核心防火墙组件性能高效、配置简单,保证了系统的安全。在很多企业网络中,为了追求速度和安全,Linux不仅仅是被网络运维人员当作服务器使用,它还被当作服务器,甚至当作网络防火墙。Linux具有开放源码、没有版权、技术社区用户多等特点,开放源码使得用户可以自由裁剪,灵活性高,功能强大,成本低。尤其系统中内嵌网络协议栈,经过适当的配置就可实现路由器的功能。这些特点使得Linux成为开发路由交换设备的理想开发平台。

致谢在此感谢我们linux课程的老师,是老师孜孜不倦的教导,是老师的教导让我们能够成功在linux的环境之下成功的运行出贪吃蛇这样的小游戏,不仅增加了我们对未来研究更困难的课题的信心,也丰富了我们的课外生活,让我们的生活变得更加的多姿多彩。同样还要感谢我们的室友,在我们电脑出现问题的时候,是室友无私的奉献,帮助我们解决了难题。正是因为有你们的帮助,使我们在相处和学习的过程中收获颇多,互相成长。本论文编写过程中还得到了很多朋友的支持和帮助,限于篇幅,虽然不能对你们一一表示感谢,但对你们一样心存感激。附录:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<sys/time.h>#include<sys/types.h>#include<unistd.h>#include<ncurses.h>#defineTBoolint#defineTrue1#defineFalse0#defineSHAPE_FOOD'@'#defineSHAPE_SNAKE'*'#defineGAMEWIN_YLEN15#defineGAMEWIN_XLEN60#defineLOGWIN_YLEN7#defineLOGWIN_XLEN(GAMEWIN_XLEN)#defineLOGBUF_NUM(LOGWIN_YLEN-2)#defineLOGBUF_LEN(GAMEWIN_XLEN-2)#defineMAXLEVEL12#defineGetSnakeTail(s)((s)->head->front)WINDOW*logwin;#defineINITRUNLOG()logwin=newlogw()#defineRUNLOG(str)runlog(logwin,str)#defineDESTROYRUNLOG()delwin(logwin)intg_level;enumTDirection{DIR_UP,DIR_DOWN,DIR_LEFT,DIR_RIGHT};structTFood{inty;intx;};structTSnakeNode{inty;intx;structTSnakeNode*front;};structTSnake{intlength;structTSnakeNode*head;enumTDirectiondir;};intrefreshgamew(WINDOW*win,structTSnake*psnake);voidmovesnake(structTSnake*psnake);intchecksnake(structTFood*pfood,structTSnake*psnake);voidsnakegrowup(structTFood*pfood,structTSnake*psnake);voidgameover(WINDOW*win,char*str);structTSnakeNode*newsnakenode(structTSnakeNode**ppsnode,inty,intx);WINDOW*newgamew();structTSnake*initsnake();voiddestroysnake(structTSnake*psnake);voiddrawsnakew(WINDOW*win,structTSnake*psnake);voiddrawfoodw(WINDOW*win,structTFood*pfood,structTSnake*psnake);TBoolcheckfood(structTFood*pfood,structTSnake*psnake);WINDOW*newlogw();voidrunlog(WINDOW*win,char*str);voidcleanline(WINDOW*win,inty,intx);intmain(){initscr();raw();noecho();keypad(stdscr,TRUE);curs_set(0);refresh();g_level=1;INITRUNLOG();RUNLOG("Press'q'or'Q'toquit.");RUNLOG("Press'w/s/a/d'or'W/S/A/D'tomovethesnake.");RUNLOG("Info:");WINDOW*gwin=newgamew();structTSnake*psnake=initsnake();drawsnakew(gwin,psnake);while(refreshgamew(gwin,psnake)>=0);getch();destroysnake(psnake);delwin(gwin);DESTROYRUNLOG();endwin();return0;}intrefreshgamew(WINDOW*win,structTSnake*psnake){staticTBoolffood=False;structTFoodpfood;if(!ffood){drawfoodw(win,&pfood,psnake);ffood=True;}intkey=-1;fd_setset;FD_ZERO(&set);FD_SET(0,&set);structtimevaltimeout;timeout.tv_sec=0;timeout.tv_usec=(6-(int)(g_level/3))*100*1000;if(select(1,&set,NULL,NULL,&timeout)<0)return-1;if(FD_ISSET(0,&set)){while((key=getch())==-1);switch(key){case'w':case'W':(psnake->dir==DIR_DOWN)?:(psnake->dir=DIR_UP);break;case's':case'S':(psnake->dir==DIR_UP)?:(psnake->dir=DIR_DOWN);break;case'a':case'A':(psnake->dir==DIR_RIGHT)?:(psnake->dir=DIR_LEFT);break;case'd':case'D':(psnake->dir==DIR_LEFT)?:(psnake->dir=DIR_RIGHT);break;case'q':case'Q':RUNLOG("QuitGame!");gameover(win,"QuitGame!");return-1;default:break;}}movesnake(psnake);drawsnakew(win,psnake);switch(checksnake(&pfood,psnake)){case0:break;case1:ffood=False;if(++g_level>MAXLEVEL){RUNLOG("Win!!!");gameover(win,"Win!!!");return-1;}mvwprintw(win,GAMEWIN_YLEN-1,2,"Level:%d",g_level);mvwprintw(win,GAMEWIN_YLEN-1,30,"Speed:%d",(int)(g_level/3));wrefresh(win);RUNLOG("LevelUP!");snakegrowup(&pfood,psnake);break;default:RUNLOG("Gameover!");gameover(win,"Gameover!");return-1;}return1;}/***stuctTSnake是一个倒置的首尾相连的链表,head->front指向snake的尾部*如:[a]<-[b]<-[c]<-[d]a为head*|^snake移动的时候,只用head指向d,*`'并且修改d的(y,x)为snake头移动到的位置.*/voidmovesnake(structTSnake*psnake){inthy=psnake->head->y;inthx=psnake->head->x;psnake->head=GetSnakeTail(psnake);switch(psnake->dir){caseDIR_UP:psnake->head->y=hy-1;psnake->head->x=hx;break;caseDIR_DOWN:psnake->head->y=hy+1;psnake->head->x=hx;break;caseDIR_LEFT:psnake->head->y=hy;psnake->head->x=hx-1;break;caseDIR_RIGHT:psnake->head->y=hy;psnake->head->x=hx+1;break;default:break;}}intchecksnake(structTFood*pfood,structTSnake*psnake){if(psnake->head->y<=0||psnake->head->y>=GAMEWIN_YLEN||psnake->head->x<=0||psnake->head->x>=GAMEWIN_XLEN){return-1;}structTSnakeNode*pnode=GetSnakeTail(psnake);inti=0;for(;i<psnake->length-1;++i,pnode=pnode->front)if(psnake->head->y==pnode->y&&psnake->head->x==pnode->x)return-1;if(psnake->head->y==pfood->y&&psnake->head->x==pfood->x)return1;return0;}voidsnakegrowup(structTFood*pfood,structTSnake*psnake){structTSnakeNode*pnode=(structTSnakeNode*)malloc(sizeof(structTSnakeNode));switch(psnake->dir){caseDIR_UP:pnode->y=psnake->head->y-1;pnode->x=psnake->head->x;break;caseDIR_DOWN:pnode->y=psnake->head->y+1;pnode->x=psnake->head->x;break;caseDIR_LEFT:pnode->y=psnake->head->y;pnode->x=psnake->head->x-1;break;caseDIR_RIGHT:pnode->y=psnake->head->y;pnode->x=psnake->head->x+1;break;default:break;}pnode->front=GetSnakeTail(psnake);psnake->head->front=pnode;psnake->head=pnode;++psnake->length;}voidgameover(WINDOW*win,char*str){mvwprintw(win,(int)(GAMEWIN_YLEN/2),(GAMEWIN_XLEN/2-strlen(str)/2),str);mvwprintw(win,(int)(GAMEWIN_YLEN/2+1),20,"Pressanykeytoquit...");wrefresh(win);}WINDOW*newgamew(){WINDOW*win=newwin(GAMEWIN_YLEN,GAMEWIN_XLEN,1,3);box(win,0,0);mvwprintw(win,0,2,"GAME");mvwprintw(win,GAMEWIN_YLEN-1,2,"Level:%d",g_level);mvwprintw(win,GAMEWIN_YLEN-1,30,"Speed:%d",(int)(g_level/3));wrefresh(win);returnwin;}structTSnake*initsnake(){structTSnake*psnake=(structTSnake*)malloc(sizeof(structTSnake));psnake->dir=DIR_LEFT;psnake->length=4;newsnakenode(&newsnakenode(&newsnakenode(&newsnakenode(&psnake->head,4,50)->front,4,53)->front,4,52)->front,4,51)->front=psnake->head;returnpsnake;}structTSnakeNode*newsnakenode(structTSnakeNode**ppsnode,inty,intx){*ppsnode=(structTSnakeNode*)malloc(sizeof(structTSnakeNode));(*ppsnode)->y=y;(*ppsnode)->x=x;(*ppsnode)->front=NULL;return*ppsnode;}voiddestroysnake(structTSnake*psnake){structTSnakeNode*psnode=GetSnakeTail(psnake);structTSnakeNode*ptmp=NULL;inti=0;for(;i<psnake->length;++i){ptmp=psnode;psnode=psnode->front;free(ptmp);}free(psnake);psnake=NULL;}voiddrawsnakew(W

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论