開(kāi)發(fā)工具
Python版本:3.6.4
相關(guān)模塊:
pygame模塊;
以及一些python自帶的模塊。
環(huán)境搭建
安裝Python并添加到環(huán)境變量,pip安裝需要的相關(guān)模塊即可。
原理介紹
這里簡(jiǎn)單介紹一下游戲的實(shí)現(xiàn)原理唄。首先是游戲的開(kāi)始界面,大概是長(zhǎng)這樣的,比較簡(jiǎn)約:
主要包括兩個(gè)部分,即游戲的標(biāo)題和游戲的開(kāi)始以及退出按鈕,這兩部分的代碼實(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)起來(lái)其實(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)擊開(kāi)始游戲按鈕,則開(kāi)始游戲:
def startgame():
game_levels = GameLevels(cfg, screen)
game_levels.start()
游戲界面大概長(zhǎng)這樣:
玩家獲勝的方法就是操作有限數(shù)量的小鳥將所有入侵的豬干掉,換句話說(shuō)就是利用彈弓發(fā)射小鳥,讓小鳥擊中場(chǎng)上的所有豬。若小鳥全部發(fā)射完之后場(chǎng)上仍然有豬沒(méi)有被擊中,則玩家失敗。判斷游戲勝負(fù)關(guān)系的代碼實(shí)現(xiàn)起來(lái)其實(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)
'''判斷有沒(méi)有被鼠標(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ù)重力和小鳥的初速度來(lái)計(jì)算其飛行路徑并不斷地移動(dòng);
- 碰撞狀態(tài),即在飛行過(guò)程中撞擊到其他物體例如小豬和木樁等時(shí),運(yùn)動(dòng)狀態(tài)發(fā)生了改變;
- 靜止?fàn)顟B(tài),即小鳥完成飛行狀態(tài)之后最終靜止時(shí)的狀態(tài)。
接著來(lá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
最后,我們來(lái)實(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))
由此,我們完成了所有游戲精靈的定義,可以開(kāi)始實(shí)現(xiàn)游戲的主循環(huán)啦,具體的代碼實(shí)現(xiàn)如下:
'''開(kāi)始游戲'''
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é)束,若沒(méi)有則導(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)
# --刪除無(wú)效的元素
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í)更新,感覺(jué)沒(méi)啥好講的,總之,就這么簡(jiǎn)單就完事啦~
到此這篇關(guān)于憶童年!用Python實(shí)現(xiàn)憤怒的小鳥游戲的文章就介紹到這了,更多相關(guān)Python憤怒的小鳥內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- python游戲開(kāi)發(fā)的五個(gè)案例分享
- 總結(jié)Python圖形用戶界面和游戲開(kāi)發(fā)知識(shí)點(diǎn)
- python游戲開(kāi)發(fā)之視頻轉(zhuǎn)彩色字符動(dòng)畫
- 你喜歡籃球嗎?Python實(shí)現(xiàn)籃球游戲
- 使用python+pygame開(kāi)發(fā)消消樂(lè)游戲附完整源碼
- python用tkinter開(kāi)發(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)行游戲開(kāi)發(fā)