PYTHON-贪吃蛇游戏
摘要
贪吃蛇游戏是一个深受人们喜爱的游戏,它能够让你在忙碌的工作中放松一下自己,游戏贪吃蛇就是在屏幕上画出蛇,同时随机地给出食物。游戏者通过键盘操作控制贪吃蛇的移动,去吃食物,吃到后食物消失,然后再随机给出食物同时蛇的身体增长。撞到墙壁或身体交叉蛇头撞到自己的身体,则游戏结束。
这个程序关键点是表示蛇的图形以及蛇的移动。用一个小矩形块表示蛇的一节身体,身体每长一节, 增加一个矩形块, 蛇头用两节表示。 移动时必须从蛇头开始,所以蛇不能向相反的方向移动,也就是蛇尾不能改作蛇头。如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时,由于没有清屏的原因,原来蛇的位置差一个单位,所以看起来蛇会多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现和消失也是画矩形块和覆盖矩形块。
编写此游戏提高了python 语言知识的了解,通过这次项目设计,提高了我的编程的水平。
关键词 :食物和蛇

1.引言
1.1游戏设计背景
电脑游戏的诞生几乎是伴随着电脑的产生就开始了。早在60年代人们还在使用最原始的大型计算机的时候,就有一小部分的程序员在开始开发一些小的游戏,只不过在当时,人们却把他们看成是在做有关计算机方面的研究而已。
由于当时硬件和软件条件方面的限制,这些游戏只能为一些比较高层的计算机相关人员所知晓。到了 1981年,也就是IBM公司推出了自己的第一款PC机之后,计算机开始进入了人们的日常生活当中。在最近的一二十年里,计算机硬件和软件都得到了前所未有的发展, 出现了一些好的游戏开发平台,人们可以简单快捷地进行游戏开发,32 位操作系统,高速处理器等硬件的出现,也使游戏设计者不用因顾及一些其他的因素而不能尽情地投入到游戏开发之中。
到了信息时代的今天,各国都在大力加强自己的软件实力。计算机游戏也成为了众多软件开发厂商的战略计划之一。
1.2游戏的特点
游戏作为当前比较流行的一种娱乐方式,它和其他方式相比,有自身的特点所在。当然,当前来看,其他传统的娱乐方式,比如说:电影,电视,广播等都是不错的选择,但是这些方式已经越来越不能够满足人们娱乐的高要求。和游戏相比起来,这些传统的娱乐方式是单方向的,作为观众或者是听众的我们只能是简单的接受。如同我们平常所说的通信方式一样,它只实现了单工,而不能进行全双工通信。也就是说,我们只能一味的接收已经是别人做好的信息,而不能充分发挥自己的才智。我们只能选择用耳朵听,用眼睛看。但是游戏不同,我们在看,在听的同时,我们还可以自己动手,在游戏的过程中玩家可以充分发挥自身的聪明才智,毫无顾及的施展自己的才华。

1.3要实现的功能
本程序实现的主要技巧在二维数组的应用上,使用python语言编写此游戏。

2.系统结构
2.1python语言的发展及背景
Python 是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的。Python 本身也是由诸多其他语言发展而来的,这包括 ABC、Modula-3、C、C++、Algol-68、SmallTalk、Unix shell 和其他的脚本语言等等。像 Perl 语言一样,Python 源代码同样遵循 GPL(GNU General Public License)协议。现在 Python 是由一个核心开发团队在维护,Guido van Rossum 仍然占据着至关重要的作用,指导其进展。
2.2python语言的功能及特点
创始人guido希望Python在每个领域都能火起来,而Python也不负众望,已经在云计算,云服务,人工智能,web,科学计算,大数据等领域站稳了脚跟.在未来十年的时间里可以Python会越来越火。
特点:
易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。
易于阅读:Python代码定义的更清晰。
易于维护:Python的成功在于它的源代码是相当容易维护的。
一个广泛的标准库:Python的最大的优势之一是丰富的库,跨平台的,在UNIX,Windows和Macintosh兼容很好
互动模式:互动模式的支持,您可以从终端输入执行代码并获得结果的语言,互动的测试和调试代码片断
可移植:基于其开放源代码的特性,Python已经被移植(也就是使其工作)到许多平台。
可扩展:如果你需要一段运行很快的关键代码,或者是想要编写一些不愿开放的算法,你可以使用C或C++完成那部分程序,然后从你的Python程序中调用。
数据库:Python提供所有主要的商业数据库的接口。
GUI编程:Python支持GUI可以创建和移植到许多系统调用。
可嵌入: 你可以将Python嵌入到C/C++程序,让你的程序的用户获得"脚本化"的能力。
2.3游戏设计所用到的模块
第三方库:pygame
Pygame是一个利用SDL库的游戏库, 是一组用来开发游戏软件的 Python 程序模块。SDL(Simple DirectMedia Layer)是一个跨平台库,支持访问计算机多媒体硬件(声音、视频、输入等),SDL非常强大,但美中不足的是它是基于 C 语言的。 PyGame是 SDL 库的 Python 包装器(wrapper),Pygame 在SDL库的基础上提供了各种接口,从而使用用户能够使用python语言创建各种各样的游戏或多媒体程序。
Python内置模块:sys、random、time等
2.4系统架构

