纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

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

tigeriaf   2021-09-14 我要评论
想了解基于python pygame实现的兔子吃月饼小游戏的相关内容吗tigeriaf在本文为您仔细讲解pygame兔子吃月饼小游戏的相关知识和一些Code实例欢迎阅读和指正我们先划重点:pygame小游戏代码,pygame经典游戏,pycharm做小游戏下面大家一起来学习吧

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

小游戏规则简介

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

运行如下:

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

总结


相关文章

猜您喜欢

  • mybatis-spring @MapperScan注解 mybatis-spring:@MapperScan注解的使用

    想了解mybatis-spring:@MapperScan注解的使用的相关内容吗NetWhite在本文为您仔细讲解mybatis-spring @MapperScan注解的相关知识和一些Code实例欢迎阅读和指正我们先划重点:mybatis,spring,@MapperScan注解下面大家一起来学习吧..
  • Java 异常 Java异常的处理机制

    想了解Java异常的处理机制的相关内容吗威斯布鲁克.猩猩在本文为您仔细讲解Java 异常的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Java,异常,Java,异常机制下面大家一起来学习吧..

网友评论

Copyright 2020 www.sopisoft.net 【绿软下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式