어린 시절 을 회상 하 라!파 이 썬 으로 앵 그리 버드 게임 을 하 겠 습 니 다.
파 이 썬 버 전: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
그것 을 실현 하려 면 주로 고려 해 야 할 것 은 작은 새 가 사실은 다섯 가지 상태 가 존재 한 다 는 것 이다.4.567917.줄 을 서 는 상태,즉 왼쪽 아래 에서 새총 에 들 어 갈 때의 상 태 를 기다 리 고 가만히 있 으 면 된다4.567917.준비 상태,즉 새총 이 발 사 될 준 비 를 하 는 상태 에 들 어가 마 우 스 를 따라 끊임없이 이동 하여 게이머 들 이 자신 이 현재 작은 새 가 도착 하 는 위 치 를 조정 하여 발 사 된 후에 어떤 각도 와 경 로 를 알 게 해 야 한다4.567917.비행 상태,즉 새총 에 발 사 된 후의 상 태 는 중력 과 작은 새 의 초기 속도 에 따라 비행 경 로 를 계산 하고 끊임없이 이동 해 야 한다4.567917.충돌 상태,즉 비행 과정 에서 다른 물체,예 를 들 어 돼지 와 말뚝 등 과 부 딪 혔 을 때 운동 상태 가 바 뀌 었 다4.567917.정지 상태,즉 작은 새 가 비행 상 태 를 완성 한 후에 최종 적 으로 정지 할 때의 상태이어서 돼지 를 실현 해 보 자.
''' '''
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]
돼지 는 게임 에서 주로 세 가지 상 태 를 포함한다.4.567917.정지 상태,즉 맞 히 지 않 았 을 때 어 딘 가 에 정 지 된 상태 이다4.567917.맞 은 후의 운동 상태,즉 다른 물체 에 맞 은 후에 운동량 의 보존 원리 에 따라 함께 운행 할 때의 상태 이다4.567917.맞 은 후의 정지 상태,즉 맞 아서 운동 을 한 후에 정지 상태 로 회복 하 는 것 이다게임 중의 나무토막 실현 원 리 는 돼지 와 유사 하 다.
'' '''
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 = []
사실 버튼 검 측 과 충돌 검 측,점수 와 같은 게임 상태 가 실시 간 으로 업데이트 되 어 할 말 이 없 을 것 같 습 니 다.아무튼 이렇게 간단 하면 끝 입 니 다~이 편 은 어린 시절 을 회상 하 는 것 에 관 한 것 입 니 다!파 이 썬 으로 앵 그리 버드 게임 을 실현 하 는 글 은 여기까지 입 니 다.파 이 썬 앵 그리 버드 에 관 한 더 많은 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.