首頁 > 軟體

Python實戰之大魚吃小魚遊戲的實現

2022-04-01 13:02:31

一.遊戲畫面

二.遊戲素材

三.程式介紹

大魚吃小魚.py

注意程式的mouth物件,它並不是"隱藏"的,雖然它看不見。

小魚碰到mouth會被“吃掉”。如果把mouth用hide命令設為隱藏,那麼是無法獲取到mouth的繫結盒,從而碰撞檢測失效。

四.遊戲程式碼

1.精靈物件。這個函數計算矩形下右角的一個座標並返回它

from sprites import *

def calculate_pos(obj):
    """obj:精靈物件。這個函數計算矩形下右角的一個座標並返回它。

    """    
    x,y = obj.position()              # 角色的座標
    mx,my = mouse_position()          # 滑鼠指標的座標
    k = 1 if mx > x else -1           # 在右則為1,否則為-1
    left,top,right,bottom = obj.bbox()# 獲取繫結盒
    w = right-left                    # 大魚的寬度
    h = top - bottom                  # 大魚的高度
    x0 = x + k * w//2.5               # 嘴巴大概的x座標
    y0 = y - h//12                    # 嘴巴大概的y座標
    return x0,y0

2.設定遊戲屬性

width,height = 480,360                
screen = Screen()                     # 新建寬高
screen.setup(width,height)            # 設定寬高 
screen.bgpic('res/underwater.png')    # 設背景圖
screen.title("圖靈大海之大魚吃小魚")

3.遊戲物件

fish_group = Group(tag='fish')        # 新建組,標籤為fish
fishes = ['res/fish1.png','res/fish2.png','res/fish3.png','res/crab-b.png']
# 由於下面的魚的標籤都是fish,所以會自動加入到fish_group中
for x in range(10):
     x = random.randint(-200,200)
     y = random.randint(-140,140)
     f = Sprite(shape=random.choice(fishes),tag='fish',pos=(x,y))
     f.scale(0.5)
[fish.setheading(random.randint(1,360)) for fish in fish_group]
 
m1 = Mouse(1)                        # 滑鼠左鍵
fish = Sprite('res/fish1-a.png')     # 範例化大魚
fish.rotatemode(1)                   # 左右翻轉 
fishscale= 0.6
fish.scale(fishscale)
mouth = Sprite(shape='circle')       # 範例化嘴巴,用於碰撞檢測
mouthscale = 0.4
mouth.scale(mouthscale)              # 縮放嘴巴大小
mouth.setalpha(0)                    # 把它設為透明,改為非0它會顯示出來
clock = Clock()                      # 新建時鐘物件

4.遊戲動態效果

while True:
    for f in fish_group:
        if f.isvisible():f.fd(1)     # 在可見的情況下才移動
        # 小魚碰到嘴巴及單擊滑鼠則被吃掉,大魚長大
        if f.collide(mouth,0.5) and m1.down() :
            fishscale += 0.01
            fish.scale(fishscale)     # 大魚長大
            mouthscale += 0.01
            mouth.scale(mouthscale)   # 嘴巴跟著加大
            x = random.randint(-200,200)
            y = random.randint(-140,140)
            # 注意這裡呼叫了reborn後,魚會立即隱藏,3後後出現
            # 在3秒內碰撞檢測無效,所以魚不能動
            f.reborn(x,y,delay=3)
            f.shape(random.choice(fishes))            
        f.bounce_on_edge()
        
    fish.heading(mouse_pos())        # 大魚跟隨滑鼠指標
    x0,y0 = calculate_pos(fish)      # 計算嘴巴的大概座標
    mouth.goto(x0,y0)                # 嘴巴大這個座標 
    md =  fish.distance(mouse_pos()) # 計算魚到滑鼠指標距離
    if md > 50:fish.fd(min(md,4))    # 如果距離大於50則遊

    # 張嘴與合嘴
    if m1.down():
        fish.shape('res/fish1-a.png')
    else:
        fish.shape('res/fish1-b.png')
    screen.update()
    clock.tick(60)
  fish.shape('res/fish1-a.png')
    else:
        fish.shape('res/fish1-b.png')
    screen.update()
    clock.tick(60)

以上就是Python實戰之大魚吃小魚遊戲的實現的詳細內容,更多關於Python大魚吃小魚的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com