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

作者:tigeriaf 时间:2023-10-26 21:25:23 

目录
  • 小游戏规则简介

  • 实现

    • 初始化游戏窗口

    • 游戏逻辑

      • 实现玩家类

      • 实现月饼类

      • 交互逻辑

  • 总结

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

    小游戏规则简介

    玩家通过"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()

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

    游戏逻辑

    实现玩家类

    玩家应该包括以下属性:位置、角色大小、分数等,还应该有移动位置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)

    运行如下:

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

    突然发现,这样的话这个游戏永远不会结束,可以一直玩下去,上面我们说了,兔子吃到月饼重量会增加,那我们增加一个机制:等兔子的重量大于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实现的兔子吃月饼小游戏

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

    来源:https://juejin.cn/post/7005428271852552228

    标签:pygame,小游戏,python
    0
    投稿

    猜你喜欢

  • python中ndarray数组的索引和切片的使用

    2022-10-12 13:49:55
  • Python中用PIL库批量给图片加上序号的教程

    2021-04-08 01:55:46
  • python基于socket函数实现端口扫描

    2022-02-06 09:22:37
  • SQL语句删除2条重复数据一条保留一条

    2024-01-26 12:16:39
  • mysql使用mysqld_multi部署单机多实例的方法教程

    2024-01-15 12:26:01
  • 使用MySQL Slow Log来解决MySQL CPU占用高的问题

    2024-01-25 01:43:35
  • 浅谈PHP的反射机制

    2023-06-13 17:05:35
  • 为你的网页添加背景音乐

    2007-02-03 11:39:00
  • python对视频画框标记后保存的方法

    2022-09-23 03:20:05
  • 仅用50行Python代码实现一个简单的代理服务器

    2022-11-26 14:44:57
  • Python使用tkinter模块实现推箱子游戏

    2022-12-06 08:27:49
  • JavaScript 获取事件对象的一个注意点

    2009-07-24 11:49:00
  • Python日期时间对象转换为字符串的实例

    2022-05-24 14:51:29
  • 5款Python程序员高频使用开发工具推荐

    2022-01-25 14:09:16
  • python 包之 re 正则匹配教程分享

    2021-10-15 18:36:41
  • mysql 字段定义不要用null的原因分析

    2024-01-21 10:34:30
  • Ajax+asp应用实例 注册模块,表单提交

    2011-04-08 10:47:00
  • python Django里CSRF 对应策略详解

    2021-02-15 20:36:19
  • python爬虫解决验证码的思路及示例

    2021-07-21 19:23:04
  • python对html过滤处理的方法

    2023-04-25 15:28:57
  • asp之家 网络编程 m.aspxhome.com