🖼️ 效果展示
📜 游戏背景
在中秋这个充满诗意的节日里,玉兔因为贪玩被赶下人间。在这个温柔的夜晚,我们希望通过一个小游戏,让玉兔感受到人间的温暖和关怀。🐰🌙
🎮 游戏设计
人物与目标
- 玉兔:使用鼠标控制左右移动,目标是接住从天而降的月饼。
- 月饼:随机从屏幕上方降落,接住加10分,落到地面减5分。
- 月亮:随机降落,接住减5分并减少一格生命值。
游戏机制
- 生命值(血条):初始为3格,每接住一个月亮减少一格,归零游戏结束。
- 开始与重来:点击开始按钮进入游戏,游戏结束后点击重来按钮重新开始。
💻 代码素材
游戏环境:
- Python 3.10.10
- Pygame 2.5.2
代码示例
python
# 隐藏pygame的import欢迎显示
import os
os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = ''
import pygame
import random
pygame.init() # 初始化pygame库
sc = pygame.display.set_mode((600, 695)) # 创建游戏窗口,尺寸为600x695
pygame.display.set_caption("玉兔吃月饼------祝大家中秋节快乐!") # 设置窗口标题
# 加载图片资源
basket = pygame.image.load("img/basket.png") # 加载篮子的图片
bj = pygame.image.load("img/bj.jpg") # 加载背景图片
bomb = pygame.image.load("img/bomb.png") # 加载炸弹图片
coin = pygame.image.load("img/coin.png") # 加载月饼图片
start = pygame.image.load("img/start.jpg") # 加载开始画面图片
over = pygame.image.load("img/over.jpg") # 加载结束画面图片
ihp = pygame.image.load("img/hp.png") # 加载生命值图标
btn_up = pygame.image.load("img/btn_up.png") # 加载开始按钮的正常状态图片
btn_down = pygame.image.load("img/btn_down.png") # 加载开始按钮的按下状态图片
bbtn_up = pygame.image.load("img/bbtn_up.png") # 加载结束按钮的正常状态图片
bbtn_down = pygame.image.load("img/bbtn_down.png") # 加载结束按钮的按下状态图片
# 加载声音资源
pygame.mixer.init() # 初始化声音模块
coin_sound = pygame.mixer.Sound("sound/coin.mp3") # 加载月饼音效
bomb_sound = pygame.mixer.Sound("sound/bomb.mp3") # 加载炸弹音效
game_start_sound = pygame.mixer.Sound("sound/start.mp3") # 加载游戏开始音效
game_over_sound = pygame.mixer.Sound("sound/game_over.mp3") # 加载游戏结束音效
word = "HP" # 生命值文字
font = pygame.font.SysFont("", 32) # 创建字体对象,大小为32
text = font.render(word, True, (75, 217, 65)) # 渲染生命值文字,颜色为绿色
score = 0 # 初始化分数为0
text1 = font.render(str(score), True, (255, 255, 255)) # 渲染分数,颜色为白色
bx = 0 # 初始化篮子的x坐标
lx, ly = [], [] # 月饼的x和y坐标列表
fx, fy = [], [] # 炸弹的x和y坐标列表
speedy = 1 # 初始速度
hp = 4 # 初始化生命值为4
# 初始化月饼的位置
for i in range(0, 4):
tx = random.randint(0, 586) # 随机生成月饼的x坐标
ty = (i - 1) * 150 # 计算月饼的y坐标
lx.append(tx) # 将x坐标添加到列表
ly.append(ty) # 将y坐标添加到列表
# 初始化炸弹的位置
for i in range(0, 2):
x = random.randint(0, 586) # 随机生成炸弹的x坐标
y = (i - 1) * 300 # 计算炸弹的y坐标
fx.append(x) # 将x坐标添加到列表
fy.append(y) # 将y坐标添加到列表
class Button(object):
def __init__(self, button_up, button_down, position):
self.btn_up = button_up # 按钮的正常状态图
self.btn_down = button_down # 按钮的按下状态图
self.position = position # 按钮的位置(x, y)
def is_over(self):
point_x, point_y = pygame.mouse.get_pos() # 获取鼠标的当前坐标
x, y = self.position # 按钮的位置坐标
w, h = self.btn_down.get_size() # 按钮的宽度和高度
# 检查鼠标是否在按钮的水平范围内
in_x = x - w / 2 < point_x < x + w / 2
# 检查鼠标是否在按钮的垂直范围内
in_y = y - h / 2 < point_y < y + h / 2
return in_x and in_y # 如果鼠标在按钮范围内则返回True
def is_pressed(self):
if event.type == pygame.MOUSEBUTTONDOWN: # 如果检测到鼠标按下事件
point_x, point_y = pygame.mouse.get_pos() # 获取鼠标的当前坐标
x, y = self.position # 按钮的位置坐标
w, h = self.btn_down.get_size() # 按钮的宽度和高度
# 检查鼠标是否在按钮的水平范围内
in_x = x - w / 2 < point_x < x + w / 2
# 检查鼠标是否在按钮的垂直范围内
in_y = y - h / 2 < point_y < y + h / 2
return True # 如果按钮被按下则返回True
def render(self):
w, h = self.btn_up.get_size() # 获取按钮的宽度和高度
x, y = self.position # 按钮的位置坐标
if self.is_over(): # 如果鼠标在按钮上
sc.blit(self.btn_down, (x - w / 2, y - h / 2)) # 绘制按下状态的按钮图
else:
sc.blit(self.btn_up, (x - w / 2, y - h / 2)) # 绘制正常状态的按钮图
button = Button(btn_up, btn_down, (288, 460)) # 创建开始按钮对象
over_button = Button(bbtn_up, bbtn_down, (288, 460)) # 创建结束按钮对象
while True: # 主游戏循环
for event in pygame.event.get(): # 处理所有事件
if event.type == pygame.QUIT: # 如果用户点击关闭按钮
pygame.quit() # 退出pygame
exit() # 退出程序
sc.blit(start, (0, 0)) # 绘制开始画面
over_button.render() # 渲染结束按钮
if over_button.is_pressed(): # 如果点击了结束按钮
hp = 3 # 重置生命值
score = 0 # 重置分数
text1 = font.render(str(score), True, (255, 255, 255)) # 更新分数字符串
game_start_sound.play() # 播放开始游戏音效
if 0 < hp < 4 and score >= 0: # 游戏进行中
sc.blit(bj, (0, 0)) # 绘制背景
sc.blit(text, (10, 583)) # 绘制生命值文字
sc.blit(text1, (570, 570)) # 绘制分数
sc.blit(basket, (bx, 540)) # 绘制篮子
# 根据分数调整掉落速度
if score <= 50:
speedy = 0.4
elif score > 100:
speedy = 0.8
elif score > 150:
speedy = 1.2
elif score > 200:
speedy = 1.6
# 处理月饼的掉落
for i in range(len(lx)):
sc.blit(coin, (lx[i], ly[i] - 600)) # 绘制月饼
ly[i] += speedy # 更新月饼的y坐标
if ly[i] > 610 + 600: # 如果月饼掉出屏幕
ly[i] = 600 # 重置月饼的y坐标
lx[i] = random.randint(0, 540) # 随机重置月饼的x坐标
score -= 5 # 减少分数
text1 = font.render(str(score), True, (255, 255, 255)) # 更新分数字符串
# 检测月饼是否被篮子接住
if bx < lx[i] + 24 < bx + 62 and 1120 <= ly[i] <= 1140:
ly[i] = 600 # 重置月饼的y坐标
lx[i] = random.randint(0, 586) # 随机重置月饼的x坐标
score += 10 # 增加分数
text1 = font.render(str(score), True, (255, 255, 255)) # 更新分数字符串
coin_sound.play() # 播放收集月饼音效
# 处理炸弹的掉落
for i in range(len(fx)):
sc.blit(bomb, (fx[i], fy[i] - 600)) # 绘制炸弹
fy[i] += speedy # 更新炸弹的y坐标
if fy[i] > 610 + 600: # 如果炸弹掉出屏幕
fy[i] = 600 # 重置炸弹的y坐标
fx[i] = random.randint(0, 545) # 随机重置炸弹的x坐标
# 检测炸弹是否击中篮子
if bx < fx[i] + 24 < bx + 62 and 1120 <= fy[i] <= 1140:
hp -= 1 # 生命值减少
fy[i] = 600 # 重置炸弹的y坐标
fx[i] = random.randint(0, 586) # 随机重置炸弹的x坐标
bomb_sound.play() # 播放炸弹音效
if event.type == pygame.MOUSEMOTION: # 如果鼠标移动事件
mx, my = pygame.mouse.get_pos() # 获取鼠标位置
bx = mx - 24 # 更新篮子的x坐标
# 边界检测
if bx < 0:
bx = 0 # 确保篮子不会超出左边界
if bx > 610 - 62:
bx = 548 # 确保篮子不会超出右边界
keys = pygame.key.get_pressed() # 获取按键状态
if keys[pygame.K_a] or keys[pygame.K_RIGHT]: # 如果按下右键或A键
bx += 5 # 向右移动篮子
if keys[pygame.K_d] or keys[pygame.K_LEFT]: # 如果按下左键或D键
bx -= 5 # 向左移动篮子
# 绘制生命值图标
for i in range(0, hp):
sc.blit(ihp, (22 * i + 40, 585))
# 游戏结束
if hp == 0 or score < 0:
bx = 0 # 重置篮子位置
speedy = 1 # 重置速度
# 重置月饼的位置
for i in range(len(lx)):
lx[i] = random.randint(0, 586) # 随机重置月饼的x坐标
ly[i] = (i - 1) * 150 # 计算月饼的y坐标
# 重置炸弹的位置
for i in range(len(fx)):
fx[i] = random.randint(0, 586) # 随机重置炸弹的x坐标
fy[i] = (i - 1) * 300 # 计算炸弹的y坐标
sc.blit(over, (0, 0)) # 绘制结束画面
button.render() # 渲染开始按钮
game_over_sound.play() # 播放游戏结束音效
if button.is_pressed(): # 如果点击了开始按钮
hp = 3 # 重置生命值
score = 0 # 重置分数
text1 = font.render(str(score), True, (255, 255, 255)) # 更新分数字符串
game_start_sound.play() # 播放开始游戏音效
pygame.display.update() # 更新屏幕显示
📁 素材
basket.png
- 玉兔图片bj.jpg
- 游戏背景bomb.png
- 月亮图片coin.png
- 月饼图片start.jpg
- 开始界面over.jpg
- 游戏结束界面hp.png
- 生命值图标btn_up.png
,btn_down.png
- 按钮图片
🔧 如何使用
-
安装Pygame
shellpip install pygame
-
下载代码和素材:将游戏代码和所有素材下载到本地文件夹中。
-
运行游戏:右键或终端运行py文件。
-
游戏操作 :
- 使用鼠标控制玉兔左右移动。
- 点击开始按钮开始游戏。
- 游戏过程中,接住月饼加分,接住月亮减分并减少生命值。
- 游戏结束后,点击重来按钮重新开始。
🌟 游戏功能
- 动态得分系统:根据接住的月饼和月亮动态计算得分。
- 生命值管理:通过血条显示玉兔的生命值,增加游戏的挑战性。
- 难度自适应:随着得分的增加,游戏难度会逐渐提高,增加游戏的可玩性。
- 重新开始机制:游戏结束后,玩家可以立即重新开始,无需重新加载游戏。
🌟 结束语
"但愿人长久,千里共婵娟",在这个中秋,让我们一起通过这个游戏,传递温暖和快乐。🌕😊
👇 源码资料获取 · 技术与交流 👇