基于的贪吃蛇游戏的设计与实现

摘要

在现代文明高度发达的今天,人们在日常生活中来源于各个方面的压力也越来越大。在所剩无几的闲暇时间里,人们更希望通过某种娱乐方式来放松疲惫不已的身心。游戏,我相信这是很大一部分人的选择!说到游戏,可能每个人有不同的答案,但是有一款游戏是每个人都熟悉并且玩过的,那就是贪吃蛇。贪吃蛇以其无网络运行、硬件要求低,操作简单等优势在非智能手机时代大放光彩。本次毕业设计的主题就是小游戏贪吃蛇的设计与实现,此次选择的程序设计语言为Python。Python运用地越来越广泛,甚至有着“黄金语言”的美称,它拥有相当丰富的标准库以及第三方模块库。为了节省开发的时间成本,本文运用的就是其中的PyGame模块来实现游戏的开发工作。

关键词:游戏;贪吃蛇;Python;PyGame

Design and development of the greedy snake small game based on python

Abstract

In the modern civilization highly developed today, people in daily life from all aspects of the pressure is also growing. In the few spare time left, people prefer to relax their exhausted body and mind through some kind of entertainment. Game, I believe that this is the choice of a large number of people! When it comes to games, everyone may have different answers, but there is a game that everyone is familiar with and has played, that is, greedy snake. Greedy snake, with its advantages of no network operation, low hardware requirements, simple operation, etc., shines in the era of non smart phones.This graduation project is the design and implementation of greedy snake and the programming language chosen this time is Python. Python is used very widely now, and even has the reputation of “golden language”. It has a rich standard library and a third-party module library. In order to save development time and cost, this paper uses the PyGame module to realize the development of the game.

Key wordsGame;Snake;Python;PyGame

一、绪论

(一)研究现状与背景

游戏是如今社会非常火热的娱乐活动之一,特别是在进入网络时代之后,各种各样的游戏如雨后春笋般的涌现。有些游戏如日中天,让游戏公司赚的盆满钵满,而有些游戏的寿命却如昙花一现般短暂,隐于尘埃。但是不管哪款游戏,都一定有它存在的价值,或是推动游戏行业的发展,或是给人们带来欢乐。当然,对于人们来说,影音视频、电子阅读、K歌娱乐,旅游都是不错的娱乐选择。但是随着现代化建设的不断加快,这些传统的娱乐方式,早已满足不了人们的需求,而游戏也就是在这个时候渐渐走入人们的视野。不管是出于打发闲暇时光的想法,还是放松在忙碌一天之后的疲惫身心,游戏已经是很多人的第一选择。换一种说法,现在年轻人的生活之中也越来越离不开游戏。

早在1976年,美国街机游戏生产商Gremlin便推出了在后来引领了游戏行业的这么一款经典街机游戏,Blockade。玩法就如同它的名字一样,封锁,屏幕上会有两个游戏角色,而两位玩家分别去控制自己角色的左右行进方向,经过的地方则会生成障碍物,谁先碰到障碍物则谁输掉了游戏。Blockade游戏一经推出便受到大众追捧,游戏公司纷纷效仿开发类似游戏,也出现在各种操作平台上。但是真正让这种游戏形式家喻户晓,走向世界的还是诺基亚公司在21年之后推出的手机产品上搭载的贪吃蛇游戏——Snake。

贪吃蛇的规则是,用键盘操控屏幕里小蛇的行进方向去吃豆子,吃的豆子越多小蛇的身体则会越来越长,蛇头触碰到蛇身或是障碍物时则游戏结束。由于贪吃蛇游戏玩法简单、硬件要求低,无论是上厕所时、排队时、等待汽车时,它都能满足各种需求场景下的应用。而在那个游戏行业竞争并不大的时代,使得它能做到人尽皆知。相对于其它游戏来说,贪吃蛇是一个带有悲剧性的游戏。很多游戏都是的规则是玩家打到通关,以游戏操纵者的胜利而告终,但是贪吃蛇确是以小蛇的死亡结束游戏。不管你玩法多么娴熟,有多高超的技艺,随着小蛇的身体增长只会离死亡越来越近,离游戏的结束也越来越近,在蛇身越来越长的时候肯能你考虑的不再是如何去吃到豆子,而是如何避免蛇头碰到蛇身或是障碍。或许贪吃蛇想告诉我们的道理是不要疲于奔命,要做到生活和事业兼顾。树大招风,福兮祸倚,随时面对生活中可能发生的一切。我相信每款游戏都能给我们带来一定的积极意义。

