基于python pygame实现的兔子吃月饼小游戏
作者:tigeriaf 发布时间:2023-10-26 21:25:23
标签:pygame,小游戏,python
目录
小游戏规则简介
实现
初始化游戏窗口
游戏逻辑
实现玩家类
实现月饼类
交互逻辑
总结
中秋佳节就快来临,给各位大佬整个兔子吃月饼的小游戏助助兴,废话不多说,开整。
小游戏规则简介
玩家通过"wsad"或者"↑↓←→"键控制兔子移动,使得兔子可以吃到更多的月饼,月饼一旦生成之后位置不会变,也不会消失,就等着兔子去吃,就是这么简单。但是吃了月饼会变重,重到一定程度会有想不到的效果。
实现
使用Python的pygame模块开发,pygame是用来开发游戏软件的Python第三方库,基于SDL库的基础上开发。可以创建功能丰富的游戏和多媒体程序,用它来开发小游戏非常适合。
初始化游戏窗口
import sys
import pygame
width = 800
height = 800
# 初始化所有pygame模块
pygame.init()
# 创建游戏主窗口 width * height
windows = pygame.display.set_mode((width, height))
pygame.display.set_caption('兔子吃月饼!!')
# 游戏循环
while True:
# 给屏幕填充颜色
windows.fill((204, 204, 255))
for event in pygame.event.get():
# 判断事件是否是退出事件,是则退出
if event.type == pygame.QUIT:
# 先退出pygame窗口,再退出程序
pygame.quit()
sys.exit()
pygame.display.flip()
游戏逻辑
实现玩家类
玩家应该包括以下属性:位置、角色大小、分数等,还应该有移动位置move的方法,由于在此玩家控制的是一只兔子,玩法是吃月饼,所以把分数换为重量。
class Rabbit:
"""
玩家兔子类
"""
def __init__(self, top, left, height, width):
# 初始位置及大小
self.top = top
self.left = left
self.height = height
self.width = width
# 游戏人物的初始位置
self.rect = pygame.Rect(self.left, self.top, self.width, self.height)
self.player_image = pygame.image.load('兔子.png')
self.player_stretched_image = pygame.transform.scale(self.player_image, (height, width))
# 控制移动变量
self.move_left = False
self.move_right = False
self.move_up = False
self.move_down = False
# 每次移动的大小
self.MOVESPEED = 5
# 重量
self.weight = 5
def move(self):
"""
控制移动
:return:
"""
if self.move_down and self.rect.bottom < height:
self.rect.top += self.MOVESPEED
self.rect.bottom += self.MOVESPEED
if self.move_up and self.rect.top > 0:
self.rect.top -= self.MOVESPEED
self.rect.bottom -= self.MOVESPEED
if self.move_left and self.rect.left > 0:
self.rect.left -= self.MOVESPEED
self.rect.right -= self.MOVESPEED
if self.move_right and self.rect.right < width:
self.rect.left += self.MOVESPEED
self.rect.right += self.MOVESPEED
实现月饼类
月饼包括月饼的位置大小,及月饼的图像,月饼的图像在已有的图像中随机选择。
class MoonCake:
"""
月饼类
"""
def __init__(self):
# 位置及大小
self.rect = pygame.Rect(random.randint(0, 750), random.randint(0, 750), 20, 20)
# 图像
self.moon_cake_image = pygame.image.load("./月饼/月饼{}.png".format(random.randint(1, 8)))
交互逻辑
主要在游戏窗口内生成并显示玩家兔子和月饼,然后监听键盘事件,监听"wsad"或者"↑↓←→"键,来控制兔子上下左右的进行移动,再实现碰撞检测来验证兔子是否吃到月饼,吃到月饼则重量增加。运行过程中也会不断判断月饼的数量,并不断增加。
def game_run():
global width
global height
# 是否结束
end = False
# 创建时钟对象 (可以控制游戏循环频率)
clock = pygame.time.Clock()
# 月饼计数器
moon_cake_limit = 20
player = None
if not player:
player = Rabbit(300, 100, 64, 64)
moon_cakes = []
for i in range(20):
moon_cake = MoonCake()
moon_cakes.append(moon_cake)
# 游戏循环
while True and not end:
# 给屏幕填充颜色
windows.fill((204, 204, 255))
# 监听键盘事件
key_pressed = pygame.key.get_pressed()
if key_pressed[pygame.K_a] or key_pressed[pygame.K_LEFT]:
player.move_right = False
player.move_left = True
if key_pressed[pygame.K_d] or key_pressed[pygame.K_RIGHT]:
player.move_left = False
player.move_right = True
if key_pressed[pygame.K_w] or key_pressed[pygame.K_UP]:
player.move_down = False
player.move_up = True
if key_pressed[pygame.K_s] or key_pressed[pygame.K_DOWN]:
player.move_up = False
player.move_down = True
player.move()
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYUP:
if event.key == K_ESCAPE:
pygame.quit()
sys.exit()
if event.key == K_LEFT or event.key == K_a:
player.move_left = False
if event.key == K_RIGHT or event.key == K_d:
player.move_right = False
if event.key == K_UP or event.key == K_w:
player.move_up = False
if event.key == K_DOWN or event.key == K_s:
player.move_down = False
# 月饼不足20时生成新的月饼
if len(moon_cakes) < moon_cake_limit:
# 生成新的月饼
moon_cakes.append(MoonCake())
# 画兔子
windows.blit(player.player_stretched_image, player.rect)
# 显示兔子的重量
text = pygame.font.SysFont("microsoftyaheimicrosoftyaheiui", 30)
text_fmt = text.render("重量:{}斤!".format(player.weight), True, (255, 255, 255))
windows.blit(text_fmt, (0, 0))
# 画月饼
for moon_cake in moon_cakes:
windows.blit(moon_cake.moon_cake_image, moon_cake.rect)
# 碰撞检测
for moon_cake in moon_cakes:
if player.rect.colliderect(moon_cake.rect):
moon_cakes.remove(moon_cake)
# 吃到月饼兔子会变重
player.weight += 2
pygame.display.flip()
pygame.display.update()
# 通过时钟对象指定循环频率
clock.tick(40)
运行如下:
突然发现,这样的话这个游戏永远不会结束,可以一直玩下去,上面我们说了,兔子吃到月饼重量会增加,那我们增加一个机制:等兔子的重量大于100斤的时候,游戏结束,对!你没有看错!,就是这么草率!!!
在碰撞检测循环里加入以下逻辑:
if player.weight > 10:
end = True
while end:
# 游戏结束
windows.fill((204, 204, 255))
text = pygame.font.SysFont("microsoftyaheimicrosoftyaheiui", 50)
text_fmt1 = text.render("你的兔子撑死了!!".format(player.weight), True, (255, 255, 255))
text_fmt2 = text.render("game over!".format(player.weight), True, (255, 255, 255))
windows.blit(text_fmt1, (200, 200))
windows.blit(text_fmt2, (260, 300))
clock.tick(40)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# 按任意键继续
if event.type == pygame.KEYDOWN:
end = False
# 重新生成玩家兔子及月饼
player = Rabbit(random.randint(0, 750), random.randint(0, 750), 64, 64)
moon_cakes.clear()
for i in range(20):
moon_cake = MoonCake()
moon_cakes.append(moon_cake)
pygame.display.flip()
pygame.display.update()
为了方便调试,改成了兔子重量大于10斤,即结束。
运行如下:
完成!感谢阅读,提前祝大家中秋快乐!!!
来源:https://juejin.cn/post/7005428271852552228


