【python小游戏】用python写一款小游戏--贪吃蛇
颜色定义BG_COLOR = black #游戏背景颜色我们接下来定义一下四个方向# 定义方向UP = 1DOWN = 2LEFT = 3RIGHT = 4HEAD = 0 #贪吃蛇头部下标主函数#主函数pygame.init() # 模块初始化snake_speed_clock = pygame.time.Clock() # 创建Pygame时钟对象pygame.display.set_capt
今天,突发奇想的想用python写一款小游戏–贪吃蛇。相信大家都玩过,那么玩一款自己写的是一种什么样的体验呢。
我们首先导入相关模块
导入相关模块
import random
import pygame
import sys
那么这三个模块有什么意思呢。我们一一介绍。
1.random
Python中的random模块用于生成随机数,它提供了很多函数。常用函数总结如下:
- random.random()
用于生成一个0到1的随机浮点数: 0 <= n < 1.0- random.seed(n)
用于设定种子值,其中的n可以是任意数字。random.random() 生成随机数时,每一次生成的数都是随机的。但是,使用 random.seed(n) 设定好种子之后,在先调用seed(n)时,使用 random() 生成的随机数将会是同一个。- random.uniform(a,b)
返回a,b之间的随机浮点数,若a<=b则范围[a,b],若a>=b则范围[b,a] ,a和b可以是实数。- random.randint(a,b)
返回a,b之间的整数,范围[a,b],注意:传入参数必须是整数,a一定要比b小。- random.randrange([start=0], stop[, step=1])
返回前闭后开区间[start,stop)内的整数,可以设置step。只能传入整数。- random.choice(sequence)
从sequence(序列,列表、元组和字符串)中随机获取一个元素。- random.choice(sequence, k)
从sequence(序列,列表、元组和字符串)中随机获取k个元素,可能重复,k用参数名传值,k省略则默认取1个,返回list。- random. shuffle(x)
用于将列表中的元素打乱顺序,俗称为洗牌。- random. sample(sequence,k)
从指定序列中随机获取k个不重复元素作为一个列表返回, sample函数不会修改原有序列。知识点扩展:
python random模块导入及用法
random是程序随机数,很多地方用到,验证码,图片上传的图片名称等,下面说说python random模块导入及用法
1,模块导入
import random
2,random用法
random.randomrange(1,10) 返回1-10随机数,不包括10
random.randomint(1,10) 返回1-10随机数,包括10
random.randomrange(1,100,2) 随机选取0-100的偶数
random.random() 返回浮点数
random.choice()
random.sample() 从多个字符选取特定字符
2.pygame
pygame简介
pygame可以实现python游戏的一个基础包。
pygame实现窗口
初始化pygame,init()类似于java类的初始化方法,用于pygame初始化。
pygame.init()
设置屏幕,(500,400)设置屏幕初始大小为500 * 400的大小,0和32 是比较高级的用法。这样我们便设置了一个500*400的屏幕。
surface = pygame.display.set_mode((500, 400), 0, 32)
如果不设置pygame事件的话,窗口会一闪而逝。这里去捕捉pygame的事件,如果没有按退出,那么窗口就会一直保持着,这样方便我们去设置不同的内容展示。
3.sys
sys模块 与 os包一样,也是对系统资源进行调用。功能同样也是非常丰富,接下来我们会对 sys模块的一些简单且常用的函数进行介绍,主要针对一些非功能性的函数与属性来认识一些不太常见的 Python 背后的事件。
示例如下:
//author:爱吃饼干的小白鼠
import sys
modules = sys.modules # 将 sys 模块的 modules 属性 赋值给 modules 并打印输出 Python启动时加载的模块集合
print(modules)
# sys.exit(0) # 取消注释该行代码,下方所有的代码将不再执行
path = sys.path
print(path) # 将 sys 模块的 path 属性 赋值给 path 并打印输出 python 环境可以导入内置、第三方包与函数的所在路径
code = sys.getdefaultencoding() # 将 sys 模块 的 getdefaultencoding()函数 赋值给 code 并打印输出当前系统的编码[utf-8]
print(code)
# >>> 执行结果如下:
# >>> utf-8
print(sys.platform) # 获取当前系统平台(如windows、Mac、linux)
# >>> 执行结果如下:
# >>> darwin
print(sys.version) # 获取当前 Python 的版本
# >>> 执行结果如下:
# >>> 3.8.7 (v3.8.7:6503f05dd5, Dec 21 2020, 12:45:15)
# >>> [Clang 6.0 (clang-600.0.57)]
言归正传,我们继续说说下一步我们要怎么做。
初始化
snake_speed = 10 #贪吃蛇的速度
windows_width = 800
windows_height = 600 #游戏窗口的大小
cell_size = 20 #贪吃蛇身体方块大小,注意身体大小必须能被窗口长宽整除
颜色定义
# 颜色定义
white = (255, 255, 255)
black = (0, 0, 0)
gray = (230, 230, 230)
dark_gray = (40, 40, 40)
DARKGreen = (0, 155, 0)
Green = (0, 255, 0)
Red = (255, 0, 0)
blue = (0, 0, 255)
dark_blue =(0,0, 139)
BG_COLOR = black #游戏背景颜色
我们接下来定义一下四个方向
# 定义方向
UP = 1
DOWN = 2
LEFT = 3
RIGHT = 4
HEAD = 0 #贪吃蛇头部下标
主函数
#主函数
def main():
pygame.init() # 模块初始化
snake_speed_clock = pygame.time.Clock() # 创建Pygame时钟对象
screen = pygame.display.set_mode((windows_width, windows_height)) #
screen.fill(white)
pygame.display.set_caption("Python 贪吃蛇小游戏") #设置标题
show_start_info(screen) #欢迎信息
while True:
running_game(screen, snake_speed_clock)
show_gameover_info(screen)
游戏运行主体
#游戏运行主体
def running_game(screen,snake_speed_clock):
startx = random.randint(3, map_width - 8) #开始位置
starty = random.randint(3, map_height - 8)
snake_coords = [{'x': startx, 'y': starty}, #初始贪吃蛇
{'x': startx - 1, 'y': starty},
{'x': startx - 2, 'y': starty}]
direction = RIGHT # 开始时向右移动
food = get_random_location() #实物随机位置
while True:
for event in pygame.event.get():
if event.type == QUIT:
terminate()
elif event.type == KEYDOWN:
if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT:
direction = LEFT
elif (event.key == K_RIGHT or event.key == K_d) and direction != LEFT:
direction = RIGHT
elif (event.key == K_UP or event.key == K_w) and direction != DOWN:
direction = UP
elif (event.key == K_DOWN or event.key == K_s) and direction != UP:
direction = DOWN
elif event.key == K_ESCAPE:
terminate()
move_snake(direction, snake_coords) #移动蛇
ret = snake_is_alive(snake_coords)
if ret:
break #蛇跪了. 游戏结束
snake_is_eat_food(snake_coords, food) #判断蛇是否吃到食物
screen.fill(BG_COLOR)
#draw_grid(screen)
draw_snake(screen, snake_coords)
draw_food(screen, food)
draw_score(screen, len(snake_coords) - 3)
pygame.display.update()
snake_speed_clock.tick(snake_speed) #控制fps
接下来,就是我们今天的主角–贪吃蛇和它的食物。
#将食物画出来
def draw_food(screen, food):
x = food['x'] * cell_size
y = food['y'] * cell_size
appleRect = pygame.Rect(x, y, cell_size, cell_size)
pygame.draw.rect(screen, Red, appleRect)
#将贪吃蛇画出来
def draw_snake(screen, snake_coords):
for coord in snake_coords:
x = coord['x'] * cell_size
y = coord['y'] * cell_size
wormSegmentRect = pygame.Rect(x, y, cell_size, cell_size)
pygame.draw.rect(screen, dark_blue, wormSegmentRect)
wormInnerSegmentRect = pygame.Rect( #蛇身子里面的第二层亮绿色
x + 4, y + 4, cell_size - 8, cell_size - 8)
pygame.draw.rect(screen, blue, wormInnerSegmentRect)
然后我们设计贪吃蛇有没有吃到食物,判定贪吃蛇死亡以及食物随机产生。
#判断蛇死了没
def snake_is_alive(snake_coords):
tag = True
if snake_coords[HEAD]['x'] == -1 or snake_coords[HEAD]['x'] == map_width or snake_coords[HEAD]['y'] == -1 or \
snake_coords[HEAD]['y'] == map_height:
tag = False # 蛇碰壁啦
for snake_body in snake_coords[1:]:
if snake_body['x'] == snake_coords[HEAD]['x'] and snake_body['y'] == snake_coords[HEAD]['y']:
tag = False # 蛇碰到自己身体啦
return tag
#判断贪吃蛇是否吃到食物
def snake_is_eat_food(snake_coords, food): #如果是列表或字典,那么函数内修改参数内容,就会影响到函数体外的对象。
if snake_coords[HEAD]['x'] == food['x'] and snake_coords[HEAD]['y'] == food['y']:
food['x'] = random.randint(0, map_width - 1)
food['y'] = random.randint(0, map_height - 1) # 实物位置重新设置
else:
del snake_coords[-1] # 如果没有吃到实物, 就向前移动, 那么尾部一格删掉
#食物随机生成
def get_random_location():
return {'x': random.randint(0, map_width - 1), 'y': random.randint(0, map_height - 1)}
接下来,我们设计一个开局画面,代码如下:
#开始信息显示
def show_start_info(screen):
font = pygame.font.Font('myfont.ttf', 40)
tip = font.render('按任意键开始游戏~~~', True, (65, 105, 225))
gamestart = pygame.image.load('gamestart.png')
screen.blit(gamestart, (140, 30))
screen.blit(tip, (240, 550))
pygame.display.update()
while True: #键盘监听事件
for event in pygame.event.get(): # event handling loop
if event.type == QUIT:
terminate() #终止程序
elif event.type == KEYDOWN:
if (event.key == K_ESCAPE): #终止程序
terminate() #终止程序
else:
return #结束此函数, 开始游戏
我们再来设计游戏结算的画面。
#游戏结束信息显示
def show_gameover_info(screen):
font = pygame.font.Font('myfont.ttf', 40)
tip = font.render('按Q或者ESC退出游戏, 按任意键重新开始游戏~', True, (65, 105, 225))
gamestart = pygame.image.load('gameover.png')
screen.blit(gamestart, (60, 0))
screen.blit(tip, (80, 300))
pygame.display.update()
while True: #键盘监听事件
for event in pygame.event.get(): # event handling loop
if event.type == QUIT:
terminate() #终止程序
elif event.type == KEYDOWN:
if event.key == K_ESCAPE or event.key == K_q: #终止程序
terminate() #终止程序
else:
return #结束此函数, 重新开始游戏
当我们贪吃蛇吃一个食物得多少分,我们可以这样写:
#画成绩
def draw_score(screen,score):
font = pygame.font.Font('myfont.ttf', 30)
scoreSurf = font.render('得分: %s' % score, True, Green)
scoreRect = scoreSurf.get_rect()
scoreRect.topleft = (windows_width - 120, 10)
screen.blit(scoreSurf, scoreRect)
到这里,我们贪吃蛇的主体程序已经写出来,我们稍加完善就能运行。
哈哈,我已经开始玩自己做的贪吃蛇了,如果想要完整程序,可以关注我下一篇博文。
谢谢大家,今天的分享就到这里了。喜欢的话点个关注吧。
如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!
😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
## 1️⃣零基础入门① 学习路线
对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
② 路线对应学习视频
还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
③练习题
每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
2️⃣国内外Python书籍、文档
① 文档和书籍资料
3️⃣Python工具包+项目源码合集
①Python工具包
学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
②Python实战案例
光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
③Python小游戏源码
如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
4️⃣Python面试题
我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
5️⃣Python兼职渠道
而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓
更多推荐
所有评论(0)