我在码飞机大战的过程中许多都是参照书本做的,但是又许多不是按照书本做,我看了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》编程