欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

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

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

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

開發(fā)工具

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

環(huán)境搭建

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

原理介紹

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

主要包括兩個(gè)部分,即游戲的標(biāo)題和游戲的開始以及退出按鈕,這兩部分的代碼實(shí)現(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)
    '''是否被鼠標(biāo)選中'''
    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)


'''文字標(biāo)簽類'''
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)

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

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

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

若點(diǎn)擊開始游戲按鈕,則開始游戲:

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

游戲界面大概長(zhǎng)這樣:

玩家獲勝的方法就是操作有限數(shù)量的小鳥將所有入侵的豬干掉,換句話說就是利用彈弓發(fā)射小鳥,讓小鳥擊中場(chǎng)上的所有豬。若小鳥全部發(fā)射完之后場(chǎng)上仍然有豬沒有被擊中,則玩家失敗。判斷游戲勝負(fù)關(guān)系的代碼實(shí)現(xiàn)起來其實(shí)蠻簡(jiǎ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']

接著,為了實(shí)現(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)
    '''判斷有沒有被鼠標(biāo)選中'''
    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))
    '''移動(dòng)小鳥'''
    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

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

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

接著來實(shí)現(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)
    '''移動(dòng)豬'''
    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):

  • 靜止?fàn)顟B(tài),即未被擊中時(shí)靜止在某處的狀態(tài);
  • 被擊中后的運(yùn)動(dòng)狀態(tài),即被其他物體擊中之后根據(jù)動(dòng)量守恒原理也一起運(yùn)行時(shí)的狀態(tài);
  • 被擊中后的靜止?fàn)顟B(tài),即因?yàn)楸粨糁卸a(chǎn)生運(yùn)動(dòng)之后又恢復(fù)靜止時(shí)的狀態(tài)、

游戲中的木塊實(shí)現(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]
    '''移動(dòng)木塊'''
    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

最后,我們來實(shí)現(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))

