基于Python的贪吃蛇游戏设计

摘要
本次论文设计的主题是贪吃蛇游戏。游戏的主要内容大致分为游戏界面设计和游戏功能设计两大部分,其中游戏界面设计是以满足用户的视觉体验为主,游戏功能设计是在满足原有的贪吃蛇游戏基本功能的基础上添加一些其他的功能。本次的实现代码也较为简洁,总共170行左右,运用了Python的一些函数库和模块库,其中最主要的是pygame模块。

1.引言
1.1背景、意义
现如今,人们的生活节奏日益加快,繁忙冗杂的工作、学习和生活使人们的生活变得枯燥,没有新意,休息时间越来越少。面对这样的生活,人们大都渴望在这仅有的休息时间里,找到一些能让身心放松的娱乐活动。于是,贪吃蛇这款游戏就进入了大众的视野。
1997年,诺基亚工程师Taneli Armanto为诺基亚N6610手机写了一款贪吃蛇程序,命名为Snake,中译贪吃蛇。而后,在我们更加熟悉的诺基亚3310等机型上安装了升级版的SnakeII。2000年,诺基亚重写了程序Snake EX,安装在同年发行的诺基亚9200上。近十年来,贪吃蛇游戏以各种形式出现在各大游戏网站,模式新颖,层出不穷,吸引了数以亿计的游戏爱好者前来游玩。2016年,《贪吃蛇大作战》横空出世,火爆一时。同年腾讯游戏退出《疯狂贪吃蛇》网络游戏,下载量居高不下。如此种种,使得贪吃蛇游戏成为国内外游戏史上传播最广泛的作品之一。
1.2相关研究、功能介绍
本次的贪吃蛇游戏主要是仿照前人开发的源代码进行设计的,该游戏拥有和普通贪吃蛇一样的基本功能,主要就是在屏幕区域内绘制出一条小蛇,并且在与蛇不重合的屏幕区域内随机出现一个食物,游戏者通过键盘操纵游戏小蛇上下左右移动来吃到食物,当食物成功被小蛇吃到后,会在另外的区域重新刷新出食物,而小蛇由于吃到食物,身体会增长。除此之外,本游戏的贪吃蛇可以通过吃不同颜色的食物增加不同的分数,同时,分数每增加100,速度也会随之增加1。
1.3开发工具
本次游戏的开发平台为windows7(64位),程序设计语言为Python,程序运行环境为Python3.5。

2.系统结构
2.1系统结构图

在这里插入图片描述
图1系统结构图
2.11画面设计
①游戏的界面构造主要包括游戏运行界面尺寸的定义、背景幕布的覆盖以及墙壁的添加等。
②贪吃蛇的构造主要是蛇身的构造,具有贪吃蛇的大部分功能,例如移动、变换方向、碰撞、吃食物等,随着贪吃蛇不断吃到食物,蛇的身体会不断增加。
③食物的构造主要是食物随机刷新在界面内,且不与蛇身重合,与蛇头触碰后会消失,并在其他区域重新生成,蛇吃到不同颜色的食物将得到不同的得分
2.12游戏过程
①贪吃蛇必须从蛇的头部开始移动,所以蛇不能反方向移动。也就是尾巴不能变成蛇头。如果你不按任何键,蛇就会以当前的方向向前移动。当玩家按下有效的箭头键时,蛇头按指定的方向移动,一次移动身体一部分。所以当按下有效的箭头键时,首先要确定蛇头的位置,然后身体随着蛇头移动,实现图形就是蛇头从新的位置开始画一条蛇,此时,由于没有清屏,程序在不停地更新屏幕,原来的蛇差了一个单元,看起来蛇的身体会多一部分,所以蛇的最后一部分被覆盖了背景颜色,使贪吃蛇看起来好像是在到处移动。
②碰撞检测包含两种情况:第一种是蛇头和墙壁的碰撞,第二种是蛇头和蛇身的碰撞。
2.13游戏结束
当蛇头与墙壁或自己的身体发生碰撞时会死亡,这时候游戏进程停止,画面显示GAME OVER。
2.14添加功能
①设置不同颜色的食物,给不同颜色的食物设置不同的分数,贪吃蛇吃到不同颜色的食物就会增加相应的分数。
②贪吃蛇每得到100分,速度就加快1。
③在游戏设计中添加常规功能。
2.2主要函数及模块
2.21主要模块

