当前位置:   article > 正文

Python编程从入门到实践——外星人入侵代码_python编程从入门到实践源代码

python编程从入门到实践源代码

        学习python的新人一枚,在学习的过程中遇到了很多问题,最后通过在CSDN等网站上查阅资料等都慢慢解决了,写一个帖子,一方面是记录自己的代码,另一方面和大家分享一下。

目录

alien.py

alien_invasion.py

bullet.py

button.py

game_functions.py

game_stats.py

scoreboard.py

settings.py

ship.py

  1. #alien.py
  2. #
  3. # Copyright 2021
  4. import pygame
  5. from pygame.sprite import Sprite
  6. class Alien(Sprite):
  7. def __init__(self,ai_settings,screen):
  8. #初始化外星人并设置其起始位置
  9. super(Alien,self).__init__()
  10. self.screen=screen
  11. self.ai_settings=ai_settings
  12. #加载外星人图像
  13. self.image=pygame.image.load('images/alien.bmp')
  14. self.rect=self.image.get_rect()
  15. #每个外星人最初都在屏幕左上角
  16. self.rect.x=self.rect.width
  17. self.rect.y=self.rect.height
  18. #存储外星人的准确位置
  19. self.x=float(self.rect.x)
  20. def blitme(self):
  21. self.screen.blit(self.image,self.rect)
  22. def check_edges(self):
  23. screen_rect=self.screen.get_rect()
  24. if self.rect.right>=screen_rect.right:
  25. return True
  26. elif self.rect.left<=0:
  27. return True
  28. def update(self):
  29. self.x+=(self.ai_settings.alien_speed_factor*self.ai_settings.fleet_direction)
  30. self.rect.x=self.x
  1. # alien_invasion.py
  2. # Copyright 2021
  3. # 20211107
  4. import sys
  5. import pygame
  6. from pygame.sprite import Group
  7. from settings import Settings
  8. from game_stats import GameStats
  9. from scoreboard import Scoreboard
  10. from button import Button
  11. from ship import Ship
  12. from alien import Alien
  13. import game_functions as gf
  14. def run_game():
  15. #初始化pygame 设置和屏幕对象
  16. pygame.init()
  17. ai_settings=Settings()
  18. screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
  19. pygame.display.set_caption("Alien Invasion")
  20. #创建一个用于存储游戏统计信息的实例
  21. stats=GameStats(ai_settings)
  22. sb=Scoreboard(ai_settings,screen,stats)
  23. #创建Play按钮
  24. play_button=Button(ai_settings,screen,"Play")
  25. bg_color=(230,230,230)
  26. #创建一艘飞船
  27. ship=Ship(ai_settings,screen)
  28. bullets=Group()
  29. aliens=Group()
  30. #创建外星人群
  31. gf.create_fleet(ai_settings,screen,ship,aliens)
  32. #开始游戏主循环
  33. while True:
  34. gf.check_events(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets)
  35. if stats.game_active:
  36. ship.update()
  37. gf.update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets)
  38. gf.update_aliens(ai_settings,screen,stats,sb,ship,aliens,bullets)
  39. gf.update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_button)
  40. run_game()

  1. # bullet.py
  2. #
  3. # Copyright 2021
  4. #
  5. import pygame
  6. from pygame.sprite import Sprite
  7. class Bullet(Sprite):
  8. def __init__(self, ai_settings, screen, ship):
  9. super(Bullet,self).__init__()
  10. self.screen = screen
  11. self.rect = pygame.Rect(0,0, ai_settings.bullet_width, ai_settings.bullet_height)
  12. self.rect.centerx = ship.rect.centerx
  13. self.rect.top = ship.rect.top
  14. self.y = float(self.rect.y)
  15. self.color = ai_settings.bullet_color
  16. self.speed_factor = ai_settings.bullet_speed_factor
  17. def update(self):
  18. self.y-=self.speed_factor
  19. self.rect.y=self.y
  20. def draw_bullet(self):
  21. pygame.draw.rect(self.screen, self.color, self.rect)
  1. # button.py
  2. #
  3. # Copyright 2021
  4. # 20211107
  5. #
  6. import pygame.font
  7. class Button():
  8. def __init__(self,ai_settings,screen,msg):
  9. self.screen=screen
  10. self.screen_rect=screen.get_rect()
  11. self.width,self.height=200,50
  12. self.button_color=(0,255,0)
  13. self.text_color=(255,255,255)
  14. self.font=pygame.font.SysFont(None,48)
  15. self.rect=pygame.Rect(0,0,self.width,self.height)
  16. self.rect.center=self.screen_rect.center
  17. self.prep_msg(msg)
  18. def prep_msg(self,msg):
  19. self.msg_image=self.font.render(msg,True,self.text_color,self.button_color)
  20. self.msg_image_rect=self.msg_image.get_rect()
  21. self.msg_image_rect.center=self.rect.center
  22. def draw_button(self):
  23. self.screen.fill(self.button_color,self.rect)
  24. self.screen.blit(self.msg_image,self.msg_image_rect)

  1. # game_functions.py
  2. # Copyright 2021
  3. #
  4. import sys
  5. from time import sleep
  6. import pygame
  7. from bullet import Bullet
  8. from alien import Alien
  9. def check_keydown_events(event,ai_settings,screen,ship,bullets):
  10. if event.key == pygame.K_RIGHT:
  11. ship.moving_right=True
  12. elif event.key == pygame.K_LEFT:
  13. ship.moving_left=True
  14. elif event.key == pygame.K_SPACE:
  15. fire_bullet(ai_settings,screen,ship,bullets)
  16. elif event.key==pygame.K_q:
  17. sys.exit()
  18. def fire_bullet(ai_settings,screen,ship,bullets):
  19. if len(bullets)<ai_settings.bullets_allowed:
  20. new_bullet = Bullet(ai_settings,screen,ship)
  21. bullets.add(new_bullet)
  22. def check_keyup_events(event,ship):
  23. if event.key == pygame.K_RIGHT:
  24. ship.moving_right=False
  25. elif event.key == pygame.K_LEFT:
  26. ship.moving_left=False
  27. def check_events(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets):
  28. for event in pygame.event.get():
  29. if event.type == pygame.QUIT:
  30. sys.exit()
  31. elif event.type == pygame.KEYDOWN:
  32. check_keydown_events(event,ai_settings,screen,ship,bullets)
  33. elif event.type == pygame.KEYUP:
  34. check_keyup_events(event,ship)
  35. elif event.type==pygame.MOUSEBUTTONDOWN:
  36. mouse_x,mouse_y=pygame.mouse.get_pos()
  37. check_play_button(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets,mouse_x,mouse_y)
  38. def check_play_button(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets,mouse_x,mouse_y):
  39. button_clicked=play_button.rect.collidepoint(mouse_x,mouse_y)
  40. if button_clicked and not stats.game_active:
  41. #重置游戏设置
  42. ai_settings.initialize_dynamic_settings()
  43. #隐藏光标
  44. pygame.mouse.set_visible(False)
  45. #重置游戏统计信息
  46. stats.reset_stats()
  47. stats.game_active=True
  48. #重置记分牌图像
  49. sb.prep_score()
  50. sb.prep_high_score()
  51. sb.prep_level()
  52. #清空外星人列表和子弹列表
  53. aliens.empty()
  54. bullets.empty()
  55. #创建一群新的外星人,并让飞船居中
  56. create_fleet(ai_settings,screen,ship,aliens)
  57. ship.center_ship()
  58. def update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_button):
  59. screen.fill(ai_settings.bg_color)
  60. for bullet in bullets.sprites():
  61. bullet.draw_bullet()
  62. ship.blitme()
  63. aliens.draw(screen)
  64. sb.show_score()
  65. if not stats.game_active:
  66. play_button.draw_button()
  67. pygame.display.flip()
  68. def update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets):
  69. bullets.update()
  70. for bullet in bullets.copy():
  71. if bullet.rect.bottom<=0:
  72. bullets.remove(bullet)
  73. check_bullet_alien_collisions(ai_settings,screen,stats,sb,ship,aliens,bullets)
  74. def check_bullet_alien_collisions(ai_settings,screen,stats,sb,ship,aliens,bullets):
  75. collisions=pygame.sprite.groupcollide(bullets,aliens,True,True)
  76. if collisions:
  77. for aliens in collisions.values():
  78. stats.score+=ai_settings.alien_points*len(aliens)
  79. sb.prep_score()
  80. check_high_score(stats,sb)
  81. if len(aliens)==0:
  82. bullets.empty()
  83. ai_settings.increase_speed()
  84. #提高等级
  85. stats.level+=1
  86. sb.prep_level()
  87. create_fleet(ai_settings,screen,ship,aliens)
  88. def get_number_aliens_x(ai_settings,alien_width):
  89. available_space_x=ai_settings.screen_width - 2*alien_width
  90. number_aliens_x=int(available_space_x /(2*alien_width))
  91. return number_aliens_x
  92. def get_number_rows(ai_settings,ship_height,alien_height):
  93. available_space_y=(ai_settings.screen_height-(3*alien_height)-ship_height)
  94. number_rows=int(available_space_y / (2*alien_height))
  95. return number_rows
  96. def create_alien(ai_settings,screen,aliens,alien_number,row_number):
  97. alien=Alien(ai_settings,screen)
  98. alien_width=alien.rect.width
  99. alien.x=alien_width+2*alien_width*alien_number
  100. alien.rect.y=alien.rect.height+2*alien.rect.height*row_number
  101. alien.rect.x=alien.x
  102. aliens.add(alien)
  103. def create_fleet(ai_settings,screen,ship,aliens):
  104. #创建第一行外星人
  105. alien=Alien(ai_settings,screen)
  106. number_aliens_x=get_number_aliens_x(ai_settings,alien.rect.width)
  107. number_rows=get_number_rows(ai_settings,ship.rect.height,alien.rect.height)
  108. for row_number in range(number_rows):
  109. for alien_number in range(number_aliens_x):
  110. create_alien(ai_settings,screen,aliens,alien_number,row_number)
  111. def check_fleet_edges(ai_settings,aliens):
  112. for alien in aliens.sprites():
  113. if alien.check_edges():
  114. change_fleet_direction(ai_settings,aliens)
  115. break
  116. def change_fleet_direction(ai_settings,aliens):
  117. for alien in aliens.sprites():
  118. alien.rect.y+=ai_settings.fleet_drop_speed
  119. ai_settings.fleet_direction*=-1
  120. def ship_hit(ai_settings,screen,stats,sb,ship,aliens,bullets):
  121. if stats.ships_left>0:
  122. stats.ships_left-=1
  123. #更新记分牌
  124. sb.prep_ships()
  125. aliens.empty()
  126. bullets.empty()
  127. create_fleet(ai_settings,screen,ship,aliens)
  128. ship.center_ship()
  129. sleep(0.5)
  130. else:
  131. stats.game_active=False
  132. pygame.mouse.set_visible(True)
  133. def check_aliens_bottom(ai_settings,screen,stats,sb,ship,aliens,bullets):
  134. screen_rect=screen.get_rect()
  135. for alien in aliens.sprites():
  136. if alien.rect.bottom>=screen_rect.bottom:
  137. ship_hit(ai_settings,screen,stats,sb,ship,aliens,bullets)
  138. break
  139. def update_aliens(ai_settings,screen,stats,sb,ship,aliens,bullets):
  140. check_fleet_edges(ai_settings,aliens)
  141. aliens.update()
  142. if pygame.sprite.spritecollideany(ship,aliens):
  143. ship_hit(ai_settings,screen,stats,sb,ship,aliens,bullets)
  144. check_aliens_bottom(ai_settings,screen,stats,sb,ship,aliens,bullets)
  145. def check_high_score(stats,sb):
  146. if stats.score>stats.high_score:
  147. stats.high_score=stats.score
  148. sb.prep_high_score()

  1. # game_stats.py
  2. #
  3. # Copyright 2021
  4. # 20211107
  5. #
  6. class GameStats():
  7. def __init__(self,ai_settings):
  8. self.ai_settings=ai_settings
  9. self.reset_stats()
  10. #让游戏一开始处于非激活状态
  11. self.game_active=False
  12. #任何情况下都不应该重置最高得分
  13. self.high_score=0
  14. def reset_stats(self):
  15. self.ships_left=self.ai_settings.ship_limit
  16. self.score=0
  17. self.level=1

  1. # scoreboard.py
  2. #
  3. # Copyright 2021
  4. # 20211109
  5. import pygame.font
  6. from pygame.sprite import Group
  7. from ship import Ship
  8. class Scoreboard():
  9. #显示得分信息的类
  10. def __init__(self,ai_settings,screen,stats):
  11. self.screen=screen
  12. self.screen_rect=screen.get_rect()
  13. self.ai_settings=ai_settings
  14. self.stats=stats
  15. #显示得分信息时使用的字体设置
  16. self.text_color=(30,30,30)
  17. self.font=pygame.font.SysFont(None,48)
  18. #准备初始得分图像
  19. self.prep_score()
  20. self.prep_high_score()
  21. self.prep_level()
  22. self.prep_ships()
  23. def prep_score(self):
  24. score_str=str(self.stats.score)
  25. rounded_score=int(round(self.stats.score,-1))
  26. score_str="{:,}".format(rounded_score)
  27. self.score_image=self.font.render(score_str,True,self.text_color,self.ai_settings.bg_color)
  28. #将得分放在右上角
  29. self.score_rect=self.score_image.get_rect()
  30. self.score_rect.right=self.screen_rect.right-20
  31. self.score_rect.top=20
  32. def prep_high_score(self):
  33. high_score=int(round(self.stats.high_score,-1))
  34. high_score_str="{:,}".format(high_score)
  35. self.high_score_image=self.font.render(high_score_str,True,self.text_color,self.ai_settings.bg_color)
  36. #将最高得分放在中央
  37. self.high_score_rect=self.high_score_image.get_rect()
  38. self.high_score_rect.centerx=self.screen_rect.centerx
  39. self.high_score_rect.top=self.score_rect.top
  40. def prep_level(self):
  41. self.level_image=self.font.render(str(self.stats.level),True,self.text_color,self.ai_settings.bg_color)
  42. #将等级放在得分的下方
  43. self.level_rect=self.level_image.get_rect()
  44. self.level_rect.right=self.score_rect.right
  45. self.level_rect.top=self.score_rect.bottom+10
  46. def show_score(self):
  47. self.screen.blit(self.score_image,self.score_rect)
  48. self.screen.blit(self.high_score_image,self.high_score_rect)
  49. self.screen.blit(self.level_image,self.level_rect)
  50. self.ships.draw(self.screen)
  51. def prep_ships(self):
  52. self.ships=Group()
  53. for ship_number in range(self.stats.ships_left):
  54. ship=Ship(self.ai_settings,self.screen)
  55. ship.rect.x=10+ship_number*ship.rect.width
  56. ship.rect.y=10
  57. self.ships.add(ship)
  1. # settings.py
  2. # Copyright 2021
  3. class Settings():
  4. def __init__(self):
  5. self.screen_width=1200
  6. self.screen_height=600
  7. self.bg_color=(230,230,230)
  8. self.ship_limit=2
  9. #子弹设置
  10. self.bullet_width = 5
  11. self.bullet_height = 15
  12. self.bullet_color = 60, 60 ,60
  13. self.bullets_allowed=3
  14. self.fleet_drop_speed=4
  15. self.speedup_scale=1.1
  16. self.score_scale=1.5
  17. self.initialize_dynamic_settings()
  18. def initialize_dynamic_settings(self):
  19. #随着游戏运行,这些参数会发生变化
  20. self.ship_speed_factor=2
  21. self.bullet_speed_factor = 3
  22. self.alien_speed_factor=0.5
  23. self.fleet_direction=1
  24. #1表示向右移动,-1表示向左移动
  25. self.alien_points=50
  26. def increase_speed(self):
  27. self.ship_speed_factor*=self.speedup_scale
  28. self.bullet_speed_factor*=self.speedup_scale
  29. self.alien_speed_factor*=self.speedup_scale
  30. self.alien_points=int(self.alien_points*self.score_scale)

  1. # ship.py
  2. # Copyright 2021
  3. #
  4. import pygame
  5. from pygame.sprite import Sprite
  6. class Ship(Sprite):
  7. def __init__(self,ai_settings,screen):
  8. super(Ship,self).__init__()
  9. self.screen=screen
  10. self.ai_settings=ai_settings
  11. self.image=pygame.image.load('images/ship.bmp')
  12. self.rect=self.image.get_rect()
  13. self.screen_rect=screen.get_rect()
  14. self.rect.centerx=self.screen_rect.centerx
  15. self.rect.bottom=self.screen_rect.bottom
  16. self.center=float(self.rect.centerx)
  17. self.moving_right=False
  18. self.moving_left=False
  19. def update(self):
  20. if self.moving_right and self.rect.right < self.screen_rect.right:
  21. self.center+=self.ai_settings.ship_speed_factor
  22. if self.moving_left and self.rect.left >0:
  23. self.center-=self.ai_settings.ship_speed_factor
  24. self.rect.centerx=self.center
  25. def blitme(self):
  26. self.screen.blit(self.image,self.rect)
  27. def center_ship(self):
  28. self.center=self.screen_rect.centerx

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/785394
推荐阅读
相关标签
  

闽ICP备14008679号