(二)行性分析

科学性、预见性、公正性、可靠性是一个项目可行性分析必须具备的特点。但是由于此次的项目并不会上线或作商用盈利,所以本文的可行性分析仅对我个人而言阐述。本次毕业设计的可行性分析大致包括以下三个方面。

经济可行性,此次毕业设计开发的是一个小型单机贪吃蛇游戏系统,对于现在的个人笔记本电脑硬件来说完全可以承担此次系统开发的语言编写、测试以及运行等任务。而开发人员分配方面,个人足以完成此次系统开发的全部任务,所需预算不大。综上,此次的系统设计经济可行性通过。

技术可行性指的是开发者所拥有的技术以及资源是否能满足项目的开发任务。此次贪吃蛇小游戏的开发语言,我选择的是Python。Python是一种面向对象的编程语言,同时具有低级语言与高级语言的优点[1]。整个系统完全可以依靠Python强大的标准库以及第三方库来实现,它在代码的模块化要求上也有一定的保证,方便游戏在各个平台上的移植,减少不必要的工作量,也有利于代码的读写与修改。本系统所需语言技术开发层面不高,而且Python语法简单明了,开发人员完全可以单独实现整个系统的开发。

运行可行性,单机版贪吃蛇小游戏所消耗的各类资源非常小。无论是公共场所的电脑还是个人电脑,以及移植到其他类型的平台上,在软件和硬件上都能够满足运行所需要的基本条件。而且游戏操作简单,玩家只需在知道游戏规则的情况下便能进行游戏。

二、需求分析

(一)功能性需求

不管一款什么样的软件都应该实现它相对的功能,而此次的贪吃蛇作为一款小型的单机游戏作用就是为人们提供多样化休闲娱乐的选择之一。简单性,毋庸置疑这是贪吃蛇应有的特点,不论是操作简单还是游戏内容简单,都能使得它能面向各个年龄阶段的人群。对于那些全身心投入工作、整日奔波的人来说,他们不可能投入过多的时间和精力在游戏上,所以贪吃蛇这类小游戏是一个不错的选择,也能满足其娱乐需求。也正是因为简单性,贪吃蛇没有像其他大型游戏的趣味性和丰富度。所以,为了增加游戏的竞争力,本次的系统将加入游戏难度选择模块。

(二)非功能性需求

软件产品开发设计不仅仅只是把满足用户业务需求作为第一要素,而且还应该具备其他一些重要的特性,比如系统的可靠性、可扩充性、适应性以及性能等。而这就是非功能性需求。

贪吃蛇作为此次毕业设计的论题,它应该具备的就是可靠性和比较好的系统UI界面。对于可靠性来说,此次运用的是Python来编写系统,所以不管是代码的维护性还是程序响应速度都能够得到很好的保证。而一个好的系统UI界面能够让用户在除了享受游戏带来的乐趣之外,带来更好的一个观感,也从另一方面增加了产品的竞争力。

三、游戏及开发工具简介

(一)游戏简介

本次设计的游戏——贪吃蛇,是一种消遣益智类的小游戏。

在用户进入游戏开始界面时选择对应游戏难度即可开始游戏,游戏之初是一条很短的小蛇在屏幕上行进,而用户则是通过方向键控制小蛇的方向去吃掉游戏中的食物,吃到的食物越多蛇的身体就会越长、分数也会越高。游戏进行到中后期时,越来越长的小蛇更需要用户小心的操控,不仅在给玩家带来一定的娱乐性的同时也是对大脑反应速度的一种锻炼。当蛇头触碰到蛇身或是屏幕边缘时,则游戏结束。

(二)Python简介

1.Python的运行原理

