基于Python的贪吃蛇游戏设计(源码+万字报告+讲解)(支持资料参考_相关定制)

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

摘要

在现代文明高度发达的今天,人们在日常生活中来源于各个方面的压力也越来越大。在所剩无几的闲暇时间里,人们更希望通过某种娱乐方式来放松疲惫不已的身心。游戏,我相信这是很大一部分人的选择!说到游戏,可能每个人有不同的答案,但是有一款游戏是每个人都熟悉并且玩过的,那就是贪吃蛇。贪吃蛇以其无网络运行、硬件要求低,操作简单等优势在非智能手机时代大放光彩。本次毕业设计的主题就是小游戏贪吃蛇的设计与实现,此次选择的程序设计语言为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 words:Game;Snake;Python;PyGame

目录

摘要

Abstract

一、绪论

(一)研究现状与背景

(二)行性分析

二、需求分析

(一)功能性需求

(二)非功能性需求

三、游戏及开发工具简介

(一)游戏简介

(二)Python简介

1.Python的运行原理

2.Python的特点

3.PyGame简介

(三)PyCharm简介

四、概要设计

(一)功能介绍

(二)程序流程设计

1.程序流程图

2.界面设计

3.功能设计

(三)游戏过程

五、系统实现

(一)功能概览

(二)构建开始界面

(三)蛇与食物的绘制

(四)蛇的移动

(五)游戏运行主体

5.6  碰撞检测

6  系统测试

6.1  开始游戏

6.2  生成障碍物

6.3  无敌功能

6.4  系统测试

七、优化与总结

(一)优化升级设想

(二)项目总结

致谢

参考文献

一、绪论 

(一)研究现状与背景

游戏是如今社会非常火热的娱乐活动之一,特别是在进入网络时代之后,各种各样的游戏如雨后春笋般的涌现。有些游戏如日中天,让游戏公司赚的盆满钵满,而有些游戏的寿命却如昙花一现般短暂,隐于尘埃。但是不管哪款游戏,都一定有它存在的价值,或是推动游戏行业的发展,或是给人们带来欢乐。当然,对于人们来说,影音视频、电子阅读、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  贪吃蛇系统主要模块

模块

作用

pygame

Python的跨平台模块,用于游戏开发

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

生成障碍物

(二)构建开始界面

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

mport random

import sys

import time

import pygame

from pygame.locals import *

from collections import deque

#基础设置

Screen_Height=480

Screen_Width=600

Size=20#小方格大小

Line_Width=1

#游戏区域的坐标范围

Area_x=(0,Screen_Width//Size-1) #0是左边界,1是右边界 #注:python中//为整数除法;/为浮点数除法

Area_y=(2,Screen_Height//Size-1)

#食物的初步设置

#食物的分值+颜色

Food_Style_List=[(10,(255,100,100)),(20,(100,255,100)),(30,(100,100,255))]

#整体颜色设置

Light=(100,100,100)

Dark=(200,200,200)

Black=(0,0,0)

Red=(200,30,30)

Back_Ground=(40,40,60)

#文本输出格式设置

def Print_Txt(screen,font,x,y,text,fcolor=(255,255,255)):

    #font.render参数意义:.render(内容,是否抗锯齿,字体颜色,字体背景颜色)

    Text=font.render(text,True,fcolor)

    screen.blit(Text,(x,y))

#初始化蛇

def init_snake():

    snake=deque()

    snake.append((2,Area_y[0]))

    snake.append((1,Area_y[0]))

    snake.append((0,Area_y[0]))

    return snake  

(三)蛇与食物的绘制

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值