摘要
本次论文设计的主题是贪吃蛇游戏。游戏的主要内容大致分为游戏界面设计和游戏功能设计两大部分,其中游戏界面设计是以满足用户的视觉体验为主,游戏功能设计是在满足原有的贪吃蛇游戏基本功能的基础上添加一些其他的功能。本次的实现代码也较为简洁,总共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贪吃蛇主要模块

模块 作用
pygame Python内置模块,游戏设计模块
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.总结和展望
本次实验过程中也是遇到了许多的问题,比如一些模块的功能函数等,不过,通过较长时间的翻阅查找也研究清楚了代码的实现原理。该游戏还有一些不足之处就是未能实现高分榜等功能,总的来说还是收获满满。

基于Python的贪吃蛇游戏设计相关推荐

  1. 基于linux的贪吃蛇游戏设计_贪吃蛇还能这么玩?绝对是你从未体验过的全新版本(上)...

    上个月 Gitee 宣布推出「Python 贪吃蛇魔改大赛」的活动,受到了众多开发者们的欢迎.半个多月后,我们收到了共计 42 个参赛作品,有的作品创意无限,有的作品视觉效果极佳,看看下面的作品一览, ...

  2. 基于单片机的贪吃蛇游戏设计_前端入门,基于html,css,javascript的贪吃蛇游戏

    源代码: 贪吃蛇 .box1{ font-size: 15px; float:left; display: block; margin-right: 150px; } .box2{ font-size ...

  3. 基于FPGA的贪吃蛇游戏设计(1)整体架构设计

    软件环境:Quartus II 13.1 & Modelsim Starter Edition 13.1 & notepad++ & TimeGen 3.1 & Ima ...

  4. 基于linux的贪吃蛇游戏设计_基于ECS的游戏引擎架构设计「译」

    摘要 游戏编程设计和组织是困难而复杂的,为了简化开发进程,会使用被称为游戏引擎的游戏框架(framework),该框架包含了一组实用工具.本项的目的是探索游戏引擎设计和开发一个模块化和可扩展的游戏引擎 ...

  5. 基于verilog贪吃蛇游戏设计

    概述 基于verilog贪吃蛇游戏设计.使用verilog语言 小游戏主要分为以下几个模块:顶层模块.VGA显示模块.蛇身控制模块.苹果控制模块. 系统主要分为顶层模块.VGA显示模块.蛇身控制模块. ...

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

    代码地址如下: http://www.demodashi.com/demo/11818.html 贪吃蛇小游戏(第二版) 一年半前层用react写过贪吃蛇小游戏https://github.com/c ...

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

    基于HTML5的贪吃蛇游戏的设计与实现 功能要求: 贪吃蛇游戏是一款经典的单机休闲游戏,玩家通过上下左右按键控制蛇头的移动方向使其向指定方向前进,并吃掉随机位置上产生食物来获得分数.每吃掉一次食物,贪 ...

  8. java毕业设计——基于java+J2ME的贪吃蛇游戏设计与实现(毕业论文+程序源码)——贪吃蛇游戏

    基于java+J2ME的贪吃蛇游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+J2ME的贪吃蛇游戏设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开题报告P ...

  9. 基于EasyX的贪吃蛇游戏

    基于EasyX的贪吃蛇游戏 一.预备知识 二.游戏逻辑 1.贪吃蛇元素 2.贪吃蛇规则 三.游戏设计 1.地图设计 2.移动设计 3.速度设计 4.整体设计 一.预备知识 1.使用EasyX必须要知道 ...

  10. python制作贪吃蛇游戏_用Python写贪吃蛇游戏的代码实例

    这篇文章主要为大家详细介绍了Python贪吃蛇游戏的编写代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 最近在学Python,想做点什么来练练手,命令行的贪吃蛇一般是C的练手项目,但是一时之间 ...

最新文章

  1. 【Qt】QtCreator中关于Style Plugin Example没有效果的修改方法
  2. 修改页面的title及js中文转码
  3. 2008-07-30 郁闷的旅行之一
  4. 规模 300+ 的研发团队,怎样保持工程高质高效?
  5. geomesa hbase geoserver
  6. C#200个基础工具类,史上最全快收藏下载
  7. 【译】node js event loop part 1.1
  8. rss的普及需要一个容易理解的中文名字,叫“新闻源”如何?
  9. 使用函数求最大公约数 pta_高中数学选修教材2-导数第6课时《函数的单调性与导数》教学设计...
  10. linux编译mesa,如何在Ubuntu 16.04,17.10中安装Mesa 17.3.3
  11. mariadb mysql 5.7_MariaDB 10.1 和 MySQL 5.7 在普通商用硬件上的表现
  12. 使用Asp.net MVC源代码调试你的应用程序
  13. Matlab中绘制折线图(附matlab代码)
  14. 全面:Realtek/瑞昱无线产品图谱及市场构成
  15. 华硕鹰眼ZenFone Zoom推动潮流:比肩专业相机几率几何?
  16. python命令行参数是什么
  17. latex怎么打区间_latex 函数中间点
  18. 虚拟机搭建Ubuntu16.04系统
  19. 概率论例题01:设P(A)=a,P(B)=b,P(A∪B)=c,则P(A非B)=()
  20. NR/5G - Measurement, GAP, SFTD

热门文章

  1. c语言图书馆管理系统源码,C语言图书馆管理系统源代码
  2. c语言书籍(c语言书籍)
  3. 重置winsock目录解决不能上网的问题
  4. python中或语句_python判断语句怎么写
  5. yacc c语言语法分析器,GitHub - waxnkw/yacc: 简陋版语法分析器
  6. GreenPlum数据库调研及架构介绍
  7. 2021-05-22 Android 网络性能测试工具iperf详细使用方法
  8. CDH 5.13.0安装方法
  9. 鹏芯U盘(UDK2008)意外断电后修复
  10. 为资产分类定义折旧范围_SAP使用权资产配置浅析