作为一种解释型脚本语言,Python的运行原理和C与C++相比大不相同。那解释型脚本语言又是什么呢?大家都知道高级语言对于计算机而言是不能直接识别的,所以当开发者想要运行一个由高级语言编写的程序的时候就需要一个合适的“翻译器”来作为一个中间介质,把编写程序的高级语言转变成计算机能直接识别的机器语言。这个转换过程也大致可以分为两类,一是编译,二是解释[2]。在我们运行以.py结尾的Python程序时,Python解释器会把由高级语言组成的源代码编译成字节码然后提交到PVM(Python Virtual Machine,Python虚拟机,它是Python的运行引擎)中做进一步处理之后执行程序,最后由Python输出结果[3]。运行原理如图3-1所示。

        图3-1  Python运行原理图

2.Python的特点

“简单、明确、优雅”是Python遵循的设计理念[4],相较于其他编程语言更容易上手,代码也更具可读性。因为Python开源的本质,使得它的移植性很高,开发人员只需做少许修改便可将程序移植到其它平台,这包含了市面上大部分主流平台,如Windows、Linux、OS/2、FreeBSD、Solaris、VMS等。

其次,Python具有良好的可扩展性,如果开发者由于某种原因并不想程序中的部分算法被公开,则这部分可以用C或C++来编写,它们同样可以在Python程序中运行,要是想提高某一段代码的运行速度也可以使用同样的方法来实现[5]

再者,Python也因其可嵌入性被人们经常戏称为胶水语言,不同语言编写的不同模块都能通过Python而结合在一起,从而给用户提供高效能的脚本功能,而在那些真正需要运用其他语言优化的地方,Python都有强大的库和API支持[6]。Python丰富的库更是让其成为“黄金语言”的一大因素,除了内置的标准库以外,Python社区更是提供了海量的第三方库Twisted、wxPython、Python图像库等。这些库在处理电子邮件、文档生成、正则表达式、密码系统、数据库、图形用户界面(GUI)、FTP、单元测试等众多工作上提供了不少便携。这也是为什么众多项目选择Python作为核心语言的原因,它被广泛运用于大数据分析、图像处理、爬虫、Web、自动化测试等领域。

我相信当大家热衷于某一款软件时,并不单单是因为它所带来的各种利好,还因为有一群与你志同道合的人,你们可以探讨使用时的心得、可以畅想软件的迭代。人生不是孤独的旅行,编程也不会是。每个人都会在项目开发中遇到不同的问题,大多数程序员都渴望有那么一个互帮互助、联系紧密的社区或是平台。程序员可以在这里向解决过类似问题的人寻求帮助或是建议,而Python社区对我这种初学者而言无疑是坚强的后盾[7]

3.PyGame简介

PyGame是Python众多库中的一个,PyGame可以用来绘制图形、实现动画以及让游戏按照设定帧率平稳运行。它是基于SDL(Simple DirectMedia Layer)写就的游戏库。而与DirectX(微软公司创建的多媒体营运程序接口)相当的SDL的用途是用来控制多媒体的跨平台库,被用于数百种游戏之中。开发者在最初的目标是让做困难的事情变简单,让容易的事情变得更容易,于是将SDL和Python两者结合起来组建成了现在的PyGame。由于PyGame让游戏变得动态起来所采用的是帧更新和轮询的方式(帧更新就是不断地更新画面,轮询则是不断地询问用户输入),在绘制比较复杂的图像的时候会出现“卡帧”现象,所以PyGame并不适合制作大型游戏以及3D游戏,而对于2D游戏则能起到不小帮助[8,9]

本次贪吃蛇游戏系统设计所需要用到的框架以及常用函数都包含在PyGame之中,处于开发时间成本的考虑,本项目会直接调用PyGame。PyGame的使用步骤如下:

首先是导入PyGame库及其中所包含的常量至Python程序中,然后经过初始化之后我们就可以在代码中访问并调用PyGame中的所有资源。

import pygame  #导入pygame模块

from pygame.locals import *  #导入pygame中的常量

pygame.init()  #初始化pygame

(三)PyCharm简介

所谓工欲善其事必先利其器,PyCharm从众多程序开发应用中脱颖而出。它不仅拥有其他类似IDE的功能,如调试、项目管理、语法高亮、版本控制、单元测试等,还提供了供Web开发人员使用的Django框架,大大增加了开发人员的生产效率[10]。在本次的系统开发中可能用到最多的两个功能就是代码补全和智能重构,所以PyCharm在本次项目中也起到不小作用。

