新闻动态

基于python pygame实现的兔子吃月饼小游戏

发布日期:2022-01-04 05:10 | 文章来源:脚本之家

中秋佳节就快来临,给各位大佬整个兔子吃月饼的小游戏助助兴,废话不多说,开整。

小游戏规则简介

玩家通过"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斤,即结束。

运行如下:

完成!感谢阅读,提前祝大家中秋快乐!!!

总结

到此这篇关于基于python pygame实现的兔子吃月饼小游戏的文章就介绍到这了,更多相关pygame兔子吃月饼小游戏内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。

相关文章

实时开通

自选配置、实时开通

免备案

全球线路精选!

全天候客户服务

7x24全年不间断在线

专属顾问服务

1对1客户咨询顾问

在线
客服

在线客服:7*24小时在线

客服
热线

400-630-3752
7*24小时客服服务热线

关注
微信

关注官方微信
顶部