2.4.1游戏功能设计
游戏界面要清晰美观, 一个矩形区作为游戏区域, 在矩形区中有食物和贪吃蛇。贪吃蛇用小方块表示,每吃到食物一次蛇身加长一节。食物也是用一个小方块表示,并且每次食物的位置是随机出现的。游戏中使贪吃蛇尽可能的长,但不能使贪吃蛇撞到四周的墙壁,而且蛇的身体不能撞到一起,否则游戏结束。

2.4.2 游戏流程图

PYTHON-贪吃蛇游戏
图一(电脑自带截图工具截的图)

3.实现代码
首先导入要用到的模块
import random
import sys
import time
import pygame
from pygame.locals import *
from collections import deque

3.1一些全局参数的初始化
接下来,声明一些全局参数。如初始化pygame、定义游戏窗口的大小、窗口的标题、定义全局的颜色变量等信息。
pygame.init()
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption(‘贪吃蛇’)
font1 = pygame.font.SysFont(‘SimHei’, 24) # 得分的字体
font2 = pygame.font.Font(None, 72) # GAME OVER 的字体
fwidth, fheight = font2.size(‘GAME OVER’)

SCREEN_WIDTH = 600 # 屏幕宽度
SCREEN_HEIGHT = 480 # 屏幕高度
SIZE = 20 # 小方格大小
LINE_WIDTH = 1 # 网格线宽度

游戏区域的坐标范围
SCOPE_X = (0, SCREEN_WIDTH // SIZE - 1)
SCOPE_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) # 红色,GAME OVER 的字体颜色
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)

3.2初始化贪吃蛇及食物

初始化蛇
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

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_y

3.3贪吃蛇上下移动以及转向
控制贪吃蛇的上下左右的移动可以通过监听键盘输入来实现。利用键盘中的上下左右键或WASD键来控制贪吃蛇的运动。
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 = True
game_over = False
b = True
snake = init_snake()
food = create_food(snake)
food_style = get_food_style()
pos = (1, 0)
# 得分
score = 0
last_move_time = time.time()
elif event.key == K_SPACE:
if not game_over:
pause = not pause
elif event.key in (K_w, K_UP):
# 这个判断是为了防止蛇向上移时按了向下键,导致直接 GAME OVER
if b and not pos[1]:
pos = (0, -1)
b = False
elif event.key in (K_s, K_DOWN):
if b and not pos[1]:
pos = (0, 1)
b = False
elif event.key in (K_a, K_LEFT):
if b and not pos[0]:
pos = (-1, 0)
b = False
elif event.key in (K_d, K_RIGHT):
if b and not pos[0]:
pos = (1, 0)
b = False
如果蛇正在向右移动,那么快速点击向下向左,由于程序刷新没那么快,向下事件会被向左覆盖掉,导致蛇后退,直接GAME OVER
b 变量就是用于防止这种情况的发生
b = True

#方向
pos = (1, 0)

3.4判断游戏是否结束以及暂停游戏
game_over = True
start = False # 是否开始,当start = True,game_over = True 时,才显示 GAME OVER
score = 0 # 得分
orispeed = 0.5 # 原始速度
speed = orispeed
last_move_time = None
pause = False # 暂停

3.5重新生成食物
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_y

3.6绘制贪吃蛇、食物、分数等信息
画食物
if not game_over:
# 避免 GAME OVER 的时候把 GAME OVER 的字给遮住了
pygame.draw.rect(screen, food_style[1], (food[0] * SIZE, food[1] * SIZE, SIZE, SIZE), 0)

画蛇
for s in snake:
pygame.draw.rect(screen, DARK, (s[0] * SIZE + LINE_WIDTH, s[1] * SIZE + LINE_WIDTH,
SIZE - LINE_WIDTH * 2, SIZE - LINE_WIDTH * 2), 0)

print_text(screen, font1, 30, 7, f’速度: {score//100}’)
print_text(screen, font1, 450, 7, f’得分: {score}’)

4.实验结果
1.游戏实际运行截图
PYTHON-贪吃蛇游戏
PYTHON-贪吃蛇游戏
5.总结和展望
这次项目设计让我不仅掌握语言规范,而且能够解决实际问题,掌握程序设计的思想、方法和算法。简单的贪吃蛇游戏由蛇头、蛇身、蛇尾、食物为主角。游戏控制中,食物一旦吃到,蛇身就增加一段,而后食物随机出现,蛇又运动,循环往复,直至蛇头咬住自己的身体某一部位,游戏终止。可见控制中增加了对软件高级语言编程的应用。比如随机函数,数组,自定义函数等,最后综合在一起应 用,除了考虑核心函数和局部函数的主次分配,还要预先初定义一些变量,便于控制整个游戏,最后对软件的熟练操作,实现最终游戏的实现。也希望自己以后能在制作游戏这方面的能力有所长进,开发出更好的游戏。

相关文章: