python 의 pygame 모듈 은 비행기 대전 의 전체 코드 를 실현 합 니 다.

본 논문 의 사례 는 python 의 pygame 모듈 이 비행기 대전 을 실현 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
Python 비행기 대전 절차:
1.데이터 영역
2.메 인 인터페이스
3.우주선
4.이벤트 모니터링 및 경계
5.외계인
6.스코어 시스템
비행기 대전 효과 도:


원본 코드:

"""
  :    
time:2019/10/3

"""
import os
import pygame
import sys
import time
from pygame.sprite import Sprite, Group

"""
1.     
2.      
3.       
4.    
"""
#1.   
#       
class Settings():
 def __init__(self):
 #    
 self.screen_width = 1100
 self.screen_height = 600
 self.background = (230,230,230)
 self.background_image = pygame.image.load("C:/Users/Administrator/Desktop/xxx.jpg")
 #    
 self.bullet_width = 3
 self.bullet_height = 15
 self.bullet_color = 60,60,60
 #         
 self.bullets_allow = 3
 #     
 self.fleet_drop_speed = 10
 self.ship_limit = 3
 #           
 self.speed_scale = 1.2
 #          
 self.score_speed = 1.5
 #           
 self.init_setting()

 #        
 self.alien_points = 50
 def init_setting(self): #           
 self.ship_speed = 1.6
 self.bullet_speed_factor = 2.5
 self.alien_speed_factor = 1

 #         ,1  ,-1  
 self.fleet_direction =1
 def increase_speed(self):
 #            
 self.ship_speed *= self.speed_scale
 self.bullet_speed_factor *= self.speed_scale
 self.alien_speed_factor *=self.speed_scale

 self.alien_points = int(self.alien_points*self.score_speed)
 print(self.alien_points) #           

#2.   
#1)      
def update_screen(setting_1,screen,stats,score_b,ship,aliens,bullets,my_button):
 #          
 screen.fill(setting_1.background)
 #               
 #screen.blit(setting_1.background_image,(0,0))
 for bullet in bullets.sprites():
 bullet.draw_bullet()
 #    
 score_b.show_score()
 #          
 ship.ship_1()
 aliens.draw(screen)
 #           ,   play  
 if not stats.game_active:
 my_button.draw_button()
 #          
 pygame.display.flip()
#    
def run_deploy():
 pygame.init() #   
 setting_1 = Settings() #Settings    
 screen = pygame.display.set_mode((setting_1.screen_width,setting_1.screen_height))
 pygame.display.set_caption("    ")
 #  Play  
 my_button = Button(setting_1,screen,"Play")
 #      
 ship = Ship(setting_1.ship_speed,screen)
 #            
 bullets = Group()
 #         
 aliens = Group()
 #             
 stats = Game_stats(setting_1)
 #     
 score_b = Scoreboard(setting_1,screen,stats)

 #    
 while True:
 events(setting_1,screen,stats,score_b,my_button,ship,aliens,bullets) #    
 if stats.game_active:
 #         ,      
 ship.moving_1() #    
 update_bullet(setting_1,screen,stats,score_b,ship,aliens,bullets) #         
 update_aliens(setting_1,screen,stats,score_b,ship,aliens,bullets)

 update_screen(setting_1,screen,stats,score_b,ship,aliens,bullets,my_button) #    

#2)      
class Ship(Sprite):
 def __init__(self,setting_1,screen):
 #     ,        
 super(Ship,self).__init__()
 self.screen = screen
 self.ship_speed_setting = setting_1

 #           
 self.image = pygame.image.load("../image001/ship.bmp")
 self.rect = self.image.get_rect()
 self.screen_rect = screen.get_rect()
 self.center = float(self.rect.centerx)

 #         
 self.rect.centerx = self.screen_rect.centerx
 self.rect.bottom = self.screen_rect.bottom

 #    (       )
 self.moving_right_fag = False
 self.moving_left_fag = False

 def moving_1(self):
 """            """
 if self.moving_right_fag and self.rect.right < self.screen_rect.right: # screen_rect.right          
 self.rect.centerx += self.ship_speed_setting
 if self.moving_left_fag and self.rect.left > 0:
 self.rect.centerx -= self.ship_speed_setting

 def ship_1(self):
 """         """
 self.screen.blit(self.image,self.rect)

 def center_ship(self):
 #    
 self.center =self.screen_rect.centerx

