猫史档案馆


【Python作品分享】Alian Invation

用户:6c0c9q6c0c9q查看:3 回复:1 评论:3 创建时间:2023-12-31T21:06:47


【作品展示】

center_image

 

【作品介绍】

一个名叫大战外星人的游戏(纯英文版)

 

【作品源代码】

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


回复

上一页1 页 / 共 1下一页
就在天边等待你就在天边等待你

如果我没看错的话……你是不是把所有功能全部都写到一个类里面了?

点赞0


评论