表1贪吃蛇主要模块

模块作用
pygamePython内置模块,游戏设计模块
sys系统相关的信息模块
random生成随机数
time时间模块,控制游戏帧频
collections调用deque双向队列形成贪吃蛇

2.22主要函数
表2贪吃蛇主要函数

函数作用
Main()主函数,控制游戏的所有进程
print_text()绘制界面幕布
init_snake()初始化贪吃蛇
create_food()初始化食物
get_food_style()吃到食物事件
pygame.display.set_caption()定义屏幕窗口的标题内容
pygame.font.SysFont()从系统内加载字体
pygame.event.get()键盘点击事件
screen.fill()填充窗口的背景色
pygame.draw.line()画网格线
time.time()获取当前时间
pygame.display.update()把我们绘制的东西显示在屏幕上

3.实现代码
3.1初始框架

在制作游戏之前基本工作都是要初始化框架。首先是导入游戏设计模块pygame并初始化该模块,然后设置框架的宽度和高度,用pygame.display.set_mode()函数初始化准备显示的窗口,再用pygame.display.set_caption()函数给这个窗口添加标题。代码如下:

python
import pygameSCREEN_WIDTH = 600      # 屏幕宽度
SCREEN_HEIGHT = 480     # 屏幕高度pygame.init()          #初始化模块
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))    #显示窗口
pygame.display.set_caption('贪吃蛇')

效果图如下:
在这里插入图片描述
3.2初始游戏画布
有了游戏框架之后,要在框架里面初始游戏画布。首先要设置小方格的大小以及网格线的宽度,然后设置游戏区域的坐标范围,再设置网格线的颜色以及画布的背景颜色,接着用screen.fill()函数填充背景颜色,用pygame.draw.line()函数绘制网格线,最后用pygame.display.update()函数将我们绘制的东西显示在屏幕上。代码如下:

SIZE = 20               # 小方格大小
LINE_WIDTH = 1          # 网格线宽度#游戏区域坐标范围
SCOPE_X = (0, SCREEN_WIDTH // SIZE - 1)
SCOPE_Y = (2, SCREEN_HEIGHT // SIZE - 1)BLACK = (0, 0, 0)           # 网格线颜色
BGCOLOR = (40, 40, 60)      # 背景色screen.fill(BGCOLOR)       # 填充背景色
#画网格线 竖线
for x in range(SIZE, SCREEN_WIDTH, SIZE):pygame.draw.line(screen, BLACK, (x, SCOPE_Y[0] * SIZE), (x, SCREEN_HEIGHT), LINE_WIDTH)
#画网格线 横线
for y in range(SCOPE_Y[0] * SIZE, SCREEN_HEIGHT, SIZE):
pygame.draw.line(screen, BLACK, (0, y), (SCREEN_WIDTH, y), LINE_WIDTH)pygame.display.update()       #显示绘制的东西

效果图如下:
在这里插入图片描述
3.3构建贪吃蛇
初始化完游戏画布后要给画布添加贪吃蛇。首先要导入必要的一些模块,如监听键盘控制的sys模块,监听时间的time模块,构成贪吃蛇的collections模块中的deque()以及pygame模块中的各种常量。代码如下:

import sys 
import time
from pygame.locals import *
from collections import deque

然后先初始化蛇,包括蛇的颜色和蛇的初始长度。代码如下:
DARK = (200, 200, 200) # 蛇的颜色
#初始化蛇

def init_snake():snake = deque()snake.append((2, SCOPE_Y[0]))snake.append((1, SCOPE_Y[0]))snake.append((0, SCOPE_Y[0]))
return snake

然后是贪吃蛇方向的控制,这里采用pygame中的键盘监听事件,代码如下:

while True:for event in pygame.event.get():if event.type == QUIT:sys.exit()elif event.type == KEYDOWN:if event.key == K_RETURN:if game_over:start = Truegame_over = Falseb = Truesnake = init_snake()pos = (1, 0)# 得分score = 0last_move_time = time.time()elif event.key == K_SPACE:if not game_over:pause = not pauseelif event.key in (K_w, K_UP):# 这个判断是为了防止蛇向上移时按了向下键,导致直接 GAME OVERif b and not pos[1]:pos = (0, -1)b = Falseelif event.key in (K_s, K_DOWN):if b and not pos[1]:pos = (0, 1)b = Falseelif event.key in (K_a, K_LEFT):if b and not pos[0]:pos = (-1, 0)b = Falseelif event.key in (K_d, K_RIGHT):if b and not pos[0]:pos = (1, 0)b = False

接着是给画布添加蛇的速度和得分文本框,代码如下:

def print_text(screen, font, x, y, text, fcolor=(255, 255, 255)):imgText = font.render(text, True, fcolor)
screen.blit(imgText, (x, y))font1 = pygame.font.SysFont('SimHei', 24)  # 得分的字体score = 0           # 得分print_text(screen, font1, 30, 7, '速度:'+str(score//100))
print_text(screen, font1, 450, 7, '得分:'+str(score))

最后用time模块模拟贪吃蛇的移动,代码如下:

orispeed = 0.5      # 原始速度
speed = orispeed
last_move_time = None
curTime = time.time()if curTime - last_move_time > speed:
if not pause:b = Truelast_move_time = curTimenext_s = (snake[0][0] + pos[0], snake[0][1] + pos[1])if SCOPE_X[0] <= next_s[0] <= SCOPE_X[1] and SCOPE_Y[0] <= next_s[1] <= SCOPE_Y[1] and next_s not in snake:snake.appendleft(next_s)        #将下一格的坐标添加到列表开头snake.pop()         #移除最后一个元素

效果图如下:
在这里插入图片描述
3.4构建食物
首先要导入random模块用于随机生成食物的位置,然后设置食物的颜色和分值,再初始化食物,最后判断蛇是否吃到食物,如果吃到食物就随机生成新的食物,代码如下:

import random          #用于生成随机数
#食物的分值及颜色
FOOD_STYLE_LIST = [(10, (255, 100, 100)), (20, (100, 255, 100)), (30, (100, 100, 255))]def create_food(snake):food_x = random.randint(SCOPE_X[0], SCOPE_X[1])food_y = random.randint(SCOPE_Y[0], SCOPE_Y[1])while (food_x, food_y) in snake:# 如果食物出现在蛇身上,则重来food_x = random.randint(SCOPE_X[0], SCOPE_X[1])food_y = random.randint(SCOPE_Y[0], SCOPE_Y[1])
return food_x, food_ydef get_food_style():
return FOOD_STYLE_LIST[random.randint(0, 2)]next_s = (snake[0][0] + pos[0], snake[0][1] + pos[1])if next_s == food:# 吃到了食物snake.appendleft(next_s)score += food_style[0]speed = orispeed - 0.03 * (score // 100)food = create_food(snake)food_style = get_food_style()
#画食物
if not game_over:
pygame.draw.rect(screen, food_style[1], (food[0] * SIZE, food[1] * SIZE, SIZE, SIZE), 0)

3.5碰撞检测
当贪吃蛇撞到自己或者墙壁后无法继续向前移动时进程停止,游戏结束,显示GAME OVER!
代码如下:

font2 = pygame.font.Font(None, 72)  # GAME OVER 的字体
fwidth, fheight = font2.size('GAME OVER')game_over = True
start = False     # 是否开始,当start = True,game_over = True 时,才显示 GAME OVERif not game_over:curTime = time.time()if curTime - last_move_time > speed:if not pause:b = Truelast_move_time = curTimenext_s = (snake[0][0] + pos[0], snake[0][1] + pos[1])if next_s == food:# 吃到了食物snake.appendleft(next_s)score += food_style[0]speed = orispeed - 0.03 * (score // 100)food = create_food(snake)food_style = get_food_style()else:if SCOPE_X[0] <= next_s[0] <= SCOPE_X[1] and SCOPE_Y[0] <= next_s[1] <= SCOPE_Y[1] and next_s not in snake:snake.appendleft(next_s)snake.pop()
else:game_over = Trueif game_over:
if start:
print_text(screen, font2, (SCREEN_WIDTH - fwidth) // 2, (SCREEN_HEIGHT - fheight) // 2, 'GAME OVER', RED)

效果图如下:
在这里插入图片描述

4.实验结果
在这里插入图片描述
5.总结和展望
本次实验过程中也是遇到了许多的问题,比如一些模块的功能函数等,不过,通过较长时间的翻阅查找也研究清楚了代码的实现原理。该游戏还有一些不足之处就是未能实现高分榜等功能,总的来说还是收获满满。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/252002.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Python游戏汇总:三十个pygame游戏代码

提示&#xff1a;爱学习哦&#xff0c;不要沉迷游戏&#xff0c;平时打发一下无聊时间最好啦 正文 欢迎阅读&#xff1a; 1.python21点小游戏。2.Python笨鸟先飞小游戏。3.python绘制满天星小游戏。4.吃豆豆小游戏项目。 5.python忍者奔跑小游戏。6.python迷宫小游戏。7.pyt…

猜拳游戏-python

今天在网上发现很多人都用python语言写出了一个猜拳游戏&#xff0c;看着效果还真不错。于是我在网上看了一个大佬写的&#xff0c;有了灵感&#xff0c;写出了下面的程序。 首先&#xff0c;大家知道&#xff0c;在python中&#xff0c;random函数可以做出随机数的程序&#…

python一行代码制作20款经典游戏

今天分享一个有趣的Python游戏库freegames&#xff0c;它包含20余款经典小游戏&#xff0c;像贪吃蛇、吃豆人、乒乓、数字华容道等等&#xff0c;依托于标准库Turtle。 我们不仅可以通过1行代码进行重温这些童年小游戏&#xff0c;还可以查看源码自己学习下游戏编写&#xff0…

迈入python游戏编程的大门,超详细的python环境搭建教程

0. 前言 Hello&#xff0c;大家好&#xff01;欢迎来到python教程入门学习公众号&#xff0c;我是带你们一起写游戏的猫姐&#xff01; 经常有朋友问梦想&#xff1a;梦想&#xff0c;我现在上小学&#xff08;初中&#xff09;&#xff0c;我想学习Python游戏编程&#xff0c…

Python游戏-实现键盘控制功能

要想实现键盘控制作用&#xff0c;就需要给游戏键盘监听事件 利用pygame模块的key.get_pressed()方法&#xff0c;来检测按键是否按下 key_press pygame.key.get_pressed()if not key_press[K_UP] and ball.rect.bottom < height:ball.movedown()elif key_press[K_UP] and …

Python实现迷宫游戏

项目&#xff1a;迷宫游戏 摘要1.引言1.1研究的背景及意义1.2研究的内容 2.系统结构2.1系统的结构2.2基本思路 3.实现代码3.1Maze类3.2Player类3.3Controller类3.4主函数 4.实验5.总结和展望参考文献 摘要 本次实验设计了一款迷宫小游戏&#xff0c;采用用Python开发技术实现。…

苹果iOS 16如何显示WiFi密码【操作教程】

在以往的iOS系统上包括iOS 15&#xff0c;iPhone用户是无法在手机上直接查看WiFi密码。对于经常忘记WiFi密码或者想向他人分享WiFi密码的用户来说非常不友好。 不过&#xff0c;最新发布的iOS 16更新包含了一系列的的细节改进&#xff0c;其中一项就是终于支持查看当前连接的Wi…

iphone显示不了wifi已连接服务器,苹果手机显示已经连接wifi但是不能上网如何解决...

iPhone每次推出新款,必然引起消费市场的订购热潮&#xff0c;人们对iphone手机的热捧,塑造了独特的消费风格群体&#xff0c;纵然iphone的使用者这么多&#xff0c;还是有很多人不清楚iPhone显示已经连接wifi但是不能上网的情况如何解决&#xff0c;下面就由学习啦小编跟大家分…

iphone开蓝牙wifi上网慢_苹果iphone 7手机连接wifi网速很慢怎么办?

最近小编听到很多使用iPhone7手机用户反映iphone 7连接wifi网速很慢&#xff0c;浏览网页都打不开&#xff0c;图片要加载半天&#xff0c;那遇到iphone 7连接wifi网速很慢怎么办?下面丢锋网给大家分享三个解决iphone7网速慢的方法&#xff0c;希望可以帮到大家!出现苹果手机w…

解决苹果手机连接了wifi,依旧无法更新系统的问题

解决苹果手机连接了wifi&#xff0c;依旧无法更新系统的问题 解决苹果手机连接了wifi&#xff0c;依旧无法更新系统的问题 起因&#xff1a;买了iWatch&#xff0c;要用手机给表更新系统&#xff0c;只能是手机连接wifi&#xff0c;但是手机连接了wifi&#xff0c;页面依旧提…

苹果 iPhone 再现 Wi-Fi 漏洞

本文转载自IT之家 IT之家 7 月 5 日消息 上个月底&#xff0c;安全人员 Carl Schou 发现了一个苹果 iPhone 的奇特 Bug&#xff0c;连接特定 SSID“% p% s% s% s% s% n”的 WiFi 后会使手机无线连接功能作废&#xff0c;需要在设置中重置网络才能恢复。 现在他又发现了一个更严…

苹果手机怎么查看已连接的wifi密码_WIFI密码忘了?教你查看手机已连接WIFI的密码...

大家好,现在的手机都有保存wifi密码的功能&#xff0c;在我们第一次连接这个wifi的时候它就会自动的把密码保存到手机里面&#xff0c;我们第二次连接的时候就不需要输入手机密码了&#xff0c;但是时间长了以后可能你连自己家里wifi密码都忘记了&#xff0c;如果说哪一天你家里…

iPhone查看WiFi密码(篇章一)

2019独角兽企业重金招聘Python工程师标准>>> 第一章&#xff1a;iPhone查看那些曾经手动连接过的WiFi密码 1. 找到 iCloud &#xff08;不同系统版本位置不同&#xff0c;但都在设置里&#xff09; 进入“设置”里面&#xff0c;找到“iCloud” 确保“钥匙串”开启 …

苹果手机无法连接wifi_手机信号太差?一键查看连接的WIFI离我们多少米

手机已经使我们出行必备的工具&#xff0c;流量够用还好。如果和我一样出门都要蹭无线网那就有点不开心了&#xff0c;因为有无免费的WIFI或者信号强弱都说不准。 今天&#xff0c;给大家分享一个技巧&#xff0c;如何查看我们连接的WIFI离我们有多远&#xff1f;以及信号的强弱…

苹果手机如何分享wifi密码_怎样用手机改wifi密码

路由器是我们日常生活常用的东西&#xff0c;路由器可以发射WiFi供手机连接上网&#xff0c;但是有时候密码过于简单则会造成很多人连接导致网速变慢。那么&#xff0c;怎样用手机改wifi密码呢&#xff1f;下面将会为大家介绍。 怎样用手机改wifi密码 步骤1、手机连接Wi-Fi信号…

苹果手机如何投屏到电脑【无线有线】

现如今&#xff0c;有很多人喜欢将他们的iPhone手机屏幕投射到电脑&#xff0c;玩游戏&#xff0c;做直播&#xff0c;共享文件&#xff0c;等等。苹果手机本身也有内置airplay&#xff0c;那么如何将苹果手机投射到电脑呢&#xff1f;接下来给大家介绍2种方法。 傲软投屏 首先…

如何从 iPhone、iPad 和 Mac 共享 Wi-Fi 密码

可能很多朋友连接上家里的Wi-Fi 后不会特意记住Wi-Fi密码&#xff0c;如果有其他Apple产品想连接一下WiFi却忘记了密码怎么办&#xff1f;如果您遇到这种情况&#xff0c;采用以下办法您可以轻松地在 iPhone、iPad 和 Mac 之间共享您的 Wi-Fi 密码。 共享 Wi-Fi 密码的要求 解锁…

苹果怎么修改wifi代理服务器,苹果手机怎么修改wifi名称?

请问大家&#xff1a;怎么用苹果手机修改wifi名称&#xff1f; 答&#xff1a;用你的苹果手机&#xff0c;登录到路由器的设置页面&#xff0c;然后打开 无线设置 或者 Wi-Fi设置 这个选项&#xff0c;在打开的页面中&#xff0c;就可以修改wifi名称了&#xff0c;详细的操作步…

使用fiddler实现苹果ios手机抓包

Fiddler是一个强大的抓包工具&#xff0c;可以通过它抓取、查看和调试PC端、手机终端和远程服务器之间的http/https等通信。 Fiddler没有手机客户端&#xff0c;都是安装在PC上&#xff0c;要实现对手机上的程序抓包&#xff0c;则需要对PC上的Fiddler和手机端做一些配置。 此…

苹果台式机怎么设置我的电脑计算机,怎么让台式电脑用苹果手机的wifi上网

我的系统是WIN7的&#xff0c;设置上面和XP可能有点区别、但是基本上都是差不多的&#xff0c;XP的朋友也可以试试。 首先。打开你的蜂窝数据。别担心&#xff0c;不会用流量的。 然后进入设置个人热点打开它。点下面那个 好多朋友都说没有个人热点这个选项。这个选项也许是要在…