#3)         
def check_keydown_events(event,setting_1,screen,ship,bullets):
 """    """
 if event.key == pygame.K_RIGHT: #  
 ship.moving_right_fag = True
 #print(pygame.K_RIGHT)
 elif event.key == pygame.K_LEFT: #  
 ship.moving_left_fag = True
 elif event.key == pygame.K_SPACE:
 if len(bullets) <= setting_1.bullets_allow: #                     ,         
 #      ,       
 new_bullet = Bullet(setting_1,screen,ship)
 bullets.add(new_bullet)

def check_keyup_events(event,ship):
 if event.key ==pygame.K_RIGHT: #  
 ship.moving_right_fag = False
 elif event.key == pygame.K_LEFT:
 ship.moving_left_fag = False

def events(setting_1,screen,stats,score_b,my_button,ship,aliens,bullets):
 #           
 for event in pygame.event.get():
 if event.type == pygame.QUIT: #            ,       
 # print(pygame.QUIT)
 # print(pygame.event)
 sys.exit()

 elif event.type == pygame.KEYDOWN: #      ,       ID,      
 check_keydown_events(event,setting_1,screen,ship,bullets)

 elif event.type == pygame.KEYUP:
 check_keyup_events(event,ship)

 elif event.type == pygame.MOUSEBUTTONDOWN: #    
 mouse_x,mouse_y = pygame.mouse.get_pos()
 check_play_button(setting_1,screen,stats,score_b,my_button,ship,aliens,bullets,mouse_x,mouse_y)


def check_fleet_edgs(setting_1,aliens):
 """           ,     """
 for alien in aliens.sprites():
 if alien.check_edgs():
 change_fleet_direction(setting_1,aliens)
 break

def change_fleet_direction(setting_1,aliens): #     
 #      ,     
 for alien in aliens.sprites():
 alien.rect.y += setting_1.fleet_drop_speed
 setting_1.fleet_direction *= -1

def ship_hit(setting_1,screen,stats,score_b,ship,aliens,bullets):
 """           """
 #     1
 if stats.ship_left > 0:
 print(stats.ship_left)
 #     1
 stats.ship_left -= 1

 #     
 score_b.prep_ships()

 #          
 aliens.empty()
 bullets.empty()

 #         ,          

 creet_fleet(setting_1,screen,ship,aliens)
 ship.center_ship()
 #  1 
 time.sleep(1)
 else:
 stats.game_active = False
 pygame.mouse.set_visible(True) #    

def check_aliens_bottom(setting_1,screen,stats,score_b,ship,aliens,bullets):
 """              """
 screen_rect = screen.get_rect()
 for alien in aliens.sprites():
 if alien.rect.bottom >= screen_rect.bottom:
 # print(2*alien.rect.bottom,"###")
 # print(screen_rect.bottom)

 #         
 ship_hit(setting_1,screen,stats,score_b,ship,aliens,bullets)
 break
def check_play_button(setting_1,screen,stats,score_b,my_button,ship,aliens,bullets,mouse_x,mouse_y):
 """        """
 button_clicked = my_button.rect.collidepoint(mouse_x,mouse_y)
 if button_clicked and not stats.game_active :
 #      
 setting_1.init_setting()
 pygame.mouse.set_visible(False) #    
 #        
 stats.reset_stats()
 stats.game_active = True

 #       
 score_b.prep_score()
 score_b.prep_high_score()
 score_b.prep_level()
 score_b.prep_ships()

 #          
 aliens.empty()
 bullets.empty()

 #      ,    
 creet_fleet(setting_1,screen,ship,aliens)
 ship.center_ship()

