pygame 制作飞机大战项目

 我在码飞机大战的过程中许多都是参照书本做的,但是又许多不是按照书本做,我看了B站,看了这个论坛里一些大佬的作品,然后也融入了自己逊色的敲码水平,这个作品可以说是集大成。断断续续的学习了一年多也通过这个发布第一个作品。以前总是盲目的学习,然而我本人也没能够从这些盲目的学习中获得成就感,也正是通过这个作品,是我的学习目标清晰了许多。我期许着,我不用成为大佬,只要为我的生活上,工作上带来便利即可,的那种水平。

主程序:alien_invasion

import sys
import pygame
from settings import Settings
from ship import Ship
from bullet import Bullet
from alien import Alien
from botton import Botton
from score import Score
from game_end import End_screen

class AlienInvasion():
    def __init__(self):
        pygame.init()
        self.settings = Settings()
        self.screen = pygame.display.set_mode((self.settings.screen_width,self.settings.screen_height))
        pygame.display.set_caption("AI")
        self.ship = Ship(self)
        self.bullets = pygame.sprite.Group()#记得加括号
        self.aliens = pygame.sprite.Group()
        self.ships = pygame.sprite.Group()
        self.bottons = pygame.sprite.Group()

        self.sb = Score(self)
        self.end_screen = End_screen(self)

        ship = Ship(self)
        self.ships.add(ship)

        botton = Botton(self,)
        self.bottons.add(botton)

    def many_alien(self):
        alien = Alien(self)
        self.aliens.add(alien)

    def fire_bullet(self):
        new_bullet = Bullet(self)
        self.bullets.add(new_bullet)

    def run_game(self):
        while True:
            self._chek_bullet_alien_collision()
            self.bullets.update()
            self.move_fly()
            self.design_screen()


    def move_fly(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            # 飞船向右移动
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    self.ship.right_moving = True

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_RIGHT:
                    self.ship.right_moving = False
            # 飞船向左移动
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    self.ship.left_moving = True
                if event.key == pygame.K_SPACE:
                    self.fire_bullet()

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT:
                    self.ship.left_moving = False
            if event.type == pygame.USEREVENT:
                self.many_alien()

            if event.type ==pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                self.settings.a += 1
                print(self.settings.a)
                if self.settings.a == 1:
                #mouse_pos[0] 是点击鼠标的横坐标,mouse_pos[1]是点击鼠标的纵坐标
                    if 566 < mouse_pos[0] <635 and  333 < mouse_pos[1] < 367:
                        # 每隔一段时间就创建一个外星人,可以修改外星人创建的时间
                        pygame.time.set_timer(pygame.USEREVENT, self.settings.creat_alien)

            if event.type == pygame.MOUSEBUTTONDOWN:
                # mouse_pos[0] 是点击鼠标的横坐标,mouse_pos[1]是点击鼠标的纵坐标
                if 566 < mouse_pos[0] < 635 and 333 < mouse_pos[1] < 367:
                    # 点击鼠标后按钮消失
                    self.bottons.empty()


    def _chek_bullet_alien_collision(self):
        self.collapse = pygame.sprite.groupcollide(self.bullets, self.aliens, True, True)
        if self.collapse:
            self.settings.stats_score += 1
            self.sb.prep_score()

        enemies = pygame.sprite.spritecollide(self.ship, self.aliens, True)
        if len(enemies) > 0:
            self.settings.time = True
            pygame.time.set_timer(pygame.USEREVENT, 0)

    def design_screen(self):
        self.screen.fill(self.settings.bg_color)
        self.ship.update()
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()
            if bullet.rect.y <= 0:
                self.bullets.remove(bullet)
        #按钮
        self.bottons.update()
        self.aliens.update()
        self.sb.update()
        if self.settings.time == True:
            self.end_screen.update()
        pygame.display.flip()


if __name__ == '__main__':
    ai = AlienInvasion()
    ai.run_game()

子程序设置:settings

class Settings():

    def __init__(self):
        self.screen_width = 1200
        self.screen_height = 700
        self.bg_color = (230,230,230)
        #子弹设置
        self.bullet_speed = 1
        self.bullet_width = 3
        self.bullet_height = 15
        self.bullet_color = (60,60,60)
        #外星人速度
        self.alien_speed_x = 1
        #时间

        self.creat_alien = 200

        #分数  
'''我发现不管这个参数放在主函数,'''
        '''还是放在score中都不行,我觉得应该是放在两者之间不行,应该放在一个两者都不相关的函数中'''
        self.stats_score = 0

        self.time = False

        self.a = 0

子程序飞机:ship

import sys
import pygame
from pygame.sprite import Sprite

class Ship(Sprite):
    def __init__(self,ai_game):
        super().__init__()
        self.screen = ai_game.screen
        self.screen_rect = self.screen.get_rect()
        #这里填上地址,相对地址,绝对地址都行,随你
        self.image = pygame.image.load(
            'C:/Users/我是弱智/Downloads/《Python编程》源代码文件-更新/《Python编程》源代码文件/chapter_12/images/ship.bmp')
        # 获取飞机坐标
        self.rect = self.image.get_rect()
        self.rect.midbottom = self.screen_rect.midbottom
        self.right_moving = False
        self.left_moving = False

    def update(self):
        if self.right_moving == True:
            self.rect.x += 1

        if self.left_moving == True:
            self.rect.x -= 1

        self.screen.blit(self.image, self.rect)


    def x_speed_fly(self):
        self.rect.x += x_speed



外星人:alien

import pygame
from pygame.sprite import Sprite
import random

class Alien(Sprite):
    def __init__(self,ai_game):
        super().__init__()
        self.screen = ai_game.screen
        self.settings = ai_game.settings
        self.ship = ai_game.ship
        self.image = pygame.image.load(
            'C:/Users/我是弱智/Downloads/《Python编程》源代码文件-更新/《Python编程》源代码文件/chapter_13/images/alien.bmp')
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(0,1200)
 


    def update(self):

        self.screen.blit(self.image, self.rect)
        self.rect.y += self.settings.alien_speed_x

        if self.rect.bottom > self.ship.screen_rect.bottom :
            self.kill()
        if self.rect.left < self.ship.screen_rect.left:
            self.kill()
        if self.rect.right > self.ship.screen_rect.right:
            self.kill()

子程序子弹:bullet

import pygame
from pygame.sprite import Sprite
from ship import Ship
class Bullet(Sprite):
    def __init__(self,ai_game):
        super().__init__()
        self.screen = ai_game.screen
        self.settings = ai_game.settings
        self.ship = ai_game.ship
        self.color = self.settings.bullet_color
        self.rect = pygame.Rect(0,0,self.settings.bullet_width,self.settings.bullet_height)
        self.rect.midtop = self.ship.rect.midtop
    def update(self):
        self.rect.y-= self.settings.bullet_speed

    def draw_bullet(self):
        # 在屏幕绘子弹
        pygame.draw.rect(self.screen, self.color, self.rect)

子程序按钮:botton

import pygame
from pygame.sprite import Sprite
class Botton(Sprite):
    def __init__(self,ai_game):
        super().__init__()
        self.screen = ai_game.screen
        self.ship = ai_game.ship
        self.settings = ai_game.settings

        self.rect = pygame.Rect(0,0,50,60)
        self.rect.center = self.ship.screen_rect.center
        self.prep_botton()

    def prep_botton(self):
        self.font = pygame.font.SysFont(None,48)
        self.font_image = self.font.render('Play',True,(0,0,250))
        self.font_rect = self.font_image.get_rect()
        self.font_rect.center = self.rect.center

    def update(self):
        self.screen.blit(self.font_image,self.font_rect

子程序分数记录:score

import pygame

class Score():
    def __init__(self,ai_game):
        super().__init__()
        self.screen = ai_game.screen
        self.ship = ai_game.ship
        self.settings = ai_game.settings

        self.font = pygame.font.SysFont(None, 48)
        self.prep_score()

    def prep_score(self):
        score_str = str(self.settings.stats_score)
        self.font_score = self.font.render(score_str,True,(0,0,250))
        #获取字体坐标
        self.score_rect = self.font_score.get_rect()
        self.score_rect.right = self.ship.screen_rect.right

    def update(self):
        self.screen.blit(self.font_score,self.score_rect)

子程序游戏结束:game-end

import pygame

class End_screen():
    def __init__(self,ai_game):
        super().__init__()
        self.screen = ai_game.screen
        self.ship = ai_game.ship
        self.settings = ai_game.settings

        self.font = pygame.font.SysFont(None, 48)
        self._prep_end()

    def _prep_end(self):
        self.font_end = self.font.render('game over', True, (0, 0, 250))
        self.score_rect = self.font_end.get_rect()
        self.score_rect.center = self.ship.screen_rect.center

    def update(self):
        self.screen.blit(self.font_end, self.score_rect)

 

 注:图片出处在《Python》编程

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值