由此,我們完成了所有游戲精靈的定義,可以開始實(shí)現(xiàn)游戲的主循環(huán)啦,具體的代碼實(shí)現(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:
        # --按鍵檢測(cè)
        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í)就是一些按鍵檢測(cè)和碰撞檢測(cè)以及一些分?jǐn)?shù)之類的游戲狀態(tài)實(shí)時(shí)更新,感覺沒啥好講的,總之,就這么簡(jiǎn)單就完事啦~

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

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《憶童年!用Python實(shí)現(xiàn)憤怒的小鳥游戲》,本文關(guān)鍵詞  憶,童年,用,Python,實(shí)現(xiàn),憤怒,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《憶童年!用Python實(shí)現(xiàn)憤怒的小鳥游戲》相關(guān)的同類信息!
  • 本頁收集關(guān)于憶童年!用Python實(shí)現(xiàn)憤怒的小鳥游戲的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    在线观看黄网址| 日韩欧美色综合网站| 国产情人综合久久777777| 婷婷国产v国产偷v亚洲高清| 91女神在线视频| 色婷婷综合久久| 亚洲色图清纯唯美| 99re亚洲国产精品| 一本大道久久a久久精二百| 国产精品你懂的在线欣赏| 国产精品自在在线| 久久一级免费视频| 国产精品欧美一级免费| 国产精品99久久久久久久女警| 成人在线观看免费高清| 国产日韩精品久久久| 国产精品12区| 蜜桃视频最新网址| 国产精品免费视频网站| 成人免费视频视频在线观看免费 | 日本va欧美va精品| 国精产品一区一区三区免费视频 | 日本黄色一级网站| 欧美视频在线一区| 亚洲国产精品久久不卡毛片| 日本中文字幕有码| 8v天堂国产在线一区二区| 亚洲成年人网站在线观看| 五十路六十路七十路熟婆 | 日批视频在线看| 337p亚洲精品色噜噜| 日本不卡在线视频| 久久久久久久久久久久| 国产偷国产偷亚洲高清人白洁 | 中日韩一级黄色片| 亚洲人吸女人奶水| 一级全黄裸体片| 日韩欧美在线综合网| 极品少妇xxxx偷拍精品少妇| 99成人在线观看| 亚洲美女视频在线观看| av漫画在线观看| 欧美不卡视频一区| 国产成人免费在线视频| 色噜噜狠狠色综合欧洲selulu| 亚洲国产一二三| 小早川怜子久久精品中文字幕| 欧美国产1区2区| 宇都宫紫苑在线播放| 日韩一区二区三区电影在线观看| 国产原创一区二区三区| 国产免费无码一区二区视频| 亚洲国产精品精华液网站| 人妻av无码一区二区三区| 国产精品久久久久精k8| 少妇熟女视频一区二区三区| 欧美精品一区二区三区高清aⅴ| 成人性生交大片| 91精品国产免费久久综合| 国产高清成人在线| 欧美精品在线视频| 国产成人一级电影| 欧美人伦禁忌dvd放荡欲情| 久久精品国产久精国产| 亚洲av鲁丝一区二区三区| 日本视频一区二区| wwwav国产| 蜜臀精品一区二区三区在线观看| 天天天天天天天天操| 天天色天天操综合| 午夜爱爱毛片xxxx视频免费看| 亚洲成av人片一区二区三区| 天堂网中文在线观看| 偷窥少妇高潮呻吟av久久免费| 三级黄色在线观看| 三级久久三级久久| 五月天激情丁香| 久久国产麻豆精品| 欧美三级蜜桃2在线观看| 国产一区二区在线电影| 欧美伦理电影网| 大胆亚洲人体视频| 欧美大片免费久久精品三p| www.欧美日韩国产在线| 精品国产a毛片| 少妇伦子伦精品无吗| 国产精品你懂的| 妺妺窝人体色WWW精品| 亚洲综合久久久| 五月天av网站| 国产一区二区中文字幕| 91精品国产综合久久久久久漫画 | 日本久久一区二区| 国产在线播精品第三| 91精品麻豆日日躁夜夜躁| 99精品国产视频| 国产欧美一区二区三区网站| 一区二区三区免费在线观看视频| 一二三四区精品视频| 亚洲人做受高潮| 精品制服美女丁香| 日韩一区二区免费视频| 国产男女无遮挡猛进猛出| 中文字幕日韩av资源站| eeuss中文字幕| 另类小说色综合网站| 欧美一区二区视频在线观看2022| 99re在线精品| 亚洲同性同志一二三专区| 黄视频网站免费看| 国产成人精品免费| 国产日韩综合av| 91视频免费在观看| 久久成人免费电影| 日韩亚洲欧美一区二区三区| 一级黄色电影片| 亚洲成av人影院| 欧美精品丝袜中出| 精品国产乱码久久久久夜深人妻| 亚洲综合色噜噜狠狠| 一本高清dvd不卡在线观看| 成人激情小说乱人伦| 国产精品国产三级国产三级人妇| 可以免费看av的网址| 国产伦精品一区二区三区视频青涩| 亚洲精品一区二区三区四区高清| 在线免费观看麻豆| 青青草97国产精品免费观看| 91精品国产综合久久精品app| 国产原创剧情av| 五月综合激情婷婷六月色窝| 欧美妇女性影城| 影音先锋资源av| 午夜精品福利久久久| 91精品国产综合久久精品 | 中文字幕人妻一区| 亚洲永久精品国产| 欧美精品一二三| 特大黑人巨人吊xxxx| 日本在线不卡一区| 久久久一区二区| 91制片厂在线| 成人午夜av影视| 亚洲欧美另类小说| 欧美日韩美少妇| 日本xxxx裸体xxxx| 久久精品国产99国产精品| 久久久国际精品| 日韩欧美123区| 佐山爱在线视频| 视频一区中文字幕国产| www国产精品av| 色哟哟一一国产精品| av成人动漫在线观看| 亚洲午夜精品网| 日韩欧美在线综合网| 黄色国产在线播放| www.日韩精品| 天堂va蜜桃一区二区三区漫画版| 精品国产一区二区精华| a一级免费视频| 无码国产精品久久一区免费| 日韩电影在线看| 国产午夜亚洲精品午夜鲁丝片| 三级影片在线观看| 古装做爰无遮挡三级聊斋艳谭| 日韩精品国产欧美| 国产香蕉久久精品综合网| 日本乱人伦一区| 亚洲午夜福利在线观看| 国产成人在线视频播放| 亚洲小少妇裸体bbw| 精品国产成人系列| 一本色道a无线码一区v| 国产激情第一页| 国产成人在线观看免费网站| 亚洲综合色在线| 久久久亚洲综合| 欧美日韩精品欧美日韩精品一| 九色porny自拍视频| 成人精品视频一区二区三区 | 亚洲精品乱码久久久久久久久| 在线电影院国产精品| 一级二级黄色片| 免费黄色av网址| 韩国欧美国产一区| 亚洲综合在线电影| 国产无遮挡一区二区三区毛片日本| 欧美在线观看一二区| 欧美做受高潮6| 91麻豆免费视频| 激情欧美一区二区| 亚洲一级电影视频| 中文无字幕一区二区三区| 91.麻豆视频| 色噜噜狠狠成人网p站| 亚洲自拍偷拍图| 日韩女优在线视频| 成人高清在线视频| 捆绑调教一区二区三区|