猜你喜欢
- 教你如何清除SQL日志 1.打开查询分析器,输入命令DUMP TRANSACTION 数据库名 WITH NO_LOG2. 再打开企业管理器
- http://validator.w3.org/#validate_by_upload 在线校验网址点浏览,上次找到自己做的页面
- 如果遇到与文件许可有关的问题,可能数启动mysqld时UMASK环境变量设置得不正确。例如,当你创建表时,MySQL可能会发出下述错误消息:
- 生日送什么礼物总是要花一番心思,别出心裁不落俗套,什么礼物才能让那一个她开心呢?来看看前端大大用html+css实现动态生日快乐
- 现在我们已经知道了,fixtures是一个非常强大的功能。那么有的时候,我们可能会写一个fixture,而这个fixture所有的测试函数都
- 使用python网络爬虫登录12306,网站界面如下。因为网站的反爬是不断升级的,以下代码虽然当前可用,但早晚必将会不再能满足登录需求。但是
- 1.使用open()函数打开文件夹在读取一个文件的内容之前,需要先打开这个文件。在Python程序中可以通过内置函数open()来打开一个文
- Hello World一个简单的hello world例子:#!/usr/bin/env perluse strict;use warnin
- auto-push-oss Action虽然在 Github 市场有推送 OSS 相关的 Action,但是我还是选择改造我运行了好多年的脚
- 有时候,我们需要检测一个元素是否已经存在列表中,并且不区分大小写,如:列表已有元素Mary,那我们想认为MARY也已经被占用。这个例子在实际
- Python编程中经常遇到一些莫名其妙的错误, 其实这不是语言本身的问题, 而是我们忽略了语言本身的一些特性导致的,今天就来看下使用Pyth
- 我们可以先建立一个包含文件名,文件标题的待检索文件的数据库,然后,用ADO方式来访问它,并建立记录集对象。具体代码和说明见下:
- 本文实例讲述了JS定义函数的几种常用方法。分享给大家供大家参考,具体如下:在 JavaScript 语言里,函数是一种对象,所以可以说函数是
- 代码import psutilprint(dir(psutil))# 查看逻辑cpu的个数print(psutil.cpu_count())
- 通过学习借鉴朋友的实现方法进行整理,实现了PHP版的微信公共平台消息主动推送,分享给大家供大家参考,具体内容如下此方法是通过模拟登录微信公共
- 单表的唯一查询用:distinct多表的唯一查询用:group bydistinct 查询多表时,left join 还有效,全连接无效,在
- 1.背景1.1. 项目介绍golang/sync库拓展了官方自带的sync库,提供了errgroup、semaphore、singlefli
- 有产品表,包含id,name,city,addtime四个字段,因报表需要按城市分组,统计每个城市的最新10个产品,便向该表中插入了100万
- 改变一个表的分区方案只需使用alter table 加 partition_options 子句就可以了。和创建分区表时的create ta
- 通过创建变量var a = 'something' + '