婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 憶童年!用Python實現憤怒的小鳥游戲

憶童年!用Python實現憤怒的小鳥游戲

熱門標簽:所得系統電梯怎樣主板設置外呼 市場上的電銷機器人 儋州電話機器人 北京電銷外呼系統加盟 佛山400電話辦理 小蘇云呼電話機器人 北瀚ai電銷機器人官網手機版 朝陽手機外呼系統 地圖標注面積

開發工具

Python版本:3.6.4
相關模塊:
pygame模塊;
以及一些python自帶的模塊。

環境搭建

安裝Python并添加到環境變量,pip安裝需要的相關模塊即可。

原理介紹

這里簡單介紹一下游戲的實現原理唄。首先是游戲的開始界面,大概是長這樣的,比較簡約:

主要包括兩個部分,即游戲的標題和游戲的開始以及退出按鈕,這兩部分的代碼實現如下:

'''按鈕類'''
class Button(pygame.sprite.Sprite):
    def __init__(self, screen, x, y, width, height, action=None, color_not_active=(189, 195, 199), color_active=(189, 195, 199)):
        pygame.sprite.Sprite.__init__(self)
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.action = action
        self.screen = screen
        self.color_active = color_active
        self.color_not_active = color_not_active
    '''添加文字'''
    def addtext(self, text, size=20, font='Times New Roman', color=(0, 0, 0)):
        self.font = pygame.font.Font(font, size)
        self.text = self.font.render(text, True, color)
        self.text_pos = self.text.get_rect()
        self.text_pos.center = (self.x + self.width / 2, self.y + self.height / 2)
    '''是否被鼠標選中'''
    def selected(self):
        pos = pygame.mouse.get_pos()
        if (self.x  pos[0]  self.x + self.width) and (self.y  pos[1]  self.y + self.height):
            return True
        return False
    '''畫到屏幕上'''
    def draw(self):
        if self.selected():
            pygame.draw.rect(self.screen, self.color_active, (self.x, self.y, self.width, self.height))
        else:
            pygame.draw.rect(self.screen, self.color_not_active, (self.x, self.y, self.width, self.height))
        if hasattr(self, 'text'):
            self.screen.blit(self.text, self.text_pos)


'''文字標簽類'''
class Label(pygame.sprite.Sprite):
    def __init__(self, screen, x, y, width, height):
        pygame.sprite.Sprite.__init__(self)
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.screen = screen
    '''添加文字'''
    def addtext(self, text, size=20, font='Times New Roman', color=(0, 0, 0)):
        self.font = pygame.font.Font(font, size)
        self.text = self.font.render(text, True, color)
        self.text_pos = self.text.get_rect()
        self.text_pos.center = (self.x + self.width / 2, self.y + self.height / 2)
    '''畫到屏幕上'''
    def draw(self):
        if hasattr(self, 'text'):
            self.screen.blit(self.text, self.text_pos)

實現起來其實都比較簡單,按鈕類就是多了一個被鼠標選中之后(也就是鼠標的位置落在按鈕的區域范圍內時)改變顏色以直觀地告訴玩家該按鈕已經被選中了的功能。

如果玩家點擊退出鍵(QUIT),則退出游戲:

def quitgame():
    pygame.quit()
    sys.exit()

若點擊開始游戲按鈕,則開始游戲:

def startgame():
    game_levels = GameLevels(cfg, screen)
    game_levels.start()

游戲界面大概長這樣:

玩家獲勝的方法就是操作有限數量的小鳥將所有入侵的豬干掉,換句話說就是利用彈弓發射小鳥,讓小鳥擊中場上的所有豬。若小鳥全部發射完之后場上仍然有豬沒有被擊中,則玩家失敗。判斷游戲勝負關系的代碼實現起來其實蠻簡單的,大概是這樣的:

'''游戲狀態'''
def status(self, pigs, birds):
    status_codes = {
        'gaming': 0,
        'failure': 1,
        'victory': 2,
    }
    if len(pigs) == 0: return status_codes['victory']
    elif len(birds) == 0: return status_codes['failure']
    else: return status_codes['gaming']

接著,為了實現游戲,我們先定義一下所有我們需要的游戲精靈類。首先,是我們的主角,憤怒的小鳥:

'''小鳥'''
class Bird(pygame.sprite.Sprite):
    def __init__(self, screen, imagepaths, loc_info, velocity=None, color=(255, 255, 255), **kwargs):
        pygame.sprite.Sprite.__init__(self)
        assert len(loc_info) == 3
        assert len(imagepaths) == 1
        # 設置必要的屬性常量
        self.color = color
        self.screen = screen
        self.loc_info = list(loc_info)
        self.imagepaths = imagepaths
        self.velocity = VelocityVector() if velocity is None else velocity
        self.type = 'bird'
        self.fly_path = []
        self.is_dead = False
        self.elasticity = 0.8
        self.is_loaded = False
        self.is_selected = False
        self.inverse_friction = 0.99
        self.gravity = VelocityVector(0.2, math.pi)
        # 屏幕大小
        self.screen_size = screen.get_rect().size
        self.screen_size = (self.screen_size[0], self.screen_size[1] - 50)
        # 導入圖像
        self.image = pygame.image.load(imagepaths[0])
    '''畫到屏幕上'''
    def draw(self):
        if not self.is_loaded:
            for point in self.fly_path:
                pygame.draw.ellipse(self.screen, self.color, (point[0], point[1], 3, 3), 1)
        position = self.loc_info[0] - self.loc_info[2], self.loc_info[1] - self.loc_info[2]
        self.screen.blit(self.image, position)
    '''判斷有沒有被鼠標選中'''
    def selected(self):
        pos = pygame.mouse.get_pos()
        dx, dy = pos[0] - self.loc_info[0], pos[1] - self.loc_info[1]
        dist = math.hypot(dy, dx)
        if dist  self.loc_info[2]:
            return True
        return False
    '''加載到彈弓上'''
    def load(self, slingshot):
        self.loc_info[0], self.loc_info[1] = slingshot.x, slingshot.y
        self.is_loaded = True
    '''重新設置位置'''
    def reposition(self, slingshot):
        pos = pygame.mouse.get_pos()
        if self.selected:
            self.loc_info[0], self.loc_info[1] = pos[0], pos[1]
            dx, dy = slingshot.x - self.loc_info[0], slingshot.y - self.loc_info[1]
            self.velocity.magnitude = min(int(math.hypot(dx, dy) / 2), 80)
            self.velocity.angle = math.pi / 2 + math.atan2(dy, dx)
    '''顯示發射小鳥的路徑'''
    def projectpath(self):
        if self.is_loaded:
            path = []
            bird = Bird(self.screen, self.imagepaths, self.loc_info, velocity=self.velocity)
            for i in range(30):
                bird.move()
                if i % 5 == 0: path.append((bird.loc_info[0], bird.loc_info[1]))
            for point in path:
                pygame.draw.ellipse(self.screen, self.color, (point[0], point[1], 2, 2))
    '''移動小鳥'''
    def move(self):
        # 根據重力改變小鳥的速度向量
        self.velocity = VectorAddition(self.velocity, self.gravity)
        self.loc_info[0] += self.velocity.magnitude * math.sin(self.velocity.angle)
        self.loc_info[1] -= self.velocity.magnitude * math.cos(self.velocity.angle)
        self.velocity.magnitude *= self.inverse_friction
        # 寬度超出屏幕
        if self.loc_info[0] > self.screen_size[0] - self.loc_info[2]:
            self.loc_info[0] = 2 * (self.screen_size[0] - self.loc_info[2]) - self.loc_info[0]
            self.velocity.angle *= -1
            self.velocity.magnitude *= self.elasticity
        elif self.loc_info[0]  self.loc_info[2]:
            self.loc_info[0] = 2 * self.loc_info[2] - self.loc_info[0]
            self.velocity.angle *= -1
            self.velocity.magnitude *= self.elasticity
        # 高度超出屏幕
        if self.loc_info[1] > self.screen_size[1] - self.loc_info[2]:
            self.loc_info[1] = 2 * (self.screen_size[1] - self.loc_info[2]) - self.loc_info[1]
            self.velocity.angle = math.pi - self.velocity.angle
            self.velocity.magnitude *= self.elasticity
        elif self.loc_info[1]  self.loc_info[2]:
            self.loc_info[1] = 2 * self.loc_info[2] - self.loc_info[1]
            self.velocity.angle = math.pi - self.velocity.angle
            self.velocity.magnitude *= self.elasticity