四、概要设计

(一)功能介绍

本贪吃蛇游戏系统的实现就是在屏幕显示区域内绘制出一条小蛇,同时在与小蛇身体不重合的屏幕显示区域内绘制出一个食物,游戏玩家通过键盘上的方向键来操控小蛇的行进方向去吃掉食物,食物被吃掉后又会在显示区域内随机出现另一个食物,而小蛇每吃下一个食物身体便会增长一段,如此反复,蛇越长时则对游戏玩家来说越难操作。当蛇的头部撞击到屏幕边缘或是蛇身的任意一个部位的时候,游戏结束[11]

贪吃蛇游戏实现的关键就在于蛇身图形组建和蛇行进轨迹的绘制。我们可以通过画小矩形块(rect属性)的方式来画出小蛇,在小蛇的每次移动的时候,删掉蛇身的最后一个矩形块,在蛇头增加一个新的矩形块,就相当于把蛇的最后一个矩形块加在蛇头的位置。小蛇每移动一个单位,屏幕就重新绘制一次,这样就可以实现小蛇行进的动态效果。而在蛇吃下食物的时候,蛇头覆盖食物,在蛇尾加上一个小矩形块,同时利用random模块随机绘制另一个食物(上一个食物此时消失)[12]

(二)程序流程设计

1.程序流程图

本次设计的游戏程序运行的流程框图如图4-1所示。

图4-1  程序流程框图

2.界面设计

首先定义程序运行界面的大小,背景色等,便于在各个界面显示统一,为玩家提供更好的观感。

游戏界面分为:开始界面、游戏界面和结束界面。在开始界面时,程序运行窗口左上角显示自定义的游戏名称,居中位置显示导入的背景图片,下方显示玩法说明及操作指南;在游戏界面时,整个程序窗口用于游戏,小蛇可在窗口中任意行进,食物显示为蓝色圆形,右上角显示玩家分数,每吃掉一个食物增加一分;当游戏结束时,显示结束界面,窗口居中位置为“GameOver”字样图片,下方则显示游戏提示“请按任意键重新游戏或Esc键退出游戏”。

3.功能设计

除了游戏的基本功能实现之外,为了增加游戏的可玩性设置了F1加速、F2减速、F3无敌等功能。在游戏中还添加了暂停功能,玩家可通过SPACE键来暂停/继续游戏。每当玩家吃到5个食物时随机生成一堵长度在1-5之间的障碍物,而且速度也会增加。在游戏结束时,可按除ESC以外的任意键来重新开始游戏,按ESC键则退出程序。

(三)游戏过程

游戏开始时小蛇会有一个初始方向,如果玩家不输入有效的方向操作,小蛇则会一直按次方向前进,而且小蛇的不能反方向移动,也就是说不能将蛇尾当作蛇头来移动。当用户键入有效的方向之后,蛇头会率先朝玩家给定的方向移动,而蛇身随着蛇头的移动而移动(覆盖此前的轨迹)。贪吃蛇移动实现的方式就是在移动的方向绘制一个矩形块当作蛇头,而蛇尾则删掉一个矩形块,整条蛇重新绘制刷新在屏幕中,这样看起来蛇就向前移动了一个单位的距离。

在本系统中游戏的碰撞检测包含了三种情况:一是蛇吃到食物,此时蛇身增加一个矩形块;二是蛇头和蛇身的碰撞,此时游戏结束;三是蛇头与障碍物的碰撞,正常情况下游戏也会结束(无敌模式下贪吃蛇不会死亡)。

五、系统实现

本次系统设计用到的主要模块及作用如下表5-1所示。

表5-1  贪吃蛇系统主要模块     

模块作用
pygamePython的跨平台模块,用于游戏开发
os操作系统相关的操作和调用
sys系统信息和接口
random生成随机实数
time时间模块,控制游戏帧率

(一)功能概览

本次系统设计用到的主要函数及作用如下表5-2所示。

表5-2  贪吃蛇系统主要函数

函数作用
main()主函数,控制游戏进程
running_game游戏运行主体
draw_food画出食物
draw_snake画出贪吃蛇
move_snake贪吃蛇的移动
snake_is_alive贪吃蛇的碰撞检测
get_random_location生成随机食物
show_start_info显示开始信息
show_gameover_info显示结束信息
event.get()监听键盘事件
draw_wall生成障碍物

(二)构建开始界面

游戏的开始界面应该首先定义好窗口的大小,所需要用到的颜色、字体,导入欢迎界面的背景图片。接下来就是界面的布局以及键盘和鼠标的监听检测。主要代码如下:

def show_start_info(screen):

#设置游戏提示,导入背景图片

   font = pygame.font.Font(base+’\\myfont.ttf’, 40)

   tip = font.render(‘    请选择游戏难度’, True, (65, 105, 225))

   gamestart = pygame.image.load(base+’\\111.jpg’)

#将各个模块绘制到相应位置

   screen.blit(gamestart, (140, 30))

   screen.blit(tip, (240, 550))

   pygame.display.update()

#定义蛇的初始速度

   global snake_speed

#鼠标以及键盘的监听事件,在开始界面按下除了ESC键之外的任意键即可开始游戏。鼠标点击按钮也会立即开始游戏,且小蛇拥有不同的行进速度。

   while True: 

      for event in pygame.event.get(): 

         if event.type == QUIT:

            quitgame()    

         elif event.type == KEYDOWN:

            if (event.key == K_ESCAPE): 

               quitgame()

            else:

               return

         elif event.type == pygame.MOUSEBUTTONDOWN:

            if b1.pressed(pygame.mouse.get_pos()):

               snake_speed=5

               return

            if b2.pressed(pygame.mouse.get_pos()):

               snake_speed=10

               return

            if b3.pressed(pygame.mouse.get_pos()):

               snake_speed=15

               return

(三)蛇与食物的绘制

因为在游戏运行主体的函数中已经定义好了使用random()函数生成的贪吃蛇、初始坐标和食物坐标,这一段只需将贪吃蛇和食物在屏幕上使用.draw属性绘制出来并给蛇和食物加上颜色即可。

#定义draw_snake()函数将贪吃蛇画出来

def draw_snake(screen, snake_coords):

#设定蛇的位置

   for coord in snake_coords:

      x = coord[‘x’] * snake_size

      y = coord[‘y’] * snake_size

#蛇身的第一层颜色

      wormSegmentRect = pygame.Rect(x, y, snake_size, snake_size)

      pygame.draw.rect(screen, Green, wormSegmentRect)

#蛇身的第二层颜色

      wormInnerSegmentRect = pygame.Rect( x + 4, y + 4, snake_size – 8, snake_size – 8)

      pygame.draw.rect(screen, blue, wormInnerSegmentRect)

#食物的坐标位置等于食物的相对坐标乘以蛇的单位大小

def draw_food(screen, food):

   x = food[‘x’] * snake_size

   y = food[‘y’] * snake_size

   appleRect = pygame.Rect(x, y, snake_size, snake_size)

# 使用.draw属性画出食物

   pygame.draw.rect(screen, Red, appleRect)

(四)蛇的移动

这里只对蛇的行进坐标的改变做出说明,蛇的行进方向在其他模块中做了键盘监听检测的对应定义。如果蛇的移动方向是向上(这里的“上”指的是玩家视角的“上”),则蛇的新头坐标x值不变,y减一;如果蛇的移动方向是向下,则蛇的新头坐标x值不变,y加一;如果蛇的移动方向是向左,则蛇的新头坐标x值减一,y不变;如果蛇的移动方向是向右,则蛇的新头坐标x值加一,y不变。

def move_snake(direction, snake_coords):

    if direction == UP:

        newHead = {‘x’: snake_coords[HEAD][‘x’], ‘y’: snake_coords[HEAD][‘y’] – 1}

    elif direction == DOWN:

        newHead = {‘x’: snake_coords[HEAD][‘x’], ‘y’: snake_coords[HEAD][‘y’] + 1}

    elif direction == LEFT:

        newHead = {‘x’: snake_coords[HEAD][‘x’] – 1, ‘y’: snake_coords[HEAD][‘y’]}

    elif direction == RIGHT:

        newHead = {‘x’: snake_coords[HEAD][‘x’] + 1, ‘y’: snake_coords[HEAD][‘y’]}

