Python小游戏制作
摘要
这个学期我们学习了python,我制作地贪吃蛇小游戏和你画我猜小游戏是基于python的pygame模块的小游戏开发。运用pygame模块里面的大量库函数可以让我们这些初学者开发学习2D函数更加地得心应手。pygame是跨平台Python模块,专为电子游戏设计,包含图像、声音。建立在SDL基础上,允许实时电子游戏研发而无需被低级语言束缚,用于多媒体开发和游戏软件开发的模块。
贪吃蛇游戏使用pygame模块导入要使用地函数和变量,定义游戏运行主函数和游戏暂停和结束函数。设计思路是初始化蛇地位置、长度、速度和方向等变量,pygame.display.set_mode生成windows窗口,screen.fill(white)对surface对象填充某一种颜色,在这里表现为窗口背景颜色的填充。用到pygame.time.Clock()控制帧速率。pygame.time.Clock()会控制每个循环多长时间运行一次。传入clock.tick()每秒内循环要运行的次数即我们游戏的fps。
1.引言
Python在设计上坚持了清晰划一的风格,使得Python成为一门易读、可扩展性、易维护,并且被大量用户所欢迎的、用途广泛的语言。Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性,支持重载运算符和动态类型。Python拥有一个强大的标准库。Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数,而由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。Python标准库命名接口清晰、文档良好,很容易学习和使用。本文的小游戏就是基于python的pygame模块实现的。用户按下键盘只是改变方向的值,再用函数更新贪吃蛇坐标。如果不按,那方向值一直不变,贪吃蛇就一直向前走。头坐标未超出地图范围代表用户游戏成功。
2.游戏系统结构
(1)pygame.time模块给我们提供了一个Clock的对象,pygame.time.Clock()控制帧速率。pygame.time.Clock()会控制每个循环多长时间运行一次。第一初始化了一个Clock对象;第二返回一个上次调用的时间(以毫秒计);第三在每一个循环中加上它,那么给tick方法加上的参数就成为了游戏绘制的最大帧率,这样的话,游戏就不会用掉所有的CPU资源了。
图1 pygame.time.Clock()函数
(2)pygame.display.set_mode生成windows窗口,返回的是一个surface对象,resolution可以控制生成windows窗口的大小,flags代表的是扩展选项。
图2 pygame.display.set_mode函数
(3)gamesurface.fill(black_color)。对surface对象填充某一种颜色,在这里表现为窗口背景颜色的填充。
图3.gamesurface.fill(black_color)函数
(4)event.type==KEYDOWN:判断键盘事件,用上下左右箭头或w,s,a,d来表示上下左右。
(5)change_derection:判断移动的方向是否相反 。
(6)初始化贪吃蛇的起始位置snakeposition = [100,100] ,snakeposition[0] -= 20 根据方向,改变坐标。
(7) 初始化贪吃蛇的长度,snakelength.insert(0,list(snakeposition))增加蛇的长度。
(8)判断是否吃掉目标方块 snakeposition[0]==square_purpose[0] and snakeposition[1]==square_purpose[1]
(9)重新生成目标方块随机生成x,y,扩大二十倍,在窗口范围内。
square_purpose = [int(x20),int(y20)]
(10)判断是否死亡 GameOver(gamesurface)。
系统功能实现:
图4.系统功能变化图
系统流程图:
图5.系统运行流程图
3. 实现代码。
贪吃蛇游戏代码:
import pygame,sys,random,time
from pygame.locals import * #从pygame模块导入常用的函数和常量
#定义颜色变量
black_colour = pygame.Color(0,0,0)
blue_colour = pygame.Color(0,255,255)
yellow_colour = pygame.Color(255,255,0)
red_colour = pygame.Color(255,0,0)
#定义游戏结束函数
def GameOver(gamesurface):
#设置提示字体的格式
GameOver_font = pygame.font.SysFont(“MicrosoftYaHei”, 66)
#设置提示字体的颜色
GameOver_colour = GameOver_font.render(‘Game Over’,True,red_colour)
#设置提示位置
GameOver_location = GameOver_colour.get_rect()
GameOver_location.midtop = (320,10)
#绑定以上设置到句柄
gamesurface.blit(GameOver_colour,GameOver_location)
#提示运行信息
pygame.display.flip()
#休眠5秒
time.sleep(3)
#退出游戏
pygame.quit()
#退出程序
sys.exit()
#定义主函数
def main():
#初始化pygame,为使用硬件做准备
pygame.init()
pygame.time.Clock()
ftpsClock = pygame.time.Clock()
#创建一个窗口
gamesurface = pygame.display.set_mode((660,500))
#设置窗口的标题
pygame.display.set_caption(‘贪吃蛇小游戏’)
#初始化变量
#初始化贪吃蛇的起始位置
snakeposition = [100,100]
#初始化贪吃蛇的长度
snakelength = [[100,100],[80,100],[60,100]]
#初始化目标方块的位置
square_purpose = [300,300]
#初始化一个数来判断目标方块是否存在
square_position = 1
#初始化方向,用来使贪吃蛇移动
derection = “right”
change_derection = derection
#进行游戏主循环
while True:
#检测按键等pygame事件
for event in pygame.event.get():
if event.type= =QUIT:
#接收到退出事件后,退出程序
pygame.quit()
sys.exit()
elif event.type= =KEYDOWN:
#判断键盘事件,用w,s,a,d来表示上下左右
if event.key= =K_RIGHT or event.key= =ord(‘d’):
change_derection = “right”
if event.key= =K_LEFT or event.key= =ord(‘a’):
change_derection = “left”
if event.key= =K_UP or event.key= =ord(‘w’):
change_derection = “up”
if event.key = =K_DOWN or event.key= =ord(‘s’):
change_derection = “down”
if event.key==K_ESCAPE:
pygame.event.post(pygame.event.Event(QUIT))
#判断移动的方向是否相反
if change_derection = ='left’and not derection = =‘right’:
derection = change_derection
if change_derection = ='right’and not derection = =‘left’:
derection = change_derection
if change_derection = = ‘up’ and not derection = =‘down’:
derection = change_derection
if change_derection = = ‘down’ and not derection = = ‘up’:
derection = change_derection
#根据方向,改变坐标
if derection = = ‘left’:
snakeposition[0] -= 20
if derection = = ‘right’:
snakeposition[0] += 20
if derection = = ‘up’:
snakeposition[1] -= 20
if derection == ‘down’:
snakeposition[1] += 20
#增加蛇的长度
snakelength.insert(0,list(snakeposition))
#判断是否吃掉目标方块
if snakeposition[0]==square_purpose[0] and snakeposition[1]==square_purpose[1]:
square_position = 0
else:
snakelength.pop()
#重新生成目标方块
if square_position ==0:
#随机生成x,y,扩大二十倍,在窗口范围内
x = random.randrange(1,32)
y = random.randrange(1,24)
square_purpose = [int(x20),int(y20)]
square_position = 1
#绘制pygame显示层
gamesurface.fill(black_colour)
for position in snakelength:
pygame.draw.rect(gamesurface,blue_colour,Rect(position[0],position[1],20,20))
pygame.draw.rect(gamesurface,yellow_colour,Rect(square_purpose[0],square_purpose[1],20,20))
#刷新pygame显示层
pygame.display.flip()
#判断是否死亡
if snakeposition[0]<0 or snakeposition[0]>660:
GameOver(gamesurface)
if snakeposition[1]<0 or snakeposition[1]>500:
GameOver(gamesurface)
for snakebody in snakelength[1:]:
if snakeposition[0]==snakebody[0] and snakeposition[1]==snakebody[1]:
GameOver(gamesurface)
#控制游戏速度
ftpsClock.tick(10)
if name == “main”:
main()
4. 实验结果。
图6.游戏用户点击向右移动
图7.游戏用户点击向左移动
图8.游戏用户点击向下移动
图9.游戏用户点击向上移动
图10.用户游戏失败
5.总结和展望。
因为这学期学习的课程很多,所以这个小游戏还没做更深层的研究探索,这个游戏主要用了pygame这个库,但是Python还有许多库有:matplotlib.一个绘制数据图的库。对于数据科学家或分析师非常有用。Pyglet.3D动画和游戏开发引擎。pyQT.Python的GUI工具。这是我在给Python脚本开发用户界面时次于wxPython的选择。pyGtk.也是Python GUI库。很有名的Bittorrent客户端就是用它做的。Scapy.用Python写的数据包探测和分析库。因此虽然课程结束,但是对python的学习却永无止境,python还有太多的知识需要我去探寻。
参考文献:
[1]《Python编程初学者指南》[美]Michael Dawson 著 王金兰 译
[2]链接: https://mooc1-1.chaoxing.com/mycourse/studentcourse?courseId=209493043&vc=1&clazzid=21368341&enc=6ed1d27d7230cc97c15520e5fb69145a
[3] 链接:https://www.jianshu.com/p/f339356fd9ee
[4] 链接:https://blog.****.net/Ljt101222/java/article/details/81184180