Python深渊历险记

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

踏板

创建多个踏板

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

py

#创建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

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坐标,让每个踏板的水平位置随机,并且完整显示在窗口中。

角色中心与角色的坐标
Python深渊历险记
踏板x坐标的范围
Python深渊历险记

py

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个踏板造型中随机选择,创建角色。
Python深渊历险记
随机造型的两种方法
Python深渊历险记

踏板的移动

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

py

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

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

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

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

py

b.y = xiaowangzi.y
b.x = xiaowangzi.x + 50

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

嘟嘟在窗口内移动

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

嘟嘟自动下落

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

Python深渊历险记

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

游戏效果完善

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

深渊历险记

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

添加尖刺踏板

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

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

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

py

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

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
那年 • 今日
小王发布于2022-09-15 18:54
没有伞的孩子,必须学会努力奔跑。

赞助 点赞 0