通过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