成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

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

憶童年!用Python實現(xiàn)憤怒的小鳥游戲

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

開發(fā)工具

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

環(huán)境搭建

安裝Python并添加到環(huán)境變量,pip安裝需要的相關(guān)模塊即可。

原理介紹

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

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

'''按鈕類'''
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)

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

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

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

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

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

游戲界面大概長這樣:

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

'''游戲狀態(tài)'''
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']

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

'''小鳥'''
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
        # 設(shè)置必要的屬性常量
        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)
        # 導(dǎo)入圖像
        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
    '''重新設(shè)置位置'''
    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)
    '''顯示發(fā)射小鳥的路徑'''
    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):
        # 根據(jù)重力改變小鳥的速度向量
        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

實現(xiàn)它主要需要考慮的是小鳥其實存在五種狀態(tài):

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

接著來實現(xiàn)一下小豬:

'''豬'''
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
        # 設(shè)置必要的屬性常量
        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)
        # 導(dǎo)入圖像
        self.pig_images = []
        for imagepath in imagepaths: self.pig_images.append(pygame.image.load(imagepath))
        # 設(shè)置當(dāng)前圖像
        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):
        # 根據(jù)重力改變豬的速度向量
        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]

豬在游戲中主要包括三種狀態(tài):

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

游戲中的木塊實現(xiàn)原理與小豬類似:

