Python深渊历险记

2022-11-11 20:08:20 浏览数 (1)

通过Python制作游戏《深渊历险记》,体验项目设计与开发的过程,提升问题拆分和项目规划等能力。

踏板

创建多个踏板

使用循环创建5个踏板角色,存储在列表中。

py

代码语言:javascript复制
#创建5个踏板角色
bricks = []
for i in range(5):
    b = Actor('踏板1')
    bricks.append(b)
#使用for循环创建 5个踏板角色,存 入列表bricks

#绘制全部踏板
def draw():
    for b in bricks:
        b.draw()
    #遍历列表,依次绘制全部踏板

让踏板在竖直方向均匀分开显示

py

代码语言:javascript复制
WIDTH = 500
HEIGHT = 700

bricks = []
for i in range(5):
    b = Actor('踏板1')
    b.y = 140 * (i   1)         #将5个踏板的y坐标设为140的1-5倍
    bricks.append(b)

踏板水平位置随机

设置踏板的x坐标,让每个踏板的水平位置随机,并且完整显示在窗口中。

角色中心与角色的坐标

踏板x坐标的范围

py

代码语言:javascript复制
bricks = []
for i in range(5):
    b = Actor('踏板1')
    min_x = b.width // 2
    max_x = WIDTH - b.width // 2
    b.x =random.randint(min_x,max_x)
    b.y = 120*(i   1)
    bricks.append(b)

踏板的随机造型

在3个踏板造型中随机选择,创建角色。

随机造型的两种方法

踏板的移动

通过让踏板不断上升,实现下落的效果。

py

代码语言:javascript复制
def draw():
    screen.blit('背景', [0,0])
    for b in bricks:
        b.draw()
    #遍历列表,依次绘制全部踏板
def update():
    for b in bricks:
        b.y -= 2
    #遍历列表,每次让踏板上升距离2

update()函数会被不断重复调用,程序每调用一次update(),接着就会自动调用一次draw()函数。这样,踏板每次坐标变化以后,都会重新绘制,我们就能看到踏板不断上升的效果了!

踏板的重复利用 让踏板源源不断从窗口下方出现,可以重复使用5个踏板角色,让移出窗口的踏板从窗口最下方重新出现。

当踏板y坐标小于0, 让角色从窗口下方重新出现。

嘟嘟

游戏中,嘟嘟最初是站在中间的那个踏板上。

嘟嘟出现

认识top、bottom、left和right pygame中,可以使用top表示角色图片的顶部,bottom表示底部,left、right分别表示左侧和右侧。 角色.top 表示顶部的y坐标 角色.bottom 表示底部的y坐标 角色.left 表示左侧的x坐标 角色.right 表示右侧的x坐标

出现在中间的踏板上 创建并绘制角色dudu以后,设置dudu的初始位置。

py

代码语言:javascript复制
for i in range(5):
    n = random.randint(1,3)
    b = Actor('brick',   str(n))
    ...
    if i == 2:
        dudu.x = b.x
        dudu.bottom = b.top

当i为2时,b表示的是中间的踏板, 将嘟嘟的x坐标设为踏板的x坐标, 将嘟嘟的bottom(底部)设为踏板的top(顶部)。

嘟嘟跟随踏板移动

游戏中,嘟嘟站在踏板上时,会跟随踏板一起向上移动。 嘟嘟跟随踏板移动

py

代码语言:javascript复制
def update():
    for b in bricks:
        if b.colliderect(dudu):    #判断dudu是否站在踏板上
            dudu.bottom = b.top    #嘟嘟的底部贴着踏板的顶部

角色跟随另一个角色移动 游戏中,要实现一个角色跟随另一个角色移动,只需要找到两个角色之间的位置关系。 球(b)跟随禾木(hemu)的移动

py

代码语言:javascript复制
b.y = xiaowangzi.y
b.x = xiaowangzi.x   50

50: 两个角色中心在同一个水平线上,水平间的距离

嘟嘟在窗口内移动

游戏中,按左右键可以控制嘟嘟左右移动,并且不可以移出窗口左右两侧。

嘟嘟自动下落

使用标志变量,记录嘟嘟的两种状态,站在踏板上悬空。

stand的初始值是“no”,如果嘟嘟碰到了踏板,表示嘟嘟站在了踏板上,我们就改变stand的值为“yes”。

游戏效果完善

完善前 嘟嘟刚要离开时,快速按键,又会碰到踏板,条件成立,所以又会回到踏板上。

