Python创意游戏《勇闯BUBU星》

使用pygame实现创意游戏《勇闯BUBU星》

窗口与坐标

游戏效果在Pygame窗口中显示,要把窗口设置成合适的大小。

设置窗口大小

Pygame中,用WIDTH和HEIGHT分别表示窗口的宽和高,设置变量的值,就可以改变窗口大小。

py
<br />
import pgzrun         #先导入pgzrun<br />
WIDTH = 500           #设置窗口的宽<br />
HEIGHT = 700          #设置窗口的高<br />
pgzrun.go()           #写在程序最后,启动Pygame<br />

宽(WIDTH)和高(HEIGHT)变量名的字母都要大写。

窗口的坐标
1 窗口的坐标原点在左上角,坐标为(0, 0)
2 水平方向用x坐标表示,越向右,x坐标越大
竖直方向用y坐标表示,越向下,y坐标越大
3 一对儿x和y坐标,能确定窗口中的一个位置

Actor() 创建角色

Actor()用于创建角色,括号中需要填写一个图片名称,作为角色的造型。

创建角色:Actor()

格式
角色名 = Actor(图片名)

py
<br />
player = Actor('小王子')<br />

使用Actor()首字母A要大写,创建出的角色要存储在一个变量中,比如player。

创建角色,并显示角色

py
<br />
import pgzrun<br />
WIDTH = 500<br />
HEIGHT = 700</p>
<p>#创建角色<br />
player = Actor('小王子')</p>
<p>def draw():<br />
    #显示角色<br />
    player.draw()<br />
pgzrun.go()<br />

总结
Pygame中使用Actor()创建角色,括号中的参数为图片名,数据类型是字符串; 将角色存储在一个变量中,之后可以使用这个变量操作角色。

draw() 窗口绘制

draw()用于在窗口中绘制背景、角色等内容,所有在窗口中显示内容的代码,都需要写在这个函数中。

窗口绘制:draw()

程序会自动调用draw()函数, 只需要定义函数,不需要写调用函数的代码。
def draw():
绘制背景和绘制角色

绘制背景

py
<br />
def draw():<br />
    screen.blit(背景图片, 图片位置)<br />

py
<br />
def draw():<br />
    screen.blit('星球', [0. 0])<br />

绘制角色

py
<br />
def draw():<br />
    角色.draw()<br />

py
<br />
player = Actor('小王子')<br />
def draw():<br />
    player.draw()<br />

on_key_down() 按键控制

on_key_down()可以实现按键控制,当有按键被按下时, 函数就会执行。

按键控制:on_key_down()

有键被按下时,程序自动调用函数,只需要定义。

py
<br />
def on_key_down(key):         #参数key,存储被按下的按键名<br />
    #分别判断key的值,可以实现多按键控制<br />
    if key == 按键1:<br />
        ......<br />
    if key == 按键2:<br />
        ......<br />

侦测按键从抬起到落下,即使一直按住按键,函数也只会执行一次。

Python创意游戏《勇闯BUBU星》

update()更新状态

update是“更新”的意思,游戏运行时,会不断地重复调用update()函数,写在函数中的代码会不断地重复执行。

更新状态:update()

程序会以60次/秒的速度不停地调用update()函数,函数中的代码会不断地重复执行,直到游戏结束。

py
<br />
def update():<br />
    函数体<br />

py
<br />
weapons = []<br />
def draw():<br />
    screen.blit('星球', [0,0])<br />
    player.draw()<br />
    for w in weapons:            #遍历存储所有子弹角色的列表,依次绘制每个子弹<br />
     w.draw()</p>
<p>def on_key_down(key):<br />
    #按下空格键创建子弹角色<br />
    if key == keys.SPACE:<br />
        weapon = Actor('子弹')<br />
        weapon.x = player.x<br />
        weapon.y = player.y<br />
        weapons.append(weapon)</p>
<p>def update():<br />
    #在update()中让每个子弹的y坐标减小5,子弹会一直向上飞<br />
    for w in weapons:<br />
        w.y -= 5<br />

on_key_down()和update()下都可以书写键盘控制的代码。

py
<br />
def on_key_down(key):<br />
    if key == keys.LEFT:<br />
        player.x -= 5<br />
    if key == keys.RIGHT:<br />
        player.y += 5<br />

实现每按下左、右方向键时,角色会对应向左右移动一次。

py
<br />
key == keys.按键<br />

按键 —-> 大写字母

py
<br />
def update():<br />
    if keyboard.left:<br />
        player.x -= 5<br />
    if keyboard.right<br />
        plaer.x += 5<br />

实现每按下左、右方向键时,角色会对应向左右移动,如果按住不放,角色可以连续移动。

py
<br />
keyboard.按键<br />

按键 —-> 小写字母

总结

运行机制
on_key_down()函数,只有按下按键时,会执行一次;
update()函数,在程序启动之后就一直重复执行。

按键判断
on_key_down()函数可以通过参数key来判断哪个按键被按下。
update()函数没有参数,要通过keyboard.键的形式判断。
在update()中实现了通过按住键不放,控制子弹连续发射以及小核桃的连续移动。

BUBU兽的随机重复出现

游戏中,3只BUBU兽从窗口最上方随机位置出现,飞出窗口之后,还会重新回到窗口最上方。

BUBU兽在随机位置出现

py
<br />
bubus = []<br />
for i in range(3):<br />
    b = Actor('bubu')<br />
    b.x = random.randint(0,500)<br />
    bubus.append(b)<br />

创建BUBU兽角色,设置随机的初始位置。
◆ 生成随机数:

py
<br />
random.randint(起始数,结束数)<br />

BUBU兽随机重复地出现

py
<br />
def update():<br />
    for b in bubus:<br />
        if b.y > 700:<br />
            b.x = random.randint(0,500)<br />
            b.y = 0<br />

角色如果飞出边界,就重新设置它的坐标。
◆判断条件: 'b.y > 700'是根据窗口大小,以及要飞出哪个边界来确定的。
实现角色的随机重复移动:先使用random.randint()设置初始位置,再使用if判断坐标,超出范围就重新设置初始坐标。

colliderect()碰撞检测

colliderect()用于判断两个角色是否发生碰撞,如果发生碰撞返回True,没有发生碰撞返回False。

碰撞检测:colliderect()

格式: 角色1.colliderect(角色2)

py
<br />
if hemu.colliderect(xiaohetao):<br />
    print('碰到了~~')<br />

◆colliderect函数的返回值是布尔类型,因此常作为if后的判断条件。
游戏中,BUBU兽碰到子弹后,重新设置BUBU兽的初始坐标。

py
<br />
#bubu兽和子弹碰撞后回到初始位置<br />
for b in bubus:<br />
    for w in weapons:<br />
        if b.colliderect(w):<br />
            b.x = random.randint(0,500)<br />
            b.y = 0<br />

游戏结束

bubu兽碰到了小核桃,游戏结束,小核桃切换失败造型。

设置角色造型

格式:角色.image = 图片名

py
<br />
for b in bubus:<br />
    if b.colliderect(player):<br />
        player.image = '小核桃失败'<br />

◆ 遍历bubus列表,如果bubu兽碰到了小核桃,小核桃切换成失败造型。

游戏结束以后还要清空窗口的子弹角色和bubu兽角色。

py
<br />
def draw():<br />
    screen.blit('星球', pos=[0,0])<br />
    player.draw()</p>
<p>    if player.image != '小核桃失败'<br />
        for w in weapons:<br />
            w.draw()<br />
        for b in bubus:<br />
            b.draw()<br />

◆ 只要小核桃不是失败造型,游戏就没有结束,需要绘制子弹和BUBU兽, 否则就不再绘制了。

背景音乐

pygame中可以使用music模块,给游戏添加音效。让游戏变得更加生动有趣。

播放音乐

py
<br />
music.play(音乐名)<br />

停止播放音乐

py
<br />
music.stop()<br />

游戏启动前,播放音乐,小核桃碰到了bubu兽,音乐停止。

py
<br />
def update():<br />
    for b in bubus:<br />
        if b.colliderect(player):<br />
            player.image = '小核桃失败'<br />
            music.stop()<br />
music.play('music1')<br />
pgzrun.go()<br />

注意:播放音乐的代码需要书写在pgzrun.go()之前。

那年 • 今日
小王于2022-09-12 21:50发布在编程
没有伞的孩子,必须学会努力奔跑。

赞助 点赞 0

淄博**检测等人对本文发表了1条热情洋溢的评论。
  • 淄博**检测学前班
    首评

    感谢分享,赞一个

  • 头像预览

    发表评论

    您的邮箱地址不会被公开, 必填项已用 * 标注

    找回密码

    请输入您的邮箱地址,我们将向您发送重置密码的链接。

    您好,朋友!

    请输入相关信息,以便我们提供更优质的服务!

    欢迎回来!