#插入蛇新头的坐标,以实现蛇的动态效果

    snake_coords.insert(0, newHead)

(五)游戏运行主体

在running_game()函数中定义了蛇的初始位置及初始方向、速度。还对键盘监听事件做了对应的绑定,四个方向键控制蛇的前进方向,在游戏中按下SPACE键可使游戏暂停或继续,按下ESC键退出程序。F1贪吃蛇加速,F2贪吃蛇减速,F3开启/关闭无敌模式。同时,running_game()函数也是整个游戏的运行主体,集合了程序中的大部分函数来控制游戏的进程。

def running_game(screen,snake_speed_clock):

#贪吃蛇的生成:贪吃蛇的的初始位置由random()生成,并且是在坐标在3与地图的宽高间隔8个单位的位置之内,定义贪吃蛇的初始长度为3节

   startx = random.randint(3, map_width – 8)

   starty = random.randint(3, map_height – 8)

   snake_coords = [{‘x’: startx, ‘y’: starty}, 

                  {‘x’: startx – 1, ‘y’: starty},

                  {‘x’: startx – 2, ‘y’: starty}]

# 开始时向右移动,初始化蛇的行进速度

   direction = RIGHT      

   food = get_random_location()    

   global snake_speed

# 如果在游戏不是暂停的情况下按下“ESC”键则退出游戏

   while True:

      pause=False

      for event in pygame.event.get():

         if event.type == QUIT:

            quitgame()

#使用键盘监听检测事件实现对应按键的功能绑定

         elif event.type == KEYDOWN:

            if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT:

               direction = LEFT

            elif (event.key == K_RIGHT or event.key == K_d) and direction != LEFT:

               direction = RIGHT

            elif (event.key == K_UP or event.key == K_w) and direction != DOWN:

               direction = UP

            elif (event.key == K_DOWN or event.key == K_s) and direction != UP:

               direction = DOWN

            elif event.key == K_ESCAPE:

               quitgame() elif event.key == window.EVENT_ADD:               snake_speed = snake_speed + 1            elif event == window.EVENT_SUB:               snake_speed = snake_speed – 1#无敌模式的开启/关闭            elif event == window.EVENT_KING:               if snake.s_king == True:                  snake.s_king = False              else:                  snake.s_king = True

            elif event.key == K_SPACE:

               while not pause:

                  for event in pygame.event.get():

                     if event.type == KEYDOWN:

                        if event.key == K_SPACE:

                           pause = not pause

#调用move_snake()函数来实现贪吃蛇的移动

      move_snake(direction, snake_coords)

      ret = snake_is_alive(snake_coords)

      if not ret:

         break

      snake_is_eat_food(snake_coords, food)

      screen.fill(BG_COLOR)

      draw_snake(screen, snake_coords)

      draw_food(screen, food)

  draw_score(screen, len(snake_coords) – 5)

      pygame.display.update()

#控制游戏帧率,这里也就是贪吃蛇的速度,因为程序绘制的速度越快贪吃蛇看起来运动地也就越快

      snake_speed_clock.tick(snake_speed)

5.6  碰撞检测

碰撞检测分为三种情况(蛇与障碍物的碰撞、蛇头与蛇身之间的碰撞、蛇头吃到食物时的碰撞),而这里只对贪吃蛇存活状态产生影响的两种情况进行了定义,也就是蛇碰到障碍物和蛇碰到自己的身体,蛇吃到食物的碰撞在snake_is_eat_food()中定义。

def snake_is_alive(snake_coords):

#蛇的存活状态

   tag = True

#如果蛇头坐标中的x或是y与地图边缘的坐标相等的话就判定蛇撞墙了,此时将蛇的存货状态tag的值改为False

   if snake_coords[HEAD][‘x’] == -1 or snake_coords[HEAD][‘x’] == map_width or snake_coords[HEAD][‘y’] == -1 or \

         snake_coords[HEAD][‘y’] == map_height:

      tag = False

