毕业设计(论文)-Linux平台下基于C的贪食蛇游戏设计与实现.doc_第1页
毕业设计(论文)-Linux平台下基于C的贪食蛇游戏设计与实现.doc_第2页
毕业设计(论文)-Linux平台下基于C的贪食蛇游戏设计与实现.doc_第3页
毕业设计(论文)-Linux平台下基于C的贪食蛇游戏设计与实现.doc_第4页
毕业设计(论文)-Linux平台下基于C的贪食蛇游戏设计与实现.doc_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

目 录摘 要iabstractii 绪 论11.1 论文选题依据11.2 贪食蛇游戏选题背景11.3 贪食蛇设计概述1 平台简介22.1 系统介绍22.1.2 linux系统的主要特点22.1.3 linux的组成22.2 开发工具32.2.1 c语言简介32.2.2gtk简介32.2.3 linux编译工具gcc简介42.3 gtk环境的搭建43 系统分析53.1 可行性分析53.1.1 技术可行性53.1.2 经济可行性53.1.3 操作可行性53.2 需求分析53.2.1 功能要求53.2.2 性能要求63.2.3 运行要求64 系统概要设计64.1 程序初始化64.2程序流程64.2.1系统模块64.2.2 系统流程65 系统详细设计85.1 系统界面85.2 对象模型设计115.3 食物及蛇状态的初始化及食物的出现125.4 游戏运行中的设计思路125.5 游戏规则135.6 游戏实现以及其代码135.6.1 蛇移动的实现135.6.2 蛇死亡的判断145.6.3 蛇到达边框时从另一端出现和传送的实现146 贪食蛇ai的算法设计156.1 蛇自己寻找食物的算法设计156.1.1 贪心算法156.1.2 利用贪心算法实现最短路径的选择166.2 蛇避开吃到自己身体的算法设计176.3 地图2需要新增的一些判断187 调试以及测试结果分析197.1 系统测试207.2 在软件的测试过程中发现的几个小问题207.3 系统需要的改进与提高21结束语22参考文献23致 谢24附 录25摘 要 贪食蛇游戏操作简单方便,老少皆宜,是一款不错的小游戏。而linux挟其价格低廉、品质良好与稳定的优势,正吸引着众多以pc为主工作、学习和娱乐的人们。 基于linux平台下的贪食蛇游戏采用的linux底下c语言和gtk图形化编程工具编写,操作简单。玩家首先进入游戏,在游戏中可以对游戏进行暂停、退出等操作,还加入了双人对战模式,丰富了游戏,增大游戏的娱乐性。 本文分几部分阐述了基于linux下的贪食蛇游戏的开发过程,分章节较详细的介绍了游戏的结构和设计实现过程,并详细画出了系统流程图,还详细介绍了各个功能完成相关技术,写出了调试以及测试结果分析。 关键词: gtk;linux操作系统;贪食蛇游戏 abstractsnake game is easy and convenient to operate.it is a good game for all ages. relying on its low price, good quality and stable competitive advantage,the linux is invisibly attracting large numbers of people who base pc as main work、learning and entertainment platform. the linux platform-based snake game is easy to operate by adopting the c language and gtk graphical programming tools.after entering the game, the players can do some operations,like “pause”, “exit” ect.the added two-war mode enriches the game, and makes the game more entertaining. this paper describes the development process of the linux-based snake game in several parts. a comparatively detailed introduction is given to the structure of the game and the process of the designs implementation in sub-sections. a system flow chart is drawn in details.the technology related to the completion of various functions is also given in details. debugging and an analysis of the test results is written out. key words: gtk;linux operating system;snake gameii 绪 论1.1 论文选题依据linux挟其价格低廉、品质良好与稳定的竞争优势,正无形无影地吸引众多以pc为主工作平台上的人们。随着科学技术日新月异的发展,linux提供了更多图形接口的桌面操作环境和应用软件,操作更加简单方便。linux是源代码开放的操作系统,是当今优秀的操作系统之一。标准linux经过小型化裁剪之后的专用linux操作系统即嵌入式linux,已成为当今的一大热点,它能够固化于容量只有几kb或者几mb的存储器芯片或者单片机中,适合于特定嵌入式场合,目前已经开发成功的嵌入式系统中,大约一半的系统使用嵌入式linux。嵌入式linux得到众厂商的青睐,在工程实践中应用也十分广泛,我校的嵌入式系统课程同样也采用嵌入式linux进行教学工作,因此,此次游戏设计环境也采用linux系统。 linux内核的大部分代码是由c语言编写的, linux应用程序也多由c语言编写【1】。c语言是结构化、模式化的语言,程序可移植性好,运算符丰富、代码效率高,它兼有汇编语言和高级语言的优点,既适合于开发系统软件,也适合于编写应用程序,被广泛应用于事务处理、科学计算、工业控制、数据库技术等领域。此次设计语言环境也选用c语言。gtk是linux平台下比较好的一个c语言图形开发工具,所以本次也选择了gtk图形开发工具。1.2 贪食蛇游戏选题背景随着经济的快速发展,人们生活的步调日益加快,计算机的地位在人们的生活中已日益突出,基于各种操作系统的娱乐游戏也越来越多、越来越大众化,成为人们生活中必不可少的一部分。而随着人们生活品质的提高,电脑游戏也越来越多元化,贪食蛇就是其中一种。贪吃蛇这一游戏简单易行,操作方便,娱乐性较强,吸引了不少人。这一款游戏紧紧地抓住了人们的心理,虽然简单,却起乐无穷,贪食蛇游戏操作简单方便,老少皆宜,是一款不错的小游戏,而实现二人对战使游戏更具新意也更有趣。 该游戏给人们带来了追逐的快感,以及成功后的满足感,对于一直处于高压下的现代人是很好的放松工具。1.3 贪食蛇设计概述该游戏主要功能包括:选择玩家人数与游戏模式、选择游戏地图、开始游戏、暂停游戏、退出游戏等。 选择玩家人数:玩家可以选择单人模式、双人对战模式和人机对战模式进入游戏。 选择游戏地图:玩家可以选择玩哪个地图,暂时有2个地图供选择,每一个地图将会有不同的墙壁和不同的传送点。 开始游戏:玩家1通过方向键,玩家2通过w s d a键,使蛇改变向去吃食,每吃一个食物蛇身加长,分数加1。每局300秒。 暂停游戏:点击暂停按钮暂停游戏,点击继续按钮继续游戏。退出游戏:点击退出按钮退出游戏。 平台简介2.1 系统介绍2.1.1 linux简介 linux是一套免费使用和自由传播的类unix操作系统,它主要用于基于x86系列cpu的计算机上。这个系统是由世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的unix兼容产品【2】。2.1.2 linux系统的主要特点linux操作系统作为当今主要的操作系统之一具有以下这些特点:(1)开放性(2)多用户(3)多任务(4)良好的用户界面(5)设备独立性(6)提供了丰富的网络功能(7)可靠的安全系统(8)良好的可移植性2.1.3 linux的组成 linux的内核:内核是系统的核心,是运行程序和管理 像磁盘和打印机等硬件设备的核心程序。 linux shell: shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。 linux文件系统: linux文件系统是文件存放在磁盘等存储设备上的组织方法。linux能支持多种目前主流的文件系统,如ext2、ext3、fat、vfat、iso9660、nfs、smb等。 linux应用系统:标准的linux系统都有一整套称为应用程序的程序集,包括文本编辑器、编程语言、x window、办公套件、internet工具、数据库等【3】。 2.2 开发工具 在确定了操作系统后,就该选择开发工具了。考虑到是在linux平台下开发而linux的内核主要是由c语言编写的,所以c语言在linux下的软件开发具有独到的优势【4】。由于考虑到游戏开发需要一个良好的界面,终端程序显然无法达到要求。于是gtk图形化编程工具就成了必然的选择。下面将简要介绍本次贪食蛇游戏开发所要用到的主要工具。2.2.1 c语言简介 c语言是目前世界上流行、使用最广泛的高级程序设计语言。c语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用c语言明显优于其它高级语言,许多大型应用软件都是用c语言编写的。c语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画它是数值计算的高级语言【4】。 c语言的特点有:(1)简洁紧凑、灵活方便。 (2) 运算符丰富。 (3) 数据结构丰富。 (4) c是结构式语言。 (5) c语法限制不太严格、程序设计自由度大。 (6) c语言允许直接访问物理地址,可以直接对硬件进行操作。 (7) c语言程序生成代码质量高,程序执行效率高。 (8) c语言适用范围大,可移植性好【5】。 2.2.2gtk简介 gtk(gimp toolkit)是一套跨多种平台的图形工具包,按lgpl许可协议发布的。虽然最初是为gimp写的,但目前已发展为一个功能强大、设计灵活的一个通用图形库。特别是被gnome选中使得gtk+广为流传,成为linux下开发图形界面的应用程序的主流开发工具之一,当然gtk+并不要求必须在linux上,事实上,目前gtk+已经有了成功的windows版本。 gtk虽然是用c语言写的,但是您可以使用你熟悉的语言来使用gtk,因为gtk+已经被绑定到几乎所有流行的语言上,如:c+,php, guile, perl, python, tom, ada95, objective c, free pascal, and eiffel【6】。 gtk的一个简单例子如下:该例子产生一个窗口。它不能自己退出,只能通过shell来杀死进程(调用kill命令)。/*例子 base.c */#include int main( int argc,char *argv ) gtkwidget *window;gtk_init (&argc, &argv); /* 初始化显示环境 */ window = gtk_window_new (gtk_window_toplevel); /* 创建一个新的窗口*/gtk_widget_show (window); /*显示窗口*/ gtk_main (); /*进入睡眠状态,等待事件激活*/return(0); 从上面的程序可以看出,gtk是一个事件驱动工具包,当它运行到gtk_main()函数时会自动睡眠,直到有事件发生,控制权转让给相应的函数调用,在该函数中可以用标准c写出相应的事物逻辑。这与windows 上的程序处理是一样的。2.2.3 linux编译工具gcc简介gcc是一个用于linux系统下编程的编译器。gcc=gnu compiler collection,是由stallman所开发的linux下的编译器,可以编译的语言包括:c, c+, objective-c, fortran, java,ada等。不过,现在gcc也有了许多win32下的移植版本。如今的gcc借助于他的特性,具有了交叉编译器的功能,即在一个平台下编译另一个平台的代码。2.3 gtk环境的搭建 我们以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语言是一门成熟的高级语言,可用于开发各种系统,也可用于开发游戏系统【7】。同时c语言也拥有相当多的技术人员。gtk是linux下的一个图形化编程工具,其开发出来的程序能在装有gtk环境的linux系统下顺利运行。可以说在技术方面开发此系统不会有什么问题。3.1.2 经济可行性 随着手机和电脑的普及,这样的小游戏也将随着普及因此其需求也将不断上升,而由于技术的成熟与为数众多的开发人员使得此系统的开发并不困难,再者此系统运行的平台linux操作系统是开源和免费的,所以开发此系统的成本并不会很高。因此此系统具有相当的经济利益,到时候我们也可以静观其成.3.1.3 操作可行性本系统是一个简单的单机游戏系统,对于这样一个系统,其操作只需要使用简单的几个按键和鼠标点击按钮就可以实现,因此本系统的操作简单易记,可以说一看就会的,系统在操作上是不会存在问题的,本系统需要在linux操作系统下运行,而用户也可以在其受益不浅.3.2 需求分析3.2.1 功能要求本系统是一个简单的单机游戏,其功能要求实现单人游戏模式、双人对战模式和人机对战模式以提高游戏的可玩性,系统默认模式为单人模式,通过点击按钮选择不同游戏模式进行游戏。系统还要求实现至少2个不同地图的选择,以提高游戏的趣味与丰富性。单人模式时只有玩家1通过上下左右键来控制蛇的方向,在规定时间内尽量多吃食物,双人模式时增加的玩家2可以通过w,s,a,d来控制蛇的移动方向,通过双人竞技比较谁吃的食物最多,人机对战是在只有一个人的情况下可以与电脑进行对战。游戏中要实现暂停与退出和关于帮助文档。3.2.2 性能要求 游戏操作要求简单易行,游戏过程中画面移动要流畅,通过键盘对蛇移动方向控制时无明显延迟,由于本系统将来有可能在嵌入式linux上移植,而嵌入式系统一般存储较小,处理器的处理速度也不是很快,因此本系统对内存和处理器的使用的要求都要尽可能的小。3.2.3 运行要求本系统由于要使用到gtk图形化编程工具,而图形化编程工具gtk开发出来的程序需要有gtk环境才能运行,由于是用c语言实现,因此系统对硬件的要求并不是很高。所以本系统的运行要求是搭建有gtk环境或是安装gnome桌面环境的linux操作系统。4 系统概要设计4.1 程序初始化 程序初始化主要由初始化函数init_game()在游戏开始时对各变量进行初始化赋值。每次重新游戏时,得分将清零,游戏时间重设为300秒,蛇的长度与位置恢复为初始状态,但游戏模式与游戏的地图将不变,需要玩家自己选择才会发生改变游戏的初始化流程如图4.1所示。4.2程序流程4.2.1系统模块本系统分为:图形初始化gtk_init()与游戏初始化game_init()模块、图形界面设计create_window()与地图设计draw_map()模块、模式选择cb_choose()模块、游戏play_game()模块、成绩输出模块、电脑ai模块、游戏退出模块、游戏中蛇通过判断是否撞墙或吃到自己来判断蛇的死亡。程序模块如图4.2所示。4.2.2 系统流程本系统流程:当用户打开系统,系统首先对各参数进行初始化设定,当玩家点击“开始”时开始游戏,用户通过方向键进行游戏,游戏过程中如果蛇死亡或游戏时间完则停止游戏并显示分数与结束信息,当玩家选择从新开始时游戏进行初始化设定,当玩家选择退出时退出游戏。游戏流程如图4.3所示。图 4.1 程序初始化流程图 图 4.2 游戏模块图图 4.3 游戏流程图5 系统详细设计5.1 系统界面 用户界面是现代软件重要的组成部分,界面的好坏对于游戏软件来说也相当的重要,因为一个用户友好的界面能让玩家在游戏过程中感觉更舒心,而一个不友好的界面将使游戏的品质大打折扣。本系统界面的设计遵循如下的指导规则:1 让用户驾驭软件,而不是软件驾驭用户。2 尽可能减少用户的记性。3 保持界面的一致性【8】。本游戏的界面设计如图5.1所示。图5.1 游戏界面的设计此系统界面设计简约而不简单,用户使用此系统时能够很容易记住方便玩家使用,因此不会让人感觉复杂而乏味。界面主要分为以下几大部分。(1)主界面:所有信息都显示在主窗口上,其中主要有游戏显示区、游戏信息显示区和游戏按钮区。主窗口创建代码如下:/创建窗口window=gtk_window_new(gtk_window_toplevel);/设置主窗口标题gtk_window_set_title(gtk_window(window),贪食蛇);/主窗口显示位置gtk_window_set_position(gtk_window(window),gtk_win_pos_center);/接受关闭事件并且关闭窗口g_signal_connect(g_object(window),destroy,g_callback(gtk_main_quit),null);/设置主窗口大小gtk_widget_set_size_request(window,800,500);/边框大小gtk_container_set_border_width(gtk_container(window),10);(2)游戏显示区:此区域是游戏过程的显示区域,也是界面的主要设计部分。通过draw=gtk_drawing_area_new();创建游戏区域窗口。(3)游戏开始界面如图5.2所示。在打开系统时,游戏区显示一张欢迎界面的图片。用pixbuf = gdk_pixbuf_new_from_file (./test.jpg,null);将文件名为test.jpg的图片添加进游戏区并设为背景。(4)信息显示区:主要显示游戏过程中的各种信息,如时间和得分等。gtk_label_new()函数用于显示游戏分数等信息。信息显示区如图5.3所示。(5)按钮区:主要显示游戏中需要点击选择的按钮。通过gtk_button_new_with_label()函数创建按钮。按钮布局如图5.4所示。(6)通过gtk_fixed_new()创建一个名叫fixed的固定容器,然后将游戏显示区draw、信息显示和按钮添加进fixed,最后把fixed容器添加进window主窗口,最后通过gtk_widget_show_all(window)函数将其显示出来。图5.2 游戏开始界面设计 图5.3游戏信息显示区 图5.4 系统按钮布局5.2 对象模型设计 在本系统中对象模型的设计主要是蛇的设计,食物的设计,和地图的设计。蛇的设计主要是通过2个画圆函数gdk_draw_arc()画出蛇的每一个结点同时设定颜色。而食物也是通过画圆函数画出。地图中的传送点和墙体是通过画方格函数gdk_draw_rectangle()画出。图5.5中就是蛇, 即是食物,褐色长方形即使墙的设计,是传送点。图5.5地图二的设计图5.6地图一的设计5.3 食物及蛇状态的初始化及食物的出现 蛇状态的初始化是由定义蛇结构体时初始化决定的,每一次开始蛇的长度,出现位置和移动方向都是一样的,它们长度都为6个结点,方向都向右,蛇1初始位置是(3,3),蛇2初始位置是(3,30)。无论是在游戏的开始还是进行中,食物都是随机出现的,通过rand()随机数产生函数随机产生食物出现的坐标,在产生的随机坐标上画出食物。5.4 游戏运行中的设计思路游戏中蛇的运动是靠通过对画面的不断清除与重画而实现的,每一次运动时先用背景色擦除掉原有蛇的图像,再将蛇画在其新出现的位置,由于每一次擦除与重画间隔的时间非常短,利用人的视觉暂留性,让蛇看上去就像在连续不断的运动。而食物未被吃前,传送点和墙体被擦除后重画的位置与原来一样,所以让人感觉其并没有变化。蛇身的移动与运动方向主要是受头结点控制,因为蛇每一次运动就是靠后一结点画在前一结点的位置上来实现的,所以对蛇的控制主要是对头结点的控制。蛇1通过上下左右键,蛇2通过w、s、a、d键来控制蛇的移动方向游戏中蛇运动速度的快慢主要是通过设置画面重画频率来实现的,而具体实现是通过对函数的调用频率,gtk中用函数g_timeout_add ()来实现对函数的定时调用。游戏暂停则是通过g_source_remove()函数中止对蛇运行函数的定时调用。通过g_timeout_add()来实现游戏的继续。设计了传送点和墙体来增加游戏的复杂性与可玩性5.5 游戏规则1 单人模式单人模式的规则比较简单,只要在规定的时间内不死亡和尽量得分最多即可。蛇撞墙或自己身体时即死亡,当蛇进入传送点时将从另一特定位置出来。2双人竞技模式蛇进入传送点时将从另一特定位置出来,规定时间内蛇没死亡得分最多者赢,得分相等为平局,游戏中撞墙或自己身体死亡者输。两条蛇可以互相穿透。3人机对战模式当用户选择此模式时将于电脑控制的蛇进行竞技,此模式规则与双人对战模式一样。5.6 游戏实现以及其代码5.6.1 蛇移动的实现 蛇的移动方向主要受头结点控制,所以每次画蛇时只要把前一结点的值赋给后一节点即可。 当蛇头的移动方向向右时,y值不变x的值不断增加。 当蛇头的移动方向向左时,y值不变x的值不断减少。 当蛇头的移动方向向下时,y值增加x的值不变。 当蛇头的移动方向向上时,y值减小x的值不变。画蛇和蛇移动代码如下:/蛇身体节点位置的赋值gint i;for (i=snake.node;i0;i-) snake.xi= snake.xi-1; snake.yi= snake.yi-1; /蛇移动的实现switch( snake.dir) case 1: snake.x0+=1;break; case 2: snake.x0-=1;break; case 3: snake.y0-=1;break; case 4: snake.y0+=1;break;/*1向右,2向左,3向上,4向下*/5.6.2 蛇死亡的判断当蛇头的值与蛇身或与墙的值相等时,蛇即算死亡,代码如下:void judge_die(struct snake *psnake)gint j;for(j=3;jnode;j+)if( psnake-xj= psnake-x0& psnake-yj= psnake-y0) psnake-life=1;5.6.3 蛇到达边框时从另一端出现和传送的实现 当蛇头的x或y值达到边框的最大或最小位置时相应的给x或y赋以边框的最小或最大值以实现当蛇到达边框时能从另一端出来,同理当蛇头的x,y值等于传送点位置的值时将蛇头x,y的值赋以被传送到位置的值,这样将实现蛇的传送功能。 部分代码实现如下:if(snake2.x0=0|snake2.x0=59|snake2.x0=30)snake2.life=1;else if(snake2.dir=3&snake2.y0=47) snake2.y0=-1;/到达传送点的处理if(snake2.x0=1&snake2.y0=3)snake2.x0=58; snake2.y0=43;if(snake2.x0=58&snake2.y0=3)snake2.x0=1; snake2.y0=43;6 贪食蛇ai的算法设计本游戏设计了人机对战模式,因此电脑贪食蛇的实现就必须用到人工智能也就是ai,下面将详细介绍实现ai的算法设计。6.1 蛇自己寻找食物的算法设计此部分的算法设计是蛇ai设计的最主要也是最基本的部分。在系统中电脑蛇主要通过搜寻最短路径来寻找食物,而最短路径的搜索可以通过很多算法来实现,本系统主要是通过寻找局部最优解的方法来搜索蛇到食物的最短路径,而其中有一个贪心算法符合此部分的设计。6.1.1 贪心算法所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。贪心算法的基本思路如下:(1)建立数学模型来描述问题。(2)把求解的问题分成若干个子问题。(3)对每一子问题求解,得到子问题的局部最优解。(4)把子问题的解局部最优解合成原来解问题的一个解。实现该算法的过程:从问题的某一初始解出发;while 能朝给定总目标前进一步 do求出可行解的一个解元素;由所有解元素组合成问题的一个可行解。6.1.2 利用贪心算法实现最短路径的选择本系统中蛇主要是通过头结点的移动来控制蛇的移动,因此电脑蛇的移动也主要是通过头结点的的方向的选择来控制蛇的移动。根据贪心算法得出最短路径的步骤:(1)选择一组解即在蛇头结点有可能移动的四个方向,每个方向选出一个点用于挑选最优解。(2)挑选出来的四个点依次计算出其与食物的距离,然后进行比较。(3)选出离食物最近的一个点。(4)把蛇头结点移动的方向设为移动到挑选出来离食物距离最近点的方向。(5)移动到下一点后又从第1步执行,直到最后得到最优解为止。求可行解(第2步)示意图如下:图6.1 求可行解示意图计算距离通过比较选出最短距离然后选择蛇移动方向的实现代码如下,其中要考虑到选出来的四个点中有一个是被蛇身体所占据,蛇是不能往哪个方向移动的,因此要把这一情况排除。算法实现代码如下:void get_dir()gint a,b,a1,a2,b3,b4;gint d1,d2,d3,d4;a=snake2.x0-food.x;b=snake2.y0-food.y;a1=(snake2.x0+1)-food.x;a2=(snake2.x0-1)-food.x;b3=(snake2.y0-1)-food.y;b4=(snake2.y0+1)-food.y;/计算与食物的距离d1=a1*a1+b*b;d2=a2*a2+b*b;d3=b3*b3+a*a;d4=b4*b4+a*a;/选择最短距离的点后得到方向if(d1d2&d1d3&d1d4&snake2.dir!=2)snake2.dir=1;else if(d2d1&d2d3&d2d4&snake2.dir!=1)snake2.dir=2;else if(d3d1&d3d2&d3d4&snake2.dir!=4)snake2.dir=3;else if(d4d1&d4d2&d4d3&snake2.dir!=3)snake2.dir=4;6.2 蛇避开吃到自己身体的算法设计为了提高电脑的ai,不至于蛇轻易就因为吃到自己而死亡,同时也是增加游戏的可玩性。所以我们应该让蛇有一定的避开自己身体的能力。同样,因为蛇的移动是受头节点的控制,因此我们也只用判断头结点即可。蛇头节点每一次运动时将做一个判断,判断它的前方是否有蛇身体的存在如果没有按原有策略运动,如果有则改变蛇移动的方向。但并不是随意改变方向即可,此系统是通过顺时针方向做出判断与改变的。如当蛇头下一步的运动是向右移动的时候,电脑将优先考虑其前方是否有蛇身体的存在,如果有则改变其方向向下同时判断下方是否有蛇身体的存在,如果还是有则改变其方向向左同时判断左方是否有蛇身体的存在,如果有则再改变其方向向上。实现代码如下:if(snake2.dir=1) int j;for(j=3;j30&snake2.x030&snake2.dir!=4)snake2.dir=3;if(snake2.y0=3&snake2.dir!=1)snake2.dir=2;else if(food.x30&snake2.dir!=4)snake2.dir=3;if(snake2.y0=3&snake2.dir!=2)snake2.dir=1;此地图还需要考虑墙的存在,当蛇头到达墙时必须改变方向避开它,否则将撞墙死亡。实现代码如下:if(snake2.x030&(snake2.x0=1|snake2.x0=29)&snake2.dir!=4)snake2.dir=3;if(food.x30&(snake2.x0=58|snake2.x0=31)&snake2.dir!=4)snake2.dir=3;if(food.x30&snake2.y0=3)snake2.dir=1;当蛇从一个区域到达另一区域的时候,有两个出口可供选择,这个时候蛇将选择离食物最近的那个出口出现。两个出口是上下分布的,因此只用判断食物所在坐标的y值即可。因为游戏区域y的大小是从0到50,所以当y值小于等于25时从上面出口出现,当y值大于25时从下面出口出现。部分实现代码如下:if(snake2.x0=1&snake2.y0=3)if(food.y25)snake2.x0=58;snake2.y0=43;if(food.y=25)snake2.x0=58;snake2.y0=3;7 调试以及测试结果分析 在系统在完善过程中做了大量的测试,这也是一个软件完善过程中所必须的。7.1 系统测试1测试用例:(1)使蛇经过各个边界的情况。(2)使蛇达到各个传送点。 (3)测试蛇死亡和游戏时间到的情况。(4)测试使蛇撞墙。(5)测试电脑蛇的运行。(6)测试软件的各个按钮。2预期出现的情况:(1)蛇能够从一方边界进去及时的从另一边界出来。(2)蛇到达传送点时能够正确的从被传送点出来。(3)当蛇死亡时和时间到了的时候,能够实现游戏停止和正确输出游戏信息。(4)当蛇撞墙将死亡。(5)电脑蛇能够正确的寻找食物与具有一定的ai。(6)系统能正确够响应点击按钮时的操作。3实际结果:游戏测试的结果基本上符合预期目标,但也还有几个小问题。7.2 在软件的测试过程中发现的几个小问题游戏过程中,当用户以非常快的速度同时按下几个控制键,蛇有可能会出现死亡现象。分析原因有可能是当以很快的速度按下多个控制键时蛇的方向的值已经变化而实际移动方向却未来得及改变,在这同时又按下了另一方向键,由此蛇就直接按后一方向的值的方向运动,于是就发生撞到自己死亡的现象。在蛇撞墙死亡时,头结点将会进入墙体中。估计是在判断蛇死亡后又画了一帧画面。电脑蛇有时候会出现吃到自己的情况,情况稍微复杂的时候无法做出很好的判断,可能原因是电脑的ai还不够高。电脑蛇到达边界时不能及时从另一边出现,尚未发现原因。系统虽然存在些问题,但系统的功能与模块都成功实现且系统总体运行良好且稳定,系统的下一阶段将主要解决这些问题。7.3 系统需要的改进与提高由于各种原因,本系统依然存在着许多缺点如有bug的存在,电脑的ai不高的问题等。针对本系统的一些缺点,在二期开发时主要在以下方面进行改进:1 完善系统,解决系统所出现的问题。2 改善与完善算法,使电脑的能变得高些。3 增加游戏地图、游戏模式和游戏难度选择,使游戏的可玩性大大增加。4 加上网络功能,实现双人通过局域网进行对战。5 丰富界面,使界面更美观与拥有良好的可操作性。6 对游戏进行优化,如果可能,最好能实现linux嵌入式的移植。使游戏具有更广阔的前景。结束语由于专业知识的不足,系统开发经验的缺乏与时间的仓促,因此免不了系统相对简单和出现许多的缺点。对gtk开发环境的不熟悉,导致系统界面无法得到很好的设计,许多功能还无法实现。因为时间的限制,游戏的丰富性还不足,目前也只设计了两个地图,还有由于是第一次设计电脑的ai,所以还存在许多的不足电脑ai也不高。虽然本系统设计还存在着许多的不足,但其便捷的操作性与高度的可塑性和强烈趣味性,注定其任然是一款成功的设计。在此次系统开发中让我受益良多,不光让我学到了许多的知识,也让我了解到自己的不足,同时也引发了我对系统开发特别是linux下游戏开发的兴趣,相信我在这次开发之后依旧会坚定的走下去。参考文献1 吴岳编著,linux c程序设计大全m.清华大学出版社,2009.2 孟庆昌编著,操作系统教程 - linux实例分析m.西安电子科技大学出版社,2004.3 主编:孙种秀,操作系统教程(第四版)m.高等教育出版社,2008.4 谭浩强,c程序设计(第三版)m.清华大学出版社,2005.5 严蔚敏 吴伟明编著,数据结构(c语言版)m.清华大学出版社,2007.6 peter mattis, spencer kimball, josh macdonald,gtk turtoilm..7 浦滨编著,c游戏编程从入门到精通(第二版)m.科学出版社,2006.8 (美)施奈德曼,用户界面设计m.电子工业出版社,2006.附 录部分源代码:/头文件、变量定义与结构体定义#include#define gtk_up 65362#define gtk_down 65364#define gtk_left 65361#define gtk_right 65363#define n 200static gtkwidget *window = null;static gtkwidget *draw= null,*draw2=null;static gdkpixmap *pixmap = null,*pixbuf=null;gtkwidget *label;gtkwidget *score_label;gtkwidget *score_label2;gtkwidget *inf_label;gtkwidget *win_label;gtkwidget *ti_label;gdkcolor color;gdkgc *gc_blue;gdkgc *gc_red;gdkgc *gc_br;gdkgc *gc_tt;gdkgc *gc_a;gdkgc *gc_b;gboolean playing = false;gboolean pauseing = false;gboolean ai=false;gint score=0,score2=0;/*得分*/gint speed=130;guint timer=0;guint timer1=0;gint times=300;gint play_n=1;gint t=0;gint mp=1;struct foodint x;int y;int yes; /*判断是否出现食物的变量 */ food=6,16,0;struct snakeint xn;int yn;int node;int dir;/*蛇移动方向:1右,2左,3上,4下*/int life/*蛇的生命:0活着,1死亡*/snake=4,4,7,1,0,snake2=4,30,7,1,0;/系统主程序gint main(int argc, char *argv)gtk_init(&argc,&argv);create_window();gtk_main();return 0;/窗口的设计void create_window()gtkwidget *exit,*start,*choose,*choose1,*choose2,*pause,*about;gtkwidget *fixed;gtkwidget *g_map1,*g_map2;window=gtk_window_new(gtk_window_toplevel);gtk_window_set_title(gtk_window(window),贪食蛇);gtk_window_set_position(gtk_window(window),gtk_win_pos_center);g_signal_connect(g_object(window),destroy,g_callback(gtk_main_quit),null);gtk_widget_set_size_request(window,800,500);gtk_container_set_border_width(gtk_container(window),10);g_signal_connect (gtk_object(window),key

温馨提示

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

评论

0/150

提交评论