发布时间:2022-08-19 12:05
人生苦短,我用Python!
hello 大家好!我是Mark,一个姓马名克的中国人。
最近呢突然特别想玩一个贪吃蛇的小游戏,可是家里管得严,电脑上面,手机上面都不让下载,可是,对于会Python的我,这根本不是问题。
今天,我们就来看看,如何通过Python来写一个贪吃蛇小游戏!
注意一下,本文适合稍微有一点Python基础的朋友,如果你点进来只是想体验一下Python写的小游戏,可以直接拉到文章最后,有惊喜哟!
首先,我这里调用pygame模块
安装:
pip install pygame
安装完成之后输入
python
import pygame
如果没有报错,说明安装成功。
接下来,我们就开始撸代码啦!
一、导入模块
import pygame, time, random, sys
time模块用于控制时间,sys模块用于退出程序,random模块用于随机生成食物。
二、初始化游戏窗口
'''初始化游戏'''
pygame.init()
# 初始化游戏窗口
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption('贪吃蛇小游戏')
这里创建了一个640 × 480的长方形窗口。
同时,将窗口上方的名称设定为“贪吃蛇小游戏”
三、定义一些需要用的变量名
# 定义速度
fpsclock = pygame.time.Clock()
# 定义字体
font = pygame.font.Font('C:/Windows/Fonts/ARLRDBD.TTF', 80)
# 定义颜色
red = pygame.Color(255, 0, 0)
blue = pygame.Color(0, 0, 255)
balck = pygame.Color(0, 0, 0)
white = pygame.Color(255, 255, 255)
grey = pygame.Color(130, 130, 130)
定义字体的位置,当中有一个“C:/Windows/Fonts/ARLRDBD.TTF”,这个是字体文件的位置,后面的80是字体的大小。
另外注意,下面的颜色,用的是RGB光学三原色,这个只做了解。
四、定义贪吃蛇和食物的基本信息。
'''初始化贪吃蛇和食物'''
# 贪吃蛇的位置
snake_head = [100, 100]
# 贪吃蛇的身体
snake_body = [[80, 100], [60, 100], [40, 100]]
# 定义贪吃蛇的开始方向
direction = 'right'
# 食物标记
food_flag = 1
# 第一个食物的位置
food_position = [300, 300]
相信大家注意到了,食物标记 这个东西,当食物标记为1,就代表食物没有被吃掉,当食物标记为2,就代表已经被吃掉了。
注意一下这里的坐标
这个pygame的坐标方式和正常的不太一样,如图所示。
五、开启游戏主循环
while True:
# 屏幕用黑色填充
screen.fill(0)
'''检测事件'''
for event in pygame.event.get():
# 检测退出
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
这里注意一下了,一定要检测退出,不然点击退出按钮的时候就会一直转圈圈,无法退出。
六、检测按键是否按下
# 检测按键是否按下
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP and direction != 'down':
direction = 'up'
elif event.key == pygame.K_DOWN and direction != 'up':
direction = 'down'
elif event.key == pygame.K_RIGHT and direction != 'left':
direction = 'right'
elif event.key == pygame.K_LEFT and direction != 'right':
direction = 'left'
注意一下,这里的缩进级别和上一个 if 的级别相等,
连起来看是这样的
这里有很多 if 语句,拆开来看其实不难。
七、移动贪吃蛇
一样的,直接上代码
'''移动贪吃蛇'''
if direction == 'up':
snake_head[1] -= 20
if direction == 'down':
snake_head[1] += 20
if direction == 'right':
snake_head[0] += 20
if direction == 'left':
snake_head[0] -= 20
# 将蛇的头部当前的位置加入到蛇身的列表中
snake_body.insert(0, list(snake_head))
这几个语句都很简单,自行理解。
八、判定食物是否被吃
# 判定食物是否被吃
if snake_head[1] == food_position[1] and snake_head[0] == food_position[0]:
food_flag = 2
else:
snake_body.pop()
这个也很简单,就是说,一旦蛇头与食物坐标一致,食物标记就变成了被吃的状态。
九、随机生成食物
话不多说,上代码
# 随机生成食物
if food_flag == 2:
x = random.randrange(1, 32)
y = random.randrange(1, 24)
food_position = [int(x * 20), int(y * 20)]
food_flag = 1
这个很好理解,随机生成 x 和 y 然后将食物标记归零。
十、绘制贪吃蛇
当你写完了以上代码,你会发现,咦?为什么我这个屏幕一片黑色?
因为呀,你的贪吃蛇都没有画出来呢!
# 画出贪吃蛇
def snake(Snake_body):
for i in Snake_body:
pygame.draw.rect(screen, white, (i[0], i[1], 20, 20))
这里看一下这个方法
pygame.draw.rect(surf 也就是你要画的屏幕, color 颜色, (x横轴, y纵轴, int长, int宽)
如果是旧版本的pygame,可以将代码改成这样
# 画出贪吃蛇
def snake(Snake_body):
for i in Snake_body:
pygame.draw.rect(screen, white, Rect(i[0], i[1], 20, 20))
十一、绘制食物
接下来,我们就让食物也出现在屏幕上面吧
# 画出食物
def food(food_Position):
pygame.draw.rect(screen, red, (food_Position[0], food_Position[1], 20, 20))
如果是旧版本的pygame,把代码改成这样
# 画出食物
def food(food_Position):
pygame.draw.rect(screen, red, Rect(food_Position[0], food_Position[1], 20, 20))
十二、绘制分数
代码如下
# 打印分数
def drawscore(score):
# 设置分数的颜色
score_surf = font.render('%s' % score, True, grey)
# 设置分数的位置
score_rect = score_surf.get_rect()
score_rect.midtop = (320, 240)
# 绑定以上句柄
screen.blit(score_surf, score_rect)
十三、在屏幕上绘制贪吃蛇和食物
好了,绘制贪吃蛇和绘制食物的函数都定义完成了,接下来,让我们把他添加到主循环当中去。
在屏幕用黑色填充之后,加入以下代码
# 画出角色
snake(snake_body)
food(food_position)
drawscore(len(snake_body) - 3)
# 刷新屏幕
pygame.display.flip()
fpsclock.tick(10)
注意了,一定要添加到填充屏幕的后面,看起来是这样的
这个时候,你再一次运行代码,就可以畅快的玩一个无敌版本的贪吃蛇了!
咦?为什么是无敌版本?
相信大家都知道了,因为我们还没有定义死亡的的函数呢!
十四、定义死亡函数
def game_over():
# 设置文字颜色
game_over_surf = font.render('Game Over!', True, grey)
# 设置文字位置
game_over_rect = game_over_surf.get_rect()
game_over_rect.midtop = (320, 10)
# 绑定以上句柄
screen.blit(game_over_surf, game_over_rect)
pygame.display.flip()
time.sleep(3)
pygame.quit()
sys.exit()
函数定义完成了,接下来,把它添加到主循环里面去。
十五、完成游戏
'''判定死亡'''
# 碰到边缘
if snake_head[0] < 0 or snake_head[0] > 620:
game_over()
elif snake_head[1] < 0 or snake_head[1] > 460:
game_over()
# 贪吃蛇碰到自己
for i in snake_body[1:]:
if snake_head[0] == i[0] and snake_head[1] == i[1]:
game_over()
OK啦!
你的贪吃蛇小游戏完成啦!
现在去试一试吧,一定会非常有意思的!
十六、福利环节
是的,你没有看错,这就是福利环节,专门给来打酱油的人提供的环节。
我已经将源代码打包成了一个exe,供无聊人士使用
这里提供几个下载地址:
百度网盘:链接: https://pan.baidu.com/s/10uG7lF3pIQ03jLVQGBzEkg 提取码: wrss
蓝奏云:https://wws.lanzous.com/ip8lddkqxuh
CSDN下载:https://download.csdn.net/download/zhugezuoyuan/12516509
使用方法:
下载压缩包,解压,双击里面的ARLRDBD.TTF字体文件进行安装,不然程序无法运行,源代码就是压缩包当中的源码.py。
好了,今天的分享就到这里,再见!