完善后 嘟嘟刚要离开时,快速按键,嘟嘟的左侧可以碰到踏板,但是,嘟嘟的底部已经超过了踏板的底部,条件不成立,嘟嘟就不会再回到踏板上。

添加尖刺踏板

安全踏板的名称为:踏板1.png、踏板2.png、踏板3.png。 尖刺踏板的名称为:踏板4.png。

使用随机数创建踏板时,将随机数的范围修改为1-4,角色b的造型就会有可能是踏板4 (尖刺踏板)。

通过update()函数,重置踏板时,将随机数的范围修改为1-4, 重置后的踏板就有可能变为尖刺踏板。

py

代码语言:javascript复制
def = update():
    on_brick = 0
    for b in bricks:
        b.y -= 3
        if b.y < 0:
            n = random.randint(1,4)
            b.image = '踏板'   str(n)
[/code]

游戏开始时,嘟嘟默认站在第3块踏板上。在创建初始踏板时,如果第3块踏板为尖刺踏板,游戏就无法正常进行。
创建初始踏板时,需要将嘟嘟站立的踏板设置为安全踏板,造型名称为:“踏板1”。

创建初始踏板时,将嘟嘟站立位置的踏板的造型设置为“踏板1”。
[code title=py]
bricks = []
for i in range(5):
    n = random.randint(1,4)
    b = Actor('踏板'   str(n))
    min_x = b.width // 2
    max_x = WIDTH - b.width // 2
    b.x = random.randint(min_x, max_x)
    b.y = 140 * (i   1)
    bricks.append(b)
    if i == 2:
        dudu.x = b.x
        dudu.bottom = b.top
        b.image = '踏板1'
[/code]

游戏失败判断
当嘟嘟踩到尖刺踏板时,需要将嘟嘟的造型切换为“嘟嘟哭”。
[code title=py]
def update():
    for b in bricks:
        if dudu.colliderect(b) and dudu.bottom < b.bottom:
            dudu.bottom = b.top
            on_brick = 1
            if b.image == '踏板4':
                dudu.image = '嘟嘟哭'
[/code]
如果嘟嘟站立的踏板是尖刺踏板,就需要将它的造型切换为“嘟嘟哭”当嘟嘟踩到尖刺踏板时,造型切换为“嘟嘟哭”,此时游戏失败。也就是说,只有当嘟嘟的造型为默认造型“嘟嘟”时,游戏才能正常运行。
[code title=py]
def update():
    if dudu.image == '嘟嘟':
        on_brick = 0
        for b in bricks:
            b.y -= 3
            if b.y < 0:
                n = random.randint(1,4)
                b.image = '踏板'   str(n)
                b.y = HEIGHT
                min_x = b.width // 2
                max_x = WIDTH - b.width // 2
                b.x = random.randint(min_x, max_x)
[/code]
当嘟嘟碰到窗口下方时,游戏失败。
dudu.top                      表示角色顶端的y坐标
dudu.y                        表示角色中心点的y坐标
dudu.bottom                   表示角色底端的y坐标
游戏窗口的高度为700,当嘟嘟的底端y坐标大于等于700时, 就表示嘟嘟碰到窗口下方。

计分功能
在《深渊历险记》中,玩家每坚持1秒钟计60分。
update()函数
update()函数每秒钟执行60次。
update()函数每秒钟执行60次,因此 score 的值每秒增大60。

绘制得分
使用 screen.draw.text() 将得分绘制在窗口中。
[code title=py]
score = 0
def draw():
    global score
    score = str(score)                  #将分数转换为字符串类型
    screen.draw.text(score,(20,10))     #将分数绘制在窗口 (20, 10) 的位置

重新开始游戏

玩家按下空格键可以重新开始游戏。 重新开始游戏,就是将分数清零,重新生成5个初始踏板,将嘟嘟切换为初始造型并出现在初始位置。

py

代码语言:javascript复制
def on_key_down(key):
    if key == keys.SPACE and dudu.image = '嘟嘟哭':
        global score, bricks
        dudu.image = '嘟嘟'      #设置角色的初始造型
        bricks = []
        score = 0               #将分数清零
        #生成5块初始踏板
        for i in range(5):
            n = random.randint(1,4)
            b = Actor('踏板'   str(n))
            min_x = b.width // 2
            max_x = WIDTH - b.width // 2
            b.x = random.randint(min_x, max_x)
            b.y = 140 * (i   1)
            bricks.append(b)
            if i == 2:
                b.image = '踏板1'
                #设置角色的初始位置
                dudu.x = b.x
                dudu.bottom = b.top

0 人点赞