def check_high_score(stats,score_b):
 """           """
 if stats.score > stats.high_score:
 stats.high_score = stats.score
 score_b.prep_high_score()



# 3)       

class Bullet(Sprite):
 """        """

 def __init__(self,setting_1,screen,ship):
 """                """
 super(Bullet,self).__init__() #      ,         Sprite 
 self.screen = screen
 #  pygame Rect         Rect   4    (x,y,d,h)
 self.rect = pygame.Rect(0,0,setting_1.bullet_width,setting_1.bullet_height)
 self.rect.centerx = ship.rect.centerx
 self.rect.top = ship.rect.top
 self.y = float(self.rect.y)

 self.color = setting_1.bullet_color
 self.speed_factor = setting_1.bullet_speed_factor

 def update(self):
 """      """
 #       
 self.y -= self.speed_factor
 #     rect  
 self.rect.y = self.y

 def draw_bullet(self):
 """        """
 pygame.draw.rect(self.screen,self.color,self.rect)
#          
def update_bullet(setting_1,screen,stats,score_b,ship,aliens,bullets):
 #      ,     
 bullets.update()
 #        ,     pygame          ,        ,          ,       
 for bullet in bullets.copy():
 if bullet.rect.bottom <=0:
 bullets.remove(bullet)
 check_bullet_alien_collision(setting_1,screen,stats,score_b,ship,aliens,bullets)

def check_bullet_alien_collision(setting_1,screen,stats,score_b,ship,aliens,bullets):

 #            ,   ,         ,    pygame groupcollide  
 collsinos = pygame.sprite.groupcollide(bullets,aliens,True,True)
 #        
 if collsinos:
 for aliens in collsinos.values(): #                ,  1          
 stats.score += setting_1.alien_points*len(aliens)
 score_b.prep_score()
 check_high_score(stats,score_b)
 #          ,       ,         
 if len(aliens) == 0 :
 #       ,      
 bullets.empty()
 setting_1.increase_speed()

 #        ,    1 
 stats.level += 1
 score_b.prep_level()
 creet_fleet(setting_1,screen,ship,aliens)
# 4)        
class Alien(Sprite):
 """         """
 def __init__(self,setting_1,screen):
 super(Alien,self).__init__() #      ,      
 self.screen = screen
 self.setting_1 = setting_1

 #       ,  rect  
 self.image=pygame.image.load("../image001/alien.bmp") #      image,      ,   images,     
 self.rect = self.image.get_rect()
 #        
 self.rect.x = self.rect.width
 self.rect.y = self.rect.height

 #        
 self.x = float(self.rect.x)
 def blitme(self):
 """     """
 self.screen.blit(self.image,self.rect)
 #            
 def check_edgs(self):
 screen_rect =self.screen.get_rect()
 if self.rect.right >= screen_rect.right:
 return True
 elif self.rect.left <= 0:
 return True

 def update(self):
 """         """
 self.x += (self.setting_1.alien_speed_factor * self.setting_1.fleet_direction) #  ,            ,      ,               
 self.rect.x = self.x #    



def get_number_alien_x(setting_1,alien_width): #              
 val_spaces_x = setting_1.screen_width -2*alien_width
 num_alien_x = int(val_spaces_x/(2*alien_width))
 return num_alien_x

def get_number_alien_y(setting_1,ship_height,alien_height):
 avl_spaces_y = (setting_1.screen_height-(3*alien_height)-ship_height)
 number_rows = int(avl_spaces_y/(2*alien_height))
 return number_rows

def creat_aliens(setting_1,screen,aliens,alien_number,row_number):
 """       ,      """
 alien = Alien(setting_1,screen)
 alien_width = alien.rect.width
 alien.x = alien_width + 2*alien_width*alien_number
 alien.rect.x = alien.x
 alien.rect.y = alien.rect.height + 2*alien.rect.height*row_number
 aliens.add(alien) #            ,     aliens,          ,   print    

def creet_fleet(setting_1,screen,ship,aliens):
 """       """
 alien = Alien(setting_1,screen)
 number_alien_x = get_number_alien_x(setting_1,alien.rect.width)
 number_rows = get_number_alien_y(setting_1,ship.rect.height,alien.rect.height)
 #      
 for row_number in range(number_rows):
 #        
 for alien_number in range(number_alien_x):
 creat_aliens(setting_1,screen,aliens,alien_number,row_number)

def update_aliens(setting_1,screen,stats,score_d,ship,aliens,bullets):
 check_fleet_edgs(setting_1,aliens)
 aliens.update()

 #             
 if pygame.sprite.spritecollideany(ship,aliens):
 #print("ship hit")
 ship_hit(setting_1,screen,stats,score_d,ship,aliens,bullets)
 #            
 check_aliens_bottom(setting_1,screen,stats,score_d,ship,aliens,bullets)

#5)     
#6)          ,         ,     ,    
#7)        3
class Game_stats():
 """       """
 def __init__(self,setting_1):
 #   
 self.setting_1 =setting_1
 self.reset_stats()
 #        ,     , False
 self.game_active = False
 #   __init__,               
 self.high_score = 0
 def reset_stats(self):
 """                  """
 self.ship_left = self.setting_1.ship_limit
 self.score = 0
 self.level = 1 #   

#8)                
class Button():
 """        """
 def __init__(self,setting_1,screen,msg):
 """       """
 self.screen = screen
 self.screen_rect = screen.get_rect()

 #            
 self.width,self.height = 200,100
 self.button_color = (228,222,213)
 self.text_color = (255,255,255)
 self.font = pygame.font.SysFont(None,100)

 #     rect  
 self.rect = pygame.Rect(0,250,self.width,self.height)
 self.rect.centerx = self.screen_rect.centerx

 #           
 self.prep_msg(msg)
 def prep_msg(self,msg):
 """ msg     ,    """
 self.msg_image = self.font.render(msg,True,self.text_color,self.button_color)
 self.msg_image_rect = self.msg_image.get_rect()
 self.msg_image_rect.center = self.rect.center

 def draw_button(self):
 #      ,     
 self.screen.fill(self.button_color,self.rect)
 self.screen.blit(self.msg_image,self.msg_image_rect)


#9)    
class Scoreboard():
 """      """

 def __init__(self,setting_1,screen,stats):
 self.screen = screen
 self.screen_rect = screen.get_rect()
 self.setting_1 = setting_1
 self.stats = stats

 #    
 self.text_color = (30,30,30)
 self.font = pygame.font.SysFont(None,48)

 #        
 self.prep_score()
 self.prep_high_score()
 self.prep_level()
 self.prep_ships()
 def prep_score(self):

 """      """
 round_score = int(round(self.stats.score,-1)) # round      ,   10、100、1000    
 score_str = "{:,}".format(round_score) #     
 self.score_image = self.font.render(score_str,True,self.text_color,self.setting_1.background)

 #         
 self.score_rect = self.score_image.get_rect()
 self.score_rect.right = self.screen_rect.right - 20
 self.screen_rect.top = 20

 def prep_high_score(self): #      
 #         
 high_score = int(round(self.stats.high_score,-1)) # round      ,   10、100、1000    
 high_score_str = "{:,}".format(high_score) #     
 self.hight_score_image = self.font.render(high_score_str,True,self.text_color,self.setting_1.background)

 #         
 self.high_score_rect = self.hight_score_image.get_rect()
 self.high_score_rect.centerx = self.screen_rect.centerx
 self.high_score_rect.top = self.score_rect.top
 def prep_level(self): #    
 """      """
 self.level_image = self.font.render(str(self.stats.level),True,self.text_color,self.setting_1.background)

 #           

 self.level_rect = self.level_image.get_rect()
 self.level_rect.right = self.score_rect.right
 self.level_rect.top = self.score_rect.bottom +10
 def prep_ships(self): #        
 self.ships = Group()
 for ship_number in range(self.stats.ship_left):
 ship = Ship(self.setting_1,self.screen)
 ship.rect.x = 10 + ship_number*ship.rect.width
 ship.rect.y = 10
 self.ships.add(ship)


 def show_score(self):
 """        """
 self.screen.blit(self.score_image,self.score_rect)
 self.screen.blit(self.hight_score_image,self.high_score_rect)
 self.screen.blit(self.level_image,self.level_rect)
 self.ships.draw(self.screen)

