用户:
6c0c9q查看:3 回复:1 评论:3 创建时间:2023-12-31T21:06:47
【作品展示】

【作品介绍】
一个名叫大战外星人的游戏(纯英文版)
【作品源代码】
import sys
import pygame
from settings import Settings
from game_stats import GameStats
from score_board import Scoreboard
from button import Button
from spaceShip import Ship
from bullet import Bullet
from alien import Alien
from icon import Icon
from pathlib import Path
import json
class AlienInvasion:
def __init__(self):
pygame.init()
self.game_active = False
self.clock = pygame.time.Clock()
self.settings = Settings()
if self.settings.full_screen:
self.screen = pygame.display.set_mode((0,0),pygame.FULLSCREEN)
else:
self.settings.update_screen(self)
self.screen = pygame.display.set_mode((self.settings.screen_width,self.settings.screen_height))
self.settings.update_screen(self)
pygame.display.set_caption("Alien Invation")
self.stats = GameStats(self)
self.score = Scoreboard(self)
self.ship = Ship(self)
self.bullets = pygame.sprite.Group()
self.aliens = pygame.sprite.Group()
self._create_fleet()
self.play_button = Button(self, "play",True,[self.settings.screen_width/2,self.settings.screen_height/2],200,200)
self.upgrade_score_button = Button(self,f"Upgrade score needs:{self.settings.alien_score * 15} coins",True,[self.play_button.x,self.play_button.y + 150],600,50)
self.upgrade_bullet_button = Button(self, f"Upgrade bullet needs:{self.settings.alien_score * 15} coins", True,[self.play_button.x, self.play_button.y + 150], 600, 50)
self.icon = Icon(self)
def run_game(self):
while True:
self._check_events()
if self.game_active:
self.ship.update()
self._update_bullets()
self._update_aliens()
self._update_screen()
self.clock.tick(self.settings.FPS)
self._update_screen()
def _check_events(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
self._input_high_score(self.stats.coin)
sys.exit()
if event.type == pygame.KEYDOWN:
self._check_keydown_events(event)
elif event.type == pygame.KEYUP:
self._check_keyup_events(event)
elif event.type == pygame.MOUSEBUTTONDOWN:
mouse_pos = pygame.mouse.get_pos()
self._check_button(mouse_pos,"play")
self._check_button(mouse_pos,"upgrade_score")
self._check_button(mouse_pos,"upgrade_bullet")
def _check_keydown_events(self, event):
if event.key == pygame.K_RIGHT:
self.ship.moving_right = True
elif event.key == pygame.K_LEFT:
self.ship.moving_left = True
elif event.key == pygame.K_UP:
self.ship.moving_up = True
elif event.key == pygame.K_DOWN:
self.ship.moving_down = True
elif event.key == pygame.K_SPACE:
self.fire_check = True
elif event.key == pygame.K_TAB:
self.quick_move = True
elif event.key == pygame.K_ESCAPE:
self._input_high_score(self.stats.coin)
sys.exit()
def _check_keyup_events(self, event):
if event.key == pygame.K_RIGHT:
self.ship.moving_right = False
elif event.key == pygame.K_LEFT:
self.ship.moving_left = False
elif event.key == pygame.K_UP:
self.ship.moving_up = False
elif event.key == pygame.K_DOWN:
self.ship.moving_down = False
elif event.key == pygame.K_SPACE:
if self.fire_check:
self.fire_check = False
self._double_fire_check()
elif event.key == pygame.K_TAB:
self.quick_move = False
def _fire_bullet(self, number):
i = 0
while i < number:
if len(self.bullets) < self.settings.bullets_allowed:
new_bullet = Bullet(self)
self.bullets.add(new_bullet)
i += 1
def _update_bullets(self):
self.bullets.update()
for bullet in self.bullets.copy():
if bullet.rect.bottom <= 0:
self.bullets.remove(bullet)
self._check_bullet_alien_collisions()
if not self.game_active:
self.play_button = Button(self, "play",True,[self.settings.screen_width/2,self.settings.screen_height/2],200,200)
def _create_fleet(self):
alien = Alien(self)
self.aliens.add(alien)
alien_width, alien_height = alien.rect.size
current_x, current_y = alien_width, alien_height
for y in range(5):
for x in range(8):
self._create_alien(current_x, current_y)
current_x += 2 * alien_width
current_x = alien_width
current_y += 2 * alien_height
def _create_alien(self, x_position, y_position):
new_alien = Alien(self)
new_alien.x = x_position
new_alien.rect.x = x_position
new_alien.rect.y = y_position
self.aliens.add(new_alien)
def _update_aliens(self):
self._check_fleet_edges()
self.aliens.update()
self._check_ship_alien_collision()
self._check_alien_bottom()
def _check_fleet_edges(self):
for alien in self.aliens.sprites():
if alien.check_edges():
self._change_fleet_direction()
break
def _change_fleet_direction(self):
for alien in self.aliens.sprites():
alien.rect.y += self.settings.fleet_drop_speed
self.settings.fleet_direction *= -1
def _check_bullet_alien_collisions(self):
collisions = pygame.sprite.groupcollide(self.bullets, self.aliens, True, True)
if collisions:
for aliens in collisions.values():
self.stats.score += self.settings.alien_score_true * len(aliens)
self.stats.coin += self.settings.alien_score_true * len(aliens)
self.score.prep_score()
self.score.check_high_score()
self.score.show_score()
if not self.aliens:
self.ship.__init__(self)
self.bullets.empty()
self._create_fleet()
self.settings.increase()
self.stats.level += 1
self.score.prep_score()
self.score.prep_level()
self.score.coin_warning("Level up!")
def _ship_hit(self):
if self.stats.ships_left > 0:
self.stats.ships_left -= 1
self.bullets.empty()
self.aliens.empty()
self.score.coin_warning("Ship hit!")
self.score.show_score()
self._create_fleet()
self.score.prep_ships()
self.ship.back()
self.settings.initialize_dynamic_settings()
self.stats.level = 1
self.score.prep_level()
self.score.show_score()
else:
self.game_active = False
pygame.mouse.set_visible(True)
def _update_screen(self):
self.screen.fill(self.settings.bg_color)
for bullet in self.bullets.sprites():
bullet.draw_bullet()
self.ship.built_ship()
self.aliens.draw(self.screen)
self.score.show_score()
self.icon.draw_Icon()
if not self.game_active:
self.play_button.draw_button()
self._check_coin(self.stats.coin >= self.settings.alien_score * 15 and self.settings.alien_score <= 10,self.stats.coin >= self.settings.bullets_allowed * 18 and self.settings.bullets_allowed <= 10)
pygame.display.flip()
def _check_alien_bottom(self):
for alien in self.aliens.sprites():
if alien.rect.top >= self.settings.screen_height:
alien.rect.bottom = 0
break
def _check_button(self, mouse_pos,button_name):
if button_name == "play":
if self.play_button.rect.collidepoint(mouse_pos):
self.settings.initialize_dynamic_settings()
self.stats.reset_stats()
self.game_active = True
self.score.prep_level()
self.bullets.empty()
self.aliens.empty()
self._create_fleet()
self.score.prep_score()
self.score.prep_ships()
pygame.mouse.set_visible(False)
elif button_name == "upgrade_score":
if self.upgrade_score_button.rect.collidepoint(mouse_pos):
self._upgrade_score()
elif button_name == "upgrade_bullet":
if self.upgrade_bullet_button.rect.collidepoint(mouse_pos):
self._upgrade_maxinum_bullet()
def _input_high_score(self, coin):
data = [coin, self.settings.alien_score, self.settings.bullets_allowed]
path = Path('data.json')
contents = json.dumps( data)
path.write_text(contents)
def _upgrade_score(self):
if self.stats.coin >= self.settings.alien_score * 15 and self.settings.alien_score < 10:
self.stats.coin -= self.settings.alien_score * 15
self.settings.alien_score += 1
self.settings.alien_score_true += 1
self.score.check_high_score()
elif not self.settings.alien_score < 10:
self.score.coin_warning("Upgraded to the highest level.")
else:
self.score.coin_warning("You don't have enough money!")
self.score.show_score()
def _upgrade_maxinum_bullet(self):
if self.stats.coin >= self.settings.bullets_allowed * 18 and self.settings.bullets_allowed < 10:
self.stats.coin -= self.settings.bullets_allowed * 18
self.settings.bullets_allowed += 1
self.score.check_high_score()
elif not self.settings.bullets_allowed < 10:
self.score.coin_warning("Upgraded to the highest level.")
else:
self.score.coin_warning("You don't have enough money!")
self.score.show_score()
def _check_ship_alien_collision(self):
if pygame.sprite.spritecollideany(self.ship, self.aliens):
self._ship_hit()
def _check_coin(self,enough1,enough2):
if enough1:
self.upgrade_score_button = Button(self, f"Upgrade score needs:{self.settings.alien_score * 15} coins", True,[self.play_button.x, self.play_button.y + 150],600,50)
else:
self.upgrade_score_button = Button(self, f"Upgrade score needs:{self.settings.alien_score * 15} coins", False,[self.play_button.x, self.play_button.y + 150],600,50)
self.upgrade_score_button.draw_button()
if enough2:
self.upgrade_bullet_button = Button(self, f"Upgrade bullet needs:{self.settings.bullets_allowed * 18}coins",True,[self.upgrade_score_button.x,self.upgrade_score_button.y + 60],600,50)
else:
self.upgrade_bullet_button = Button(self, f"Upgrade bullet needs:{self.settings.bullets_allowed * 18} coins",False, [self.upgrade_score_button.x, self.upgrade_score_button.y + 60], 600, 50)
self.upgrade_bullet_button.draw_button()
def _double_fire_check(self):
if self.settings.bullets_allowed > 5:
if self.settings.bullets_allowed - len(self.bullets) == 1:
self._fire_bullet(1)
else:
self._fire_bullet(2)
else:
self._fire_bullet(1)
if __name__ == "__main__":
ai = AlienInvasion()
ai.run_game()
【提示】
部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:
https://python.codemao.cn