#蛇自身的碰撞检测则是蛇头的坐标x,y不能与蛇身坐标中的任何一个相等

   for snake_body in snake_coords[1:]:

      if snake_body[‘x’] == snake_coords[HEAD][‘x’] and snake_body[‘y’] == snake_coords[HEAD][‘y’]:

         tag = False

   return tag

6  系统测试

6.1  开始游戏

游戏开始的时候会在程序窗口内随机位置生成一个长度为5的贪吃蛇,蛇头为醒目的红色,而蛇身是绿色。同样地,会在地图内随机生成长度在1-5之间的黑色障碍物,普通模式下贪吃蛇触碰到障碍物则游戏结束。为了区分贪吃蛇和食物,食物是用圆形的形式画出,并采用蓝色。游戏开始界面截图如图6-1所示。

图6-1  游戏开始界面

6.2  生成障碍物

为了增加游戏的可玩性,特别加入了生成障碍物的功能,障碍的生成位置随机,长度在1-5个小方块,以黑色填充。每当玩家吃到5个食物时,障碍物就会多一个,并且贪吃蛇的行进速度也会增加一级。当玩家需要调节速度的时候,可通过F1加速、F2减速来实现。障碍物的固定长度为5,但是在生成时碰到屏幕边缘时会停止生成,所以就会有长度1-5的障碍物出现的情况,也更加增添了游戏的丰富性。游戏生成障碍物界面截图如图6-2所示。

                                (1)

                                    (2)

图6-2  生成障碍物界面

6.3  无敌功能

考虑到贪吃蛇会随着吃到的食物变得越来越长,速度也越来越快,玩家不便控制很容易会导致游戏结束。所以特别加入了无敌功能,玩家只需按下F3键则可开启/关闭无敌模式。在无敌模式下,贪吃蛇可在地图中任意穿行,碰到障碍物和蛇身也不会死亡。游戏无敌功能界面截图如图6-3所示。

                              (1)

                              (2)

图6-3  无敌功能界面

6.4  系统测试

程序运行良好,运行中不报错、不卡顿,本系统对电脑内存以及CPU的占用率也比较小,满足了贪吃蛇游戏随时运行的特点,且基本能在每台电脑端运行,对硬件设备要求较小。系统对CPU以及内存的占用截图如图6-4所示。

测试 图6-4  CPU以及内存的占用

 七、优化与总结

(一)优化升级设想

此次贪吃蛇游戏系统的设计只是简单的实现了游戏的运行与部分功能,在试玩过市面上其他版本的贪吃蛇之后,我觉得在升级优化时可以加入关卡设置,选择不同的关卡则在游戏开始时生成不同的障碍物和给与贪吃蛇不同的初始速度。还可以加入特殊食物功能,吃到不同的食物会使游戏产生不同的效果。而在开始界面提供排行榜功能,点击之后显示玩家前三个最高的分数,在游戏结束界面会自动显示排行榜。

(二)项目总结 

本次项目使我收获颇丰,从论文选题到系统开发,论文的撰写都是一个人独立完成。我觉得这在很大程度上锻炼了个人能力,迈出了个人独立项目的第一步,可能对程序员来说这只是一个非常简单的小游戏开发,而对我来说这并不简单,由于此前对Python语言了解并不多,所以一起都需要从头开始。从软件的安装到语言的学习,到框架以及库的了解,每一步都投入了自己的全部精力。这让我对Python有了一个全新的认识,也明白了为什么Python会成为最热门的语言之一。以前自己是一个比较惰性的人,总是要等事到了不能再等的地步才开始做,而通过此次的项目实践,我学会了如何管理时间,规划项目的进度。而且在遇到困难的时候,也能独自解决。我觉得可能论文的目的并不是学校交代给每个学生在毕业之前必须完成的形式任务,而是想每一个学生都能在做毕业设计、写论文的过程中学会静下心来做事,学会如何规范细致的去做一个项目,对个人来说也是进行了一次全面的自我审视,我相信这些对自己出身社会有着莫大的好处。

本站文章通过互联网转载或者由本站编辑人员搜集整理发布,如有侵权,请联系本站删除。

本文链接:https://www.ttsai.com.cn/news/380.html

滚动至顶部