学习Python开发小游戏(三)-----勇闯地下一百层

前提条件:

        需要安装pygame,pgzero,numpy(windows:1.19.3)

功能:

       1.初始化界面显示5个砖块和角色图片

       2.键盘控制角色的左右移动,当角色不在砖块上时显示角色下降

       3.角色在砖块上移动时显示角色行走的效果

       4.统计角色闯过的层数,每闯过一层分数加1,同时在界面显示分数

       5.游戏失败,界面显示对应信息,同时停止游戏

附:

       代码中涉及到的素材来自异步社区:《Python游戏趣味编程》一书中提供的素材:https://www.epubit.com/bookDetails?id=UB72096d97d6149

以下是代码:

import pgzrun, random

TITLE = '勇闯地下一百层'
WIDTH = 600
HEIGHT = 800

# 导入角色
roles = []
for i in range(10):
    roles.append(Actor(str(i + 1)))
# 初始化显示的角色的图片
role_index = 4
# 初始化角色显示的位置
role_x = WIDTH / 2
role_y1 = HEIGHT / 4
for r in roles:
    r.x = role_x
    r.y = role_y1
# 导入砖块,初始化5个砖块
bricks = []
for i in range(5):
    brick = Actor('brick')
    brick.pos = random.randint(180, 420), 150 * (i + 1)
    bricks.append(brick)

# 移动速度
speed_role = 5  # 角色下降速度
speed_brick = 1  # 砖块上升速度
speed_go = 0  # 角色自身移动的速度
# 游戏是否结束
is_loose = False
# 分数
score = 0
# 角色的上一帧的y坐标
role_y = roles[role_index].y


def draw():
    # 清除游戏画面
    screen.clear()
    screen.fill('white')
    # 绘制角色
    roles[role_index].draw()
    # 绘制砖块
    for bk in bricks:
        bk.draw()
    # 当前得分
    screen.draw.text('当前得分:' + str(score), (200, 750), fontsize=30, fontname='s', color='green')

    if is_loose:
        screen.draw.text('Game Over !', (150, 300), fontsize=50, fontname='s', color='red')


def update():
    global is_loose, speed_role, speed_brick, score, role_y, role_index, role_x, role_y1, speed_go
    # 角色是否站在砖块上
    is_player_on_brick = False
    # 游戏失败直接返回
    if is_loose:
        return

    # 角色和砖块的位置
    for bk in bricks:
        # 砖块重复出现
        if bk.y < 0:
            bk.pos = random.randint(180, 420), HEIGHT
        # 角色是否站在砖块上
        if abs(
                roles[role_index].bottom - bk.top) < 5 and bk.left - roles[role_index].left < roles[
            role_index].width * 2 / 3 and roles[role_index].right - bk.right < roles[role_index].width * 2 / 3:
            is_player_on_brick = True
            # 角色站在砖块上时,角色和砖块一块上移
            for i in range(len(roles)):
                roles[i].bottom = bk.top
            # 得分情况
            if role_y < roles[role_index].y:
                score += 1
            # 角色的移动
            if keyboard.left or keyboard.a:
                # 角色左移,x坐标减4
                role_x -= 4
                # 如果当前显示的角色图片是面朝右显示,则将其置为往左显示
                if role_index < 5:
                    role_index = 4
                for i in range(len(roles)):
                    roles[i].x = role_x
                speed_go += 1
                if speed_go % 4 == 0:
                    role_index += 1
                    if role_index > 9:
                        role_index = 5
            if keyboard.right or keyboard.d:
                # 角色右移,x坐标加4
                role_x += 4
                # 如果当前显示的角色图片是面朝左显示,则将其置为往右显示
                if role_index > 4:
                    role_index = 5
                for i in range(len(roles)):
                    roles[i].x = role_x
                speed_go += 1
                if speed_go % 4 == 0:
                    role_index += 1
                    if role_index > 4:
                        role_index = 0
    # 更新角色上一帧的y坐标
    role_y = roles[role_index].y
    # 如果角色不在任意一块砖上,角色下降
    if not is_player_on_brick:
        roles[role_index].y += speed_role
    # 砖块上移
    for bk in bricks:
        bk.y -= speed_brick
    # 判定游戏失败的条件
    if roles[role_index].top < 0 or roles[role_index].bottom > HEIGHT:
        speed_role = 0
        speed_brick = 0
        is_loose = True


pgzrun.go()

游戏效果:

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是男人就下100游戏源码,经典的flash游戏《是男人就下100》登录win8平台了,支持surface 以及 surface pro, 操作方式支持键盘左右键和触摸操作,该游戏现在android版,ios版已经上线了,但是wp版现在才开发的,喜欢的朋友可以了解一下吧。 项目介绍 这毕竟是个小游戏,本身其实没有什么技术难点,主要在于项目的设计,分为如下几个小模块 1、玩家 (Player) 玩家类我用了单例模式,继承自CCSprite,因为贯穿游戏一直会有玩家存在,在这个版本里也不会有第二个,所以单例成了我很好的选择。 封装了 运动、血量 等。整体的游戏运动采取了背景运动而人不动的方式,感觉在这里这种要更容易掌控一些,分很明显。 2、平台 这里我参照了 Floyd 的Js版本实现,以 BlockBase 作为所有平台游戏的基类,实现了向上运动,检测玩家碰撞,移除平台等基础功能。 然后根据不同的平台类型,继承该基类实现不同效果,比如跳起,伤害,左右平移等。 分别有:NormalBlock (最普通的平台) 、FlipBlock(让人弹跳的平台)、MissBlock(会破损的平台)、ThornBlock(带刺的平台)、LeftRunBlock、RightRunBlock (左右运动的平台) 还有个 BlockFactory 工厂类, 负责在恰当的时候创建合适的平台,创建的规则是随机类型,位置是从预先定义的几个里面随机取。 对于所有平台的管理, 本来最好应该是做个缓存池的,但是我发现这个性能降低实在是可以忽略,所以。。。 3、输入 输入这里,定义了一个基类,InputBase,因为最终肯定有几种输入的方式:PC(键盘、鼠标)、手势、重力感应等,所以这个从一开始就要考虑到。具体的处理方式是 给定一个固定的运动速度, 然后有输入事件的时候就让玩家按照这个速度来运行, 但是现在实际的效果感觉还不太理想。 4、场景 场景就是那么基础的几个了。。。游戏主界面采用了MVC的模式来设计,CCScene 作为 Controller ,其它的Layer 作为View。其它页面都比较简单,单Layer 实现。逻辑也都放在Layer里了。 另外,专门定义了一个 HideLayer ,目的是实现弹出对话框的效果,考虑到原场景中可能会有CCMenu,我将该 Layer 的 优先级设为了 与 CCMenu 相同,因为后添加的原因,所以总能屏蔽 Menu 的事件, 而且在 Layer 上再添加Menu 也不会有问题。 还有个比较有意思的是: 所有的场景我都继承了 IBackableScene 接口,这是我自己定义的一个抽象类,因为我发现对于 “后退” 按钮的处理在游戏中是非常常见的,所以这个接口里定义了 bool GoBack() = 0 函数, 所有需要响应后退事件的场景都要实现该方法,然后在该方法里实现具体的返回 代码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值