#3.   
if __name__ == "__main__":
 run_deploy()
만난 것 은 5 개의 구덩이 가 있 습 니 다.
구덩이 1:총알 을 그 릴 때 실행 코드 에서 AttributeError:'pygame.Surface'object has no attribute'bulletwidth'는 반나절 동안 분 석 했 는데 그 원인 은 형 삼 전이 잘못 되 어서 생 긴 것 이다.반드시 프로그램 에서 형 삼 의 일치 성 을 유지 해 야 한다.

갱 2:저 는 우주선 과 외계인 의 그림 을 읽 을 때 images 파 라 메 터 를 정 의 했 습 니 다.저 는 두 개의 images 파 라 메 터 를 정 의 했 습 니 다.처음에 그림 을 읽 을 때 우주선 과 외계인 이 모두 화면 에 표시 되 었 고 외계인 에 게 사건 을 조작 할 때 프로그램 에 오류 가 발생 했 습 니 다.AttributeError:'Alien'object has no attribute'image'.한참 을 고민 하고 나 서 야 이곳 의 매개 변 수 는 image 이 고 수정 이 끝 난 후에 문 제 를 해결 해 야 한 다 는 것 을 알 게 되 었 다.우주선 이미지 다음 에 얘 기 하 자.

갱 3:정 의 된 외계인 의 좌우 이동 시 이동 표지 fleetdirection 은 다른 값 으로 쓰 여 외계인 의 오른쪽 이동 이 사 라 졌 습 니 다.프로그램 이 잘못 되 지 않 았 기 때문에 저 는 print 문 구 를 사 용 했 습 니 다.마지막 으로 이동 표지 의 오류 로 인 한 것 임 을 알 게 되 었 습 니 다.
self.x += (self.setting_1.alien_speed_factor * self.setting_1.fleet_direction)
갱 4:외계인 이 우주선 에 부 딪 히 거나 화면 밑 에 부 딪 혀 게임 이 끝 날 때 우주선 이 바닥 에 부 딪 히 는 논리 적 정의 가 잘못 되 어 마지막 우주선(3 개 정의)이 화면 밑 에 부 딪 혀 게임 을 종료 할 수 없습니다.프로그램 에서 도 오 류 를 보고 하지 않 았 기 때문에 천천히 분석 할 수 밖 에 없습니다.최종 원인 은 게임 활동 상태 에 대한 판단 이 잘못 되 었 기 때 문 입 니 다.최종 적 으로 활동 상 태 를 True 에서 False 해결 로 바 꾸 었 습 니 다<

구덩이 5:두 번 째 구덩이 에서 언급 한 우주선 images 파라미터 로 인해 나머지 3 개의 우주선 이 잘못 보고 되 었 습 니 다(앞 에 그 려 진 우주선 은 모두 문제 가 없습니다)AttributeError:'Ship'object has no attribute'image

팁:그림 의 색상 값 을 취 할 때 인터넷 에서 그림 의 색상 값 을 추출 할 수 있 습 니 다.
성능:그림 과 배경 색 을 인터페이스의 배경 으로 할 때 그림 은 게임 의 성능 을 크게 떨 어 뜨 린 다.
주:종이 위 에서 얻 은 것 은 결국 얕 은 것 이 니,이 일 을 몸소 해 야 한 다 는 것 을 절대 알 아야 한다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기