實現它主要需要考慮的是小鳥其實存在五種狀態:

  • 排隊狀態,即在左下角等待進入彈弓時的狀態,靜止不動即可;
  • 就緒狀態,即進入彈弓準備被發射的狀態,其需要跟著鼠標不斷地移動,使得玩家知道自己目前調整小鳥所到的位置被發射出去之后大概會是 什么樣的角度和路徑;
  • 飛行狀態,即被彈弓發射出去之后的狀態,需要根據重力和小鳥的初速度來計算其飛行路徑并不斷地移動;
  • 碰撞狀態,即在飛行過程中撞擊到其他物體例如小豬和木樁等時,運動狀態發生了改變;
  • 靜止狀態,即小鳥完成飛行狀態之后最終靜止時的狀態。

接著來實現一下小豬:

'''豬'''
class Pig(pygame.sprite.Sprite):
    def __init__(self, screen, imagepaths, loc_info, velocity=None, **kwargs):
        pygame.sprite.Sprite.__init__(self)
        assert len(loc_info) == 3
        assert len(imagepaths) == 3
        # 設置必要的屬性常量
        self.screen = screen
        self.loc_info = list(loc_info)
        self.imagepaths = imagepaths
        self.velocity = VelocityVector() if velocity is None else velocity
        self.type = 'pig'
        self.is_dead = False
        self.elasticity = 0.8
        self.switch_freq = 20
        self.animate_count = 0
        self.inverse_friction = 0.99
        self.gravity = VelocityVector(0.2, math.pi)
        # 屏幕大小
        self.screen_size = screen.get_rect().size
        self.screen_size = (self.screen_size[0], self.screen_size[1] - 50)
        # 導入圖像
        self.pig_images = []
        for imagepath in imagepaths: self.pig_images.append(pygame.image.load(imagepath))
        # 設置當前圖像
        self.image = random.choice(self.pig_images[:2])
    '''畫到屏幕上'''
    def draw(self):
        self.animate_count += 1
        if (self.animate_count % self.switch_freq == 0) and (not self.is_dead):
            self.animate_count = 0
            self.image = random.choice(self.pig_images[:2])
        position = self.loc_info[0] - self.loc_info[2], self.loc_info[1] - self.loc_info[2]
        self.screen.blit(self.image, position)
    '''移動豬'''
    def move(self):
        # 根據重力改變豬的速度向量
        self.velocity = VectorAddition(self.velocity, self.gravity)
        self.loc_info[0] += self.velocity.magnitude * math.sin(self.velocity.angle)
        self.loc_info[1] -= self.velocity.magnitude * math.cos(self.velocity.angle)
        self.velocity.magnitude *= self.inverse_friction
        # 寬度超出屏幕
        if self.loc_info[0] > self.screen_size[0] - self.loc_info[2]:
            self.loc_info[0] = 2 * (self.screen_size[0] - self.loc_info[2]) - self.loc_info[0]
            self.velocity.angle *= -1
            self.velocity.magnitude *= self.elasticity
        elif self.loc_info[0]  self.loc_info[2]:
            self.loc_info[0] = 2 * self.loc_info[2] - self.loc_info[0]
            self.velocity.angle *= -1
            self.velocity.magnitude *= self.elasticity
        # 高度超出屏幕
        if self.loc_info[1] > self.screen_size[1] - self.loc_info[2]:
            self.loc_info[1] = 2 * (self.screen_size[1] - self.loc_info[2]) - self.loc_info[1]
            self.velocity.angle = math.pi - self.velocity.angle
            self.velocity.magnitude *= self.elasticity
        elif self.loc_info[1]  self.loc_info[2]:
            self.loc_info[1] = 2 * self.loc_info[2] - self.loc_info[1]
            self.velocity.angle = math.pi - self.velocity.angle
            self.velocity.magnitude *= self.elasticity
    '''豬死掉了'''
    def setdead(self):
        self.is_dead = True
        self.image = self.pig_images[-1]

豬在游戲中主要包括三種狀態:

  • 靜止狀態,即未被擊中時靜止在某處的狀態;
  • 被擊中后的運動狀態,即被其他物體擊中之后根據動量守恒原理也一起運行時的狀態;
  • 被擊中后的靜止狀態,即因為被擊中而產生運動之后又恢復靜止時的狀態、

游戲中的木塊實現原理與小豬類似:

''地圖里的木塊'''
class Block(pygame.sprite.Sprite):
    def __init__(self, screen, imagepaths, loc_info, velocity=None, **kwargs):
        pygame.sprite.Sprite.__init__(self)
        assert len(loc_info) == 3
        assert len(imagepaths) == 2
        # 設置必要的屬性常量
        self.type = 'block'
        self.screen = screen
        self.loc_info = list(loc_info)
        self.imagepaths = imagepaths
        self.velocity = VelocityVector() if velocity is None else velocity
        self.elasticity = 0.7
        self.is_destroyed = False
        self.inverse_friction = 0.99
        self.gravity = VelocityVector(0.2, math.pi)
        # 導入圖像
        self.block_images = []
        for imagepath in imagepaths: self.block_images.append(pygame.transform.scale(pygame.image.load(imagepath), (100, 100)))
        # 屏幕大小
        self.screen_size = screen.get_rect().size
        self.screen_size = (self.screen_size[0], self.screen_size[1] - 50)
        # 設置當前圖像
        self.image = self.block_images[0]
        self.rect = self.image.get_rect()
        self.rotate_angle = math.radians(0)
    '''畫到屏幕上'''
    def draw(self):
        pygame.transform.rotate(self.image, self.rotate_angle)
        self.screen.blit(self.image, (self.loc_info[0] - self.rect.width // 2, self.loc_info[1]))
    '''設置為損壞狀態'''
    def setdestroy(self):
        self.is_destroyed = True
        self.image = self.block_images[1]
    '''移動木塊'''
    def move(self):
        # 根據重力改變木塊的速度向量
        self.velocity = VectorAddition(self.velocity, self.gravity)
        self.loc_info[0] += self.velocity.magnitude * math.sin(self.velocity.angle)
        self.loc_info[1] -= self.velocity.magnitude * math.cos(self.velocity.angle)
        self.velocity.magnitude *= self.inverse_friction
        # 寬度超出屏幕
        if self.loc_info[0] > self.screen_size[0] - self.rect.width:
            self.loc_info[0] = 2 * (self.screen_size[0] - self.rect.width) - self.loc_info[0]
            self.velocity.angle *= -1
            self.rotate_angle = -self.velocity.angle
            self.velocity.magnitude *= self.elasticity
        elif self.loc_info[0]  self.rect.width:
            self.loc_info[0] = 2 * self.rect.width - self.loc_info[0]
            self.velocity.angle *= -1
            self.rotate_angle = -self.velocity.angle
            self.velocity.magnitude *= self.elasticity
        # 高度超出屏幕
        if self.loc_info[1] > self.screen_size[1] - self.rect.height:
            self.loc_info[1] = 2 * (self.screen_size[1] - self.rect.height) - self.loc_info[1]
            self.velocity.angle = math.pi - self.velocity.angle
            self.rotate_angle = math.pi - self.velocity.angle
            self.velocity.magnitude *= self.elasticity
        elif self.loc_info[1]  self.rect.height:
            self.loc_info[1] = 2 * self.rect.height - self.loc_info[1]
            self.velocity.angle = math.pi - self.velocity.angle
            self.rotate_angle = math.pi - self.velocity.angle
            self.velocity.magnitude *= self.elasticity

最后,我們來實現一下墻和彈弓就可以啦:

'''彈弓'''
class Slingshot(pygame.sprite.Sprite):
    def __init__(self, screen, x, y, width, height, color=(66, 73, 73), line_color=(100, 30, 22), **kwargs):
        pygame.sprite.Sprite.__init__(self)
        self.x = x
        self.y = y
        self.color = color
        self.width = width
        self.height = height
        self.screen = screen
        self.line_color = line_color
        self.type = 'slingshot'
    '''畫到屏幕上'''
    def draw(self, bird=None):
        pygame.draw.rect(self.screen, self.color, (self.x, self.y + self.height * 1 / 3, self.width, self.height * 2 / 3))
        if bird is not None and bird.is_loaded:
            pygame.draw.line(self.screen, self.line_color, (self.x, self.y + self.height / 6), (bird.loc_info[0], bird.loc_info[1] + bird.loc_info[2] / 2), 10)
            pygame.draw.line(self.screen, self.line_color, (self.x + self.width, self.y + self.height / 6), (bird.loc_info[0] + bird.loc_info[2], bird.loc_info[1] + bird.loc_info[2] / 2), 10)
        pygame.draw.rect(self.screen, self.color, (self.x - self.width / 4, self.y, self.width / 2, self.height / 3), 5)
        pygame.draw.rect(self.screen, self.color, (self.x + self.width * 3 / 4, self.y, self.width / 2, self.height / 3), 5)


'''墻'''
class Slab(pygame.sprite.Sprite):
    def __init__(self, screen, imagepaths, x, y, width, height, color=(255, 255, 255)):
        pygame.sprite.Sprite.__init__(self)
        self.x = x
        self.y = y
        self.color = color
        self.width = width
        self.height = height
        self.screen = screen
        self.imagepaths = imagepaths
        if self.width > self.height:
            self.image = pygame.image.load(self.imagepaths[0])
        else:
            self.image = pygame.image.load(self.imagepaths[1])
        self.image = pygame.transform.scale(self.image, (self.width, self.height))
        self.type = 'wall'
    '''畫到屏幕上'''
    def draw(self):
        self.screen.blit(self.image, (self.x, self.y))

由此,我們完成了所有游戲精靈的定義,可以開始實現游戲的主循環啦,具體的代碼實現如下:

'''開始游戲'''
def start(self):
    # 導入所有游戲精靈
    game_sprites = self.loadlevelmap()
    birds, pigs, blocks, walls = game_sprites['birds'], game_sprites['pigs'], game_sprites['blocks'], game_sprites['walls']
    slingshot = Slingshot(self.screen, 200, self.screen_size[1] - 200, 30, 200)
    birds[0].load(slingshot)
    score_label = Label(self.screen, 50, 10, 100, 50)
    score_label.addtext(f'SCORE: {self.score}', 25, self.cfg.FONTPATH['Comic_Kings'], (236, 240, 241))
    birds_remaining_label = Label(self.screen, 120, 50, 100, 50)
    birds_remaining_label.addtext(f"BIRDS REMAINING: {len(birds)}", 25, self.cfg.FONTPATH['Comic_Kings'], (236, 240, 241))
    pigs_remaining_label = Label(self.screen, 110, 90, 100, 50)
    pigs_remaining_label.addtext(f"PIGS REMAINING: {len(pigs)}", 25, self.cfg.FONTPATH['Comic_Kings'], (236, 240, 241))
    carles_label = Label(self.screen, self.screen_size[0] - 270, self.screen_size[1] - 20, 300, 100)
    carles_label.addtext('CARLES', 60, self.cfg.FONTPATH['arfmoochikncheez'], (113, 125, 126))
    # 游戲主循環
    clock = pygame.time.Clock()
    blocks_to_remove, pigs_to_remove = [], []
    while True:
        # --按鍵檢測
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.quitgame()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_q:
                    self.quitgame()
                elif event.key == pygame.K_r:
                    self.start()
                elif event.key == pygame.K_p or event.key == pygame.K_ESCAPE:
                    self.pauseinterface()
            elif event.type == pygame.MOUSEBUTTONDOWN:
                if birds[0].selected():
                    birds[0].is_selected = True
            elif event.type == pygame.MOUSEBUTTONUP:
                if birds[0].is_selected:
                    birds[0].is_selected = False
                    birds[0].start_flying = True
        # --背景顏色填充
        color = self.cfg.BACKGROUND_COLOR
        for i in range(3):
            color = (color[0] + 5, color[1] + 5, color[2] + 5)
            pygame.draw.rect(self.screen, color, (0, i * 300, self.screen_size[0], 300))
        pygame.draw.rect(self.screen, (77, 86, 86), (0, self.screen_size[1], self.screen_size[0], 50))
        # --判斷游戲是否結束,若沒有則導入新的小鳥
        if (not birds[0].is_loaded) and self.still(pigs + birds + blocks):
            birds.pop(0)
            if self.status(pigs, birds) == 2:
                self.score += len(birds) * 100
                self.switchlevelinterface()
            elif self.status(pigs, birds) == 1:
                self.failureinterface()
            birds[0].load(slingshot)
            birds[0].start_flying = False
        # --重置小鳥的位置
        if birds[0].is_selected:
            birds[0].reposition(slingshot)
        if hasattr(birds[0], 'start_flying') and birds[0].start_flying:
            birds[0].is_loaded = False
        # --彈弓
        slingshot.draw(birds[0])
        # --判斷豬是否撞上木樁
        for i in range(len(pigs)):
            for j in range(len(blocks)):
                pig_magnitude_1, block_magnitude_1 = pigs[i].velocity.magnitude, blocks[j].velocity.magnitude
                pigs[i], blocks[j], is_collision = self.collision(pigs[i], blocks[j])
                pig_magnitude_2, block_magnitude_2 = pigs[i].velocity.magnitude, blocks[j].velocity.magnitude
                if is_collision:
                    if abs(pig_magnitude_2 - pig_magnitude_2) > 2:
                        blocks_to_remove.append(blocks[j])
                        blocks[j].setdestroy()
                    if abs(block_magnitude_2 - block_magnitude_1) > 2:
                        pigs_to_remove.append(pigs[i])
                        pigs[i].setdead()
        # --判斷鳥是否撞上木樁
        for i in range(len(birds)):
            if not (birds[i].is_loaded or birds[i].velocity.magnitude == 0):
                for j in range(len(blocks)):
                    bird_magnitude_1, block_magnitude_1 = birds[i].velocity.magnitude, blocks[j].velocity.magnitude
                    birds[i], blocks[j], is_collision = self.collision(birds[i], blocks[j])
                    bird_magnitude_2, block_magnitude_2 = birds[i].velocity.magnitude, blocks[j].velocity.magnitude
                    if is_collision:
                        if abs(bird_magnitude_1 - bird_magnitude_2) > 2:
                            if blocks[j] not in blocks_to_remove:
                                blocks_to_remove.append(blocks[j])
                                blocks[j].setdestroy()
        # --判斷豬是否撞上豬或者豬撞墻
        for i in range(len(pigs)):
            pigs[i].move()
            for j in range(i+1, len(pigs)):
                pig1_magnitude_1, pig2_magnitude_1 = pigs[i].velocity.magnitude, pigs[j].velocity.magnitude
                pigs[i], pigs[j], is_collision = self.collision(pigs[i], pigs[j])
                pig1_magnitude_2, pig2_magnitude_2 = pigs[i].velocity.magnitude, pigs[j].velocity.magnitude
                if abs(pig1_magnitude_1 - pig1_magnitude_2) > 2:
                    if pigs[j] not in pigs_to_remove:
                        pigs_to_remove.append(pigs[j])
                        pigs[j].setdead()
                if abs(pig2_magnitude_1 - pig2_magnitude_2) > 2:
                    if pigs[i] not in pigs_to_remove:
                        pigs_to_remove.append(pigs[i])
                        pigs[i].setdead()
            for wall in walls: pigs[i] = self.collision(pigs[i], wall)[0]
            pigs[i].draw()
        # --判斷鳥是否撞到豬或者鳥是否撞到墻
        for i in range(len(birds)):
            if (not birds[i].is_loaded) and (birds[i].velocity.magnitude):
                birds[i].move()
                for j in range(len(pigs)):
                    bird_magnitude_1, pig_magnitude_1 = birds[i].velocity.magnitude, pigs[j].velocity.magnitude
                    birds[i], pigs[j], is_collision = self.collision(birds[i], pigs[j])
                    bird_magnitude_2, pig_magnitude_2 = birds[i].velocity.magnitude, pigs[j].velocity.magnitude
                    if is_collision:
                        if abs(bird_magnitude_2 - bird_magnitude_1) > 2:
                            if pigs[j] not in pigs_to_remove:
                                pigs_to_remove.append(pigs[j])
                                pigs[j].setdead()
            if birds[i].is_loaded: birds[i].projectpath()
            for wall in walls: birds[i] = self.collision(birds[i], wall)[0]
            birds[i].draw()
        # --判斷木樁是否撞到了木樁或者木樁撞到墻
        for i in range(len(blocks)):
            for j in range(i+1, len(blocks)):
                block1_magnitude_1, block2_magnitude_1 = blocks[i].velocity.magnitude, blocks[j].velocity.magnitude
                blocks[i], blocks[j], is_collision = self.collision(blocks[i], blocks[j])
                block1_magnitude_2, block2_magnitude_2 = blocks[i].velocity.magnitude, blocks[j].velocity.magnitude
                if is_collision:
                    if abs(block1_magnitude_2 - block1_magnitude_1) > 2:
                        if blocks[j] not in blocks_to_remove:
                            blocks_to_remove.append(blocks[j])
                            blocks[j].setdestroy()
                    if abs(block2_magnitude_2 - block2_magnitude_1) > 2:
                        if blocks[i] not in blocks_to_remove:
                            blocks_to_remove.append(blocks[i])
                            blocks[i].setdestroy()
            blocks[i].move()
            for wall in walls: blocks[i] = self.collision(blocks[i], wall)[0]
            blocks[i].draw()
        # --墻
        for wall in walls: wall.draw()
        # --顯示文字
        score_label.addtext(f'SCORE: {self.score}', 25, self.cfg.FONTPATH['Comic_Kings'], (236, 240, 241))
        score_label.draw()
        birds_remaining_label.addtext(f"BIRDS REMAINING: {len(birds)}", 25, self.cfg.FONTPATH['Comic_Kings'], (236, 240, 241))
        birds_remaining_label.draw()
        pigs_remaining_label.addtext(f"PIGS REMAINING: {len(pigs)}", 25, self.cfg.FONTPATH['Comic_Kings'], (236, 240, 241))
        pigs_remaining_label.draw()
        carles_label.draw()
        # --畫面刷新
        pygame.display.update()
        clock.tick(self.cfg.FPS)
        # --刪除無效的元素
        if self.still(birds + pigs + blocks):
            for pig in pigs_to_remove:
                if pig in pigs:
                    pigs.remove(pig)
                    self.score += 100
            for block in blocks_to_remove:
                if block in blocks:
                    blocks.remove(block)
                    self.score += 50
            pigs_to_remove = []
            blocks_to_remove = []

其實就是一些按鍵檢測和碰撞檢測以及一些分數之類的游戲狀態實時更新,感覺沒啥好講的,總之,就這么簡單就完事啦~

到此這篇關于憶童年!用Python實現憤怒的小鳥游戲的文章就介紹到這了,更多相關Python憤怒的小鳥內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python游戲開發的五個案例分享
  • 總結Python圖形用戶界面和游戲開發知識點
  • python游戲開發之視頻轉彩色字符動畫
  • 你喜歡籃球嗎?Python實現籃球游戲
  • 使用python+pygame開發消消樂游戲附完整源碼
  • python用tkinter開發的掃雷游戲
  • Python實現簡單2048小游戲
  • 學會用Python實現滑雪小游戲,再也不用去北海道啦
  • 教你用Python實現一個輪盤抽獎小游戲
  • python實戰之利用pygame實現貪吃蛇游戲(二)
  • python實戰之利用pygame實現貪吃蛇游戲(一)
  • python使用pgzero進行游戲開發

標簽:金融催收 江蘇 酒泉 寧夏 商丘 云南 定西 龍巖

巨人網絡通訊聲明:本文標題《憶童年!用Python實現憤怒的小鳥游戲》,本文關鍵詞  憶,童年,用,Python,實現,憤怒,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《憶童年!用Python實現憤怒的小鳥游戲》相關的同類信息!
  • 本頁收集關于憶童年!用Python實現憤怒的小鳥游戲的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲欧洲国产专区| 国产精品久久午夜夜伦鲁鲁| 91免费观看在线| 欧美日韩综合在线免费观看| 99久久综合99久久综合网站| av网站免费线看精品| 99久久夜色精品国产网站| 色综合天天综合网天天看片| 91精品1区2区| 99久久国产综合色|国产精品| 91网站在线观看视频| 91传媒视频在线播放| 欧美一区二区三区视频| 欧美成人在线直播| 国产精品久久久久久久蜜臀| 日韩美女精品在线| 青椒成人免费视频| 成人黄色av电影| 欧美日韩精品一区二区三区| 日韩欧美亚洲国产另类| 国产精品美女一区二区| 亚洲国产成人av| 国产精品资源站在线| 欧洲色大大久久| 国产亚洲午夜高清国产拍精品| 国产精品免费视频网站| 午夜久久久久久久久| 成人免费毛片片v| 欧美一区二区在线播放| 中文字幕亚洲一区二区va在线| 亚洲成av人片在线| 国产91丝袜在线播放九色| 69精品人人人人| 尤物视频一区二区| 成人午夜激情片| 久久网这里都是精品| 亚洲bt欧美bt精品777| 99久久精品费精品国产一区二区| jizz一区二区| 91麻豆福利精品推荐| 欧美精品高清视频| 中文字幕一区二区视频| 久久成人av少妇免费| 久久久亚洲午夜电影| 亚洲一区二区四区蜜桃| 成人h动漫精品一区二区| 久久综合一区二区| 久久99精品视频| 精品久久久久av影院| 美女网站一区二区| 欧美第一区第二区| 九一久久久久久| 亚洲精品一区二区三区四区高清| 男女男精品视频| 日韩视频一区二区在线观看| 亚洲123区在线观看| 欧美一区二区三区在线观看视频| 亚洲成人1区2区| 精品福利一区二区三区| 国产精品夜夜嗨| 亚洲日穴在线视频| 欧美三级电影一区| 日韩电影免费在线看| 2021国产精品久久精品| 国产成人综合在线播放| 一区在线观看视频| 欧美精选在线播放| 国产一区二区在线观看免费| 中文字幕 久热精品 视频在线| 国产91在线看| 日韩激情av在线| 中文字幕免费在线观看视频一区| 风间由美一区二区三区在线观看 | 26uuu成人网一区二区三区| 国产美女视频一区| 欧美一级一级性生活免费录像| 五月婷婷综合在线| 亚洲国产高清不卡| 51精品国自产在线| 99久久777色| 国产在线精品一区二区不卡了| 亚洲视频你懂的| 久久久久久**毛片大全| 欧美日韩电影一区| 色综合天天综合网国产成人综合天| 日韩高清不卡一区| 亚洲一区二区三区自拍| 久久久www免费人成精品| 91精品国产福利| 欧美日韩一区高清| 91色综合久久久久婷婷| 国产乱妇无码大片在线观看| 亚洲国产精品一区二区尤物区| 欧美极品少妇xxxxⅹ高跟鞋| 欧美一卡2卡三卡4卡5免费| 亚洲色图欧美激情| 色哟哟在线观看一区二区三区| 精品无码三级在线观看视频| 午夜欧美视频在线观看| 有码一区二区三区| 一区二区三区四区蜜桃| 亚洲精品免费播放| 国产精品夫妻自拍| 亚洲免费在线电影| 一区二区三区日韩精品视频| 亚洲欧洲av另类| 亚洲欧美激情视频在线观看一区二区三区| 国产视频不卡一区| 综合亚洲深深色噜噜狠狠网站| 日本一区二区综合亚洲| 国产精品麻豆欧美日韩ww| 中文字幕亚洲成人| 亚洲成a人片综合在线| 婷婷激情综合网| 久久精品国产亚洲a| 国产麻豆91精品| 99热精品国产| 欧美性猛交xxxx黑人交| 欧美一区二区三区小说| 26uuu国产一区二区三区| 中文字幕第一区综合| 亚洲国产va精品久久久不卡综合| 亚洲高清免费视频| 狠狠色丁香久久婷婷综合丁香| 波多野结衣一区二区三区| 色婷婷av一区二区| 精品黑人一区二区三区久久| 久久影音资源网| 亚洲黄色小视频| 久久99精品国产麻豆婷婷洗澡| 国产aⅴ精品一区二区三区色成熟| 成人av网在线| 精品伦理精品一区| 亚洲综合激情另类小说区| 国产精品一线二线三线精华| 欧美日韩国产精品成人| 国产精品国产三级国产三级人妇| 亚洲aⅴ怡春院| 91在线观看成人| 国产欧美一区二区精品性色超碰| 性做久久久久久| av电影一区二区| 欧美精品一区二区三区蜜臀| 一区二区三区视频在线观看| 国产麻豆精品theporn| 在线电影院国产精品| 亚洲精品午夜久久久| 国产91丝袜在线播放0| 久久天天做天天爱综合色| 午夜精品久久久久久不卡8050| 一本久久a久久免费精品不卡| 久久蜜桃av一区精品变态类天堂| 午夜精品久久久久久久99樱桃| 99麻豆久久久国产精品免费| 中文字幕五月欧美| av在线不卡免费看| 中文字幕一区二区在线观看| 成人性生交大片免费看中文| 久久久一区二区三区| 国产精一品亚洲二区在线视频| 欧美成人r级一区二区三区| 精品一区二区三区免费视频| 日韩一区二区视频| 韩国三级中文字幕hd久久精品| 日韩精品影音先锋| 国产精品99久久久| 国产精品久久久久久一区二区三区 | 国产精品传媒视频| 亚洲国产一二三| 91亚洲精品久久久蜜桃网站| 亚洲人亚洲人成电影网站色| 色婷婷亚洲精品| 久久成人羞羞网站| 国产精品婷婷午夜在线观看| 91免费国产视频网站| 午夜伊人狠狠久久| 久久先锋影音av鲁色资源网| 成人一区二区三区中文字幕| 亚洲美女屁股眼交| 欧美成人一区二区三区在线观看| 国产一区美女在线| 亚洲精品视频免费看| 久久影院视频免费| 欧美日韩久久久久久| 粉嫩av亚洲一区二区图片| 亚洲综合丝袜美腿| 国产视频不卡一区| 欧美一区二区三级| 色哟哟在线观看一区二区三区| 免费观看日韩电影| 亚洲一二三区不卡| 亚洲天堂2016| 国产女人水真多18毛片18精品视频 | 成人性色生活片| 午夜精品久久久久久久蜜桃app| 欧美精品一区二| 日韩欧美一级在线播放| 99vv1com这只有精品| 成人亚洲精品久久久久软件| 精品一区二区三区av|