''地圖里的木塊'''
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
        # 設(shè)置必要的屬性常量
        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)
        # 導(dǎo)入圖像
        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)
        # 設(shè)置當(dāng)前圖像
        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]))
    '''設(shè)置為損壞狀態(tài)'''
    def setdestroy(self):
        self.is_destroyed = True
        self.image = self.block_images[1]
    '''移動木塊'''
    def move(self):
        # 根據(jù)重力改變木塊的速度向量
        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

最后,我們來實現(xiàn)一下墻和彈弓就可以啦:

'''彈弓'''
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))

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

'''開始游戲'''
def start(self):
    # 導(dǎo)入所有游戲精靈
    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))
    # 游戲主循環(huán)
    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))
        # --判斷游戲是否結(jié)束,若沒有則導(dǎo)入新的小鳥
        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 = []

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

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

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標題《憶童年!用Python實現(xiàn)憤怒的小鳥游戲》,本文關(guān)鍵詞  憶,童年,用,Python,實現(xiàn),憤怒,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《憶童年!用Python實現(xiàn)憤怒的小鳥游戲》相關(guān)的同類信息!
  • 本頁收集關(guān)于憶童年!用Python實現(xiàn)憤怒的小鳥游戲的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    91精品久久久久久| 很黄很a的视频| 久久久天堂av| 久久夜夜操妹子| 亚洲国产一区二区三区a毛片| 香蕉网站在线观看| 亚洲日本成人在线观看| 求av网址在线观看| 欧美一区二区三区激情| 国产在线播放不卡| 欧美一区二区三区四区五区六区| 一区二区在线免费视频| 国产成人精品免费视| 欧美一级专区| 天天草天天爽| 亚洲狠狠爱一区二区三区| 可以看毛片的网址| 日本精品在线观看| 97av视频在线| 国产高清大尺度一区二区不卡| 成人av在线观| 裸模一区二区三区免费| 久久精品女人天堂| 日韩欧美精品一区二区| 成年午夜在线| 欧美精品一区二区蜜桃| 亚洲国产精品嫩草影院久久av| 男人和女人做事情在线视频网站免费观看| 免费羞羞视频网站| 91中文在线视频| 久久久久久九九九九| 成人99免费视频| 久久精品国产一区二区三区不卡| 国产无人区一区二区三区| 久久综合久久久久| 欧美电影免费网站| 午夜精品成人av| 综合国产在线视频| 国产精品极品在线观看| 在线一区电影| 成年人视频网站| 日本亚洲精品| 欧美一级欧美三级| 亚洲欧洲精品一区二区| 亚洲成人电视网| 91精品一久久香蕉国产线看观看| 亚洲天堂一区二区三区四区| 欧美亚洲尤物久久| 中文字幕国产在线| 欧美1区2区| 91在线精品一区二区三区| 免费看美女视频在线网站| 自慰无码一区二区三区| 亚洲人av在线| frxxee中国xxx麻豆hd| 亚洲全黄一级网站| 久久精品ww人人做人人爽| 亚洲 欧美 日韩在线| 精品成人无码久久久久久| 2021国产精品视频| 欧美无遮挡国产欧美另类| 国产高清av片| 日韩精品一区二区三区swag| 久久久99久久| 亚洲一区免费网站| 欧美日韩人妻精品一区在线| av网页在线| 午夜精品婷婷| 老司机色在线视频| 亚洲av永久无码精品| 日韩成人中文电影| 97国产成人高清在线观看| 一区二区三区小视频| 九一免费在线观看| 久久久亚洲国产美女国产盗摄| 日韩一级高清毛片| 精久久久久久| 99久久夜色精品国产亚洲| 欧美日韩国产综合视频在线| 国产精品手机播放| 亚洲 欧美 综合 另类 中字| 国产综合久久| 免费激情小视频| 国产探花视频在线观看| 精品久久人人做人人爰| 狠狠操视频网| 欧美精品videosex性欧美| jizzjizzjizz国产| 国产亚洲久一区二区| 国产一区红桃视频| 欧美精品久久久久久久久46p| 中文在线有码| 免费在线不卡av| 丁香六月激情网| 自拍在线观看| 欧美一区二区三区不卡| 国产精品精品| 国产成人无码www免费视频播放| 成人在色线视频在线观看免费大全| 在线宅男视频| 国产在线播放一区二区三区| 国产乱子伦精品视频| 国产综合在线观看| 日韩福利视频一区| 国产精品免费一区二区三区四区| 综合婷婷亚洲小说| 国产黄色高清在线| 亚洲在线视频一区二区| 全网免费在线播放视频入口| 欧美成年人视频网站| 国产精品日韩久久久| 久久亚洲精品石原莉奈| 国产99久久精品一区二区 夜夜躁日日躁| 天堂俺去俺来也www久久婷婷| 日韩a级作爱片一二三区免费观看| 97精品国产91久久久久久| 欧洲精品一区二区三区| 美女日批在线观看| 亚洲黄色一区二区| 欧美日韩一级黄色片| 欧美精品免费播放| 欧美性受xxxx黑人xyx性爽| 一区二区日韩视频| 2012中文字幕在线视频| 国产精品815.cc红桃| 香蕉免费毛片视频| 欧美一区二区免费| 日本一区视频在线| 欧美牲交a欧美牲交| 亚洲成色777777女色窝| 亚洲制服丝袜在线播放| 91精品视频一区| 青青草手机视频在线观看| 国产www视频| 精品免费国产一区二区| 中文天堂在线一区| 男人天堂网视频| 91久久偷偷做嫩草影院| 蜜臀99久久精品久久久久久软件| 国产免费一区二区| 亚洲人人精品| 久久久无码人妻精品无码| 亚洲精品天堂网| 国产日韩欧美激情| 成人香蕉视频| 91精品办公室少妇高潮对白| 性色视频在线| aa日韩免费精品视频一| 久久精品国产亚洲AV无码男同| 欧美人与性动交α欧美精品| 欧美老女人性开放| 久久久夜夜夜| 欧美一区二区在线视频观看| 色综合天天综合网天天看片| 欧美xxxx中国| 搞黄在线观看| 四虎影院中文字幕| 战狼4完整免费观看在线播放版| 人妻与黑人一区二区三区| 亚洲天堂网在线视频| 精品午夜福利视频| 亚洲综合激情在线| 免费精品国产自产拍观看| 中文字幕无码不卡免费视频| 日韩视频一区在线| 国产精品啪视频| 国产福利资源一区| 欧美一区二区三区婷婷| 日韩毛片在线播放| 久久精品二区亚洲w码| 国产精品萝li| 天堂av中文在线观看| 亚色视频在线观看| 中文字幕一区二区三区视频| 青青草原综合久久大伊人精品| 婷婷福利视频导航| 88在线观看91蜜桃国自产| 日本视频不卡| 精品区在线观看| 久久99久久99精品中文字幕| 欧美电影《睫毛膏》| 九色视频网站| 久久一区亚洲| 欧美极品少妇全裸体| 久久久免费高清视频| av在线这里只有精品| 久久久久成人精品免费播放动漫| 欧美一区二区三区在线看| 国产成人一区二区| 国产精品爱啪在线线免费观看| 成年人在线观看av| 欧美a免费在线| 国产精品不卡在线| www.17c.com喷水少妇| 日韩激情在线播放| 国产精品三级网站| 国产乱国产乱300精品| 成人听书哪个软件好| 91蜜桃网址入口| 色综合久久精品| 国产精品88a∨| 国产在线无码精品| 久久久成人精品视频| 中文字幕一区二区三区四区欧美| av一级在线| 伊人免费在线观看| 中文字幕99页| 中文字幕亚洲情99在线| 精品久久久久久亚洲国产300| 污视频软件在线观看| 国产乱子伦视频一区二区三区| 亚洲高清免费一级二级三级| 91caoporm在线视频| 亚洲欧美日韩不卡| 免费电影网站在线观看| 国产精品久久久久久久久久久免费看| 激情欧美成人久久综合小说| 韩国精品在线观看| 亚洲乱码精品一二三四区日韩在线| 中国特黄一级片| 亚洲成人男人天堂| 日韩欧乱色一区二区三区在线| 久久成人av网站| 国产精品-色哟哟| 欧美激情亚洲综合一区| 一本大道av伊人久久综合| 鲁丝一区鲁丝二区鲁丝三区| 免费观看一区二区三区毛片| 七七久久电影网| 天天躁日日躁成人字幕aⅴ| 看全色黄大色黄大片免责看的| 女人裸体性做爰全过| 亚洲国产精品一区二区久久hs| 一区二区三区黄色| 欧美私人啪啪vps| 在线黄色av网站| 国产无套在线观看| 成人的网站免费观看| 欧美日本高清一区| 国产黄色av网站| 99精品桃花视频在线观看| blackedav金发美女大战黑人| wwwww黄色| 成人有码视频在线播放| 精品国产视频| 国产稀缺真实呦乱在线| 国产同性人妖ts口直男| 在线www天堂网在线| 欧美极品jizzhd欧美仙踪林| 另类小说综合网| 欧美在线高清| 粉嫩虎白女毛片人体| 天堂在线免费观看视频| 狂野欧美性猛交xxxx乱大交| 在线影音av| 日韩免费视频一区二区| 久久av综合网| jlzzjlzz欧美| 91精品久久久久久久久久久久久久| 在线免费观看成人短视频| 另类的小说在线视频另类成人小视频在线| 亚洲欧美一区二区三区久本道91| 国产三级第一页| 777久久久精品| 91久久国产自产拍夜夜嗨| 成人一级生活片| 国产日韩欧美综合精品| 午夜亚洲精品| 成人另类视频| 无码 制服 丝袜 国产 另类| jazzjazz国产精品久久| 亚洲欧洲日本精品| 日韩片电影在线免费观看| 亚洲精品www| av激情成人网| 国新精品乱码一区二区三区18| 亚洲性图自拍| 欧美日韩国产va另类| 99精品一区二区三区无码吞精| 国产黄a三级三级| 国产一级二级三级在线观看| 狠狠色狠狠色合久久伊人| 日韩理论电影| 欧美自拍一区| 欧美tk—视频vk| 成人午夜视频在线观看| 久草在线国产| 欧美三级免费| 色天天综合狠狠色| 欧美精品中文字幕亚洲专区| 国产精品剧情一区二区在线观看| 天天躁日日躁狠狠躁超碰2020| av在线一区不卡| 久久精品欧美日韩| 日韩一区二区中文| 偷拍亚洲色图| 日韩av在线网站| 亚洲欧美在线aaa| 欧美日韩在线观看免费| www.狠狠| 美女视频久久黄| 成人久久电影| 欧美三区在线观看| 波多野结衣xxxx| 国产成人的电影在线观看| 亚洲成人激情小说| 成人伊人222| 毛片免费视频| 比比资源-先锋影音资源站| 精品无码国模私拍视频| 国产精品v亚洲精品v日韩精品| 黄色国产精品一区二区三区| 一级做a爱视频| 中文字幕一区电影| 亚洲国产裸拍裸体视频在线观看乱了| 北条麻妃一区二区三区在线| 男人天堂网在线视频| 欧美高清性hdvideosex| 综合久久av| 三上悠亚一区二区三区| 蜜臀在线免费观看| 91精品国产综合久久香蕉| 99久久精品情趣| 精品少妇人妻av免费久久洗澡| 日韩的一区二区| 欧美人禽zoz0强交| 538任你躁在线精品免费| 一区二区在线观看免费视频|