python实现飞船大战


Posted in Python onApril 24, 2020

本文实例为大家分享了python实现飞船大战的具体代码,供大家参考,具体内容如下

上篇博文我们一起实现了贪吃蛇与坦克大战

效果图

python实现飞船大战

按住上下左右键可以让贪吃蛇运动

效果图

python实现飞船大战

可以按住上下左右方向键以及WSAD让坦克运动
按0和j可以发射子弹。
具体代码与图片音源文件可以从我的GitHub地址获取,欢迎star

接下来我们来实现一个飞船大战的游戏

创建飞船类

import pygame
from pygame.sprite import Sprite

class Ship(Sprite):

  def __init__(self, ai_settings, screen):
    """Initialize the ship, and set its starting position."""
    super(Ship, self).__init__()
    self.screen = screen
    self.ai_settings = ai_settings

    # Load the ship image, and get its rect.
    self.image = pygame.image.load('images/ship.bmp')
    self.rect = self.image.get_rect()
    self.screen_rect = screen.get_rect()

    # Start each new ship at the bottom center of the screen.
    self.rect.centerx = self.screen_rect.centerx
    self.rect.bottom = self.screen_rect.bottom
    
    # Store a decimal value for the ship's center.
    self.center = float(self.rect.centerx)
    
    # Movement flags.
    self.moving_right = False
    self.moving_left = False
    
  def center_ship(self):
    """Center the ship on the screen."""
    self.center = self.screen_rect.centerx
    
  def update(self):
    """Update the ship's position, based on movement flags."""
    # Update the ship's center value, not the rect.
    if self.moving_right and self.rect.right < self.screen_rect.right:
      self.center += self.ai_settings.ship_speed_factor
    if self.moving_left and self.rect.left > 0:
      self.center -= self.ai_settings.ship_speed_factor
      
    # Update rect object from self.center.
    self.rect.centerx = self.center

  def blitme(self):
    """Draw the ship at its current location."""
    self.screen.blit(self.image, self.rect)

创建设置类

class Settings():
  """A class to store all settings for Alien Invasion."""

  def __init__(self):
    """Initialize the game's static settings."""
    # Screen settings.
    self.screen_width = 1200
    self.screen_height = 800
    self.bg_color = (230, 230, 230)
    
    # Ship settings.
    self.ship_limit = 3
      
    # Bullet settings.
    self.bullet_width = 3
    self.bullet_height = 15
    self.bullet_color = 60, 60, 60
    self.bullets_allowed = 3
    
    # Alien settings.
    self.fleet_drop_speed = 10
      
    # How quickly the game speeds up.
    self.speedup_scale = 1.1
    # How quickly the alien point values increase.
    self.score_scale = 1.5
  
    self.initialize_dynamic_settings()

  def initialize_dynamic_settings(self):
    """Initialize settings that change throughout the game."""
    self.ship_speed_factor = 1.5
    self.bullet_speed_factor = 3
    self.alien_speed_factor = 1
    
    # Scoring.
    self.alien_points = 50
  
    # fleet_direction of 1 represents right, -1 represents left.
    self.fleet_direction = 1
    
  def increase_speed(self):
    """Increase speed settings and alien point values."""
    self.ship_speed_factor *= self.speedup_scale
    self.bullet_speed_factor *= self.speedup_scale
    self.alien_speed_factor *= self.speedup_scale
    
    self.alien_points = int(self.alien_points * self.score_scale)

创建子弹类

import pygame
from pygame.sprite import Sprite

class Bullet(Sprite):
  """A class to manage bullets fired from the ship."""

  def __init__(self, ai_settings, screen, ship):
    """Create a bullet object, at the ship's current position."""
    super(Bullet, self).__init__()
    self.screen = screen

    # Create bullet rect at (0, 0), then set correct position.
    self.rect = pygame.Rect(0, 0, ai_settings.bullet_width,
      ai_settings.bullet_height)
    self.rect.centerx = ship.rect.centerx
    self.rect.top = ship.rect.top
    
    # Store a decimal value for the bullet's position.
    self.y = float(self.rect.y)

    self.color = ai_settings.bullet_color
    self.speed_factor = ai_settings.bullet_speed_factor

  def update(self):
    """Move the bullet up the screen."""
    # Update the decimal position of the bullet.
    self.y -= self.speed_factor
    # Update the rect position.
    self.rect.y = self.y

  def draw_bullet(self):
    """Draw the bullet to the screen."""
    pygame.draw.rect(self.screen, self.color, self.rect)

创建游戏功能类

import sys
from time import sleep

import pygame

from bullet import Bullet
from alien import Alien

def check_keydown_events(event, ai_settings, screen, ship, bullets):
  """Respond to keypresses."""
  if event.key == pygame.K_RIGHT:
    ship.moving_right = True
  elif event.key == pygame.K_LEFT:
    ship.moving_left = True
  elif event.key == pygame.K_SPACE:
    fire_bullet(ai_settings, screen, ship, bullets)
  elif event.key == pygame.K_q:
    sys.exit()
    
def check_keyup_events(event, ship):
  """Respond to key releases."""
  if event.key == pygame.K_RIGHT:
    ship.moving_right = False
  elif event.key == pygame.K_LEFT:
    ship.moving_left = False

def check_events(ai_settings, screen, stats, sb, play_button, ship, aliens,
    bullets):
  """Respond to keypresses and mouse events."""
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      sys.exit()
    elif event.type == pygame.KEYDOWN:
      check_keydown_events(event, ai_settings, screen, ship, bullets)
    elif event.type == pygame.KEYUP:
      check_keyup_events(event, ship)
    elif event.type == pygame.MOUSEBUTTONDOWN:
      mouse_x, mouse_y = pygame.mouse.get_pos()
      check_play_button(ai_settings, screen, stats, sb, play_button,
        ship, aliens, bullets, mouse_x, mouse_y)
      
def check_play_button(ai_settings, screen, stats, sb, play_button, ship,
    aliens, bullets, mouse_x, mouse_y):
  """Start a new game when the player clicks Play."""
  button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)
  if button_clicked and not stats.game_active:
    # Reset the game settings.
    ai_settings.initialize_dynamic_settings()
    
    # Hide the mouse cursor.
    pygame.mouse.set_visible(False)
    
    # Reset the game statistics.
    stats.reset_stats()
    stats.game_active = True
    
    # Reset the scoreboard images.
    sb.prep_score()
    sb.prep_high_score()
    sb.prep_level()
    sb.prep_ships()
    
    # Empty the list of aliens and bullets.
    aliens.empty()
    bullets.empty()
    
    # Create a new fleet and center the ship.
    create_fleet(ai_settings, screen, ship, aliens)
    ship.center_ship()

def fire_bullet(ai_settings, screen, ship, bullets):
  """Fire a bullet, if limit not reached yet."""
  # Create a new bullet, add to bullets group.
  if len(bullets) < ai_settings.bullets_allowed:
    new_bullet = Bullet(ai_settings, screen, ship)
    bullets.add(new_bullet)

def update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets,
    play_button):
  """Update images on the screen, and flip to the new screen."""
  # Redraw the screen, each pass through the loop.
  screen.fill(ai_settings.bg_color)
  
  # Redraw all bullets, behind ship and aliens.
  for bullet in bullets.sprites():
    bullet.draw_bullet()
  ship.blitme()
  aliens.draw(screen)
  
  # Draw the score information.
  sb.show_score()
  
  # Draw the play button if the game is inactive.
  if not stats.game_active:
    play_button.draw_button()

  # Make the most recently drawn screen visible.
  pygame.display.flip()
  
def update_bullets(ai_settings, screen, stats, sb, ship, aliens, bullets):
  """Update position of bullets, and get rid of old bullets."""
  # Update bullet positions.
  bullets.update()

  # Get rid of bullets that have disappeared.
  for bullet in bullets.copy():
    if bullet.rect.bottom <= 0:
      bullets.remove(bullet)
      
  check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship,
    aliens, bullets)
    
def check_high_score(stats, sb):
  """Check to see if there's a new high score."""
  if stats.score > stats.high_score:
    stats.high_score = stats.score
    sb.prep_high_score()
      
def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship,
    aliens, bullets):
  """Respond to bullet-alien collisions."""
  # Remove any bullets and aliens that have collided.
  collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
  
  if collisions:
    for aliens in collisions.values():
      stats.score += ai_settings.alien_points * len(aliens)
      sb.prep_score()
    check_high_score(stats, sb)
  
  if len(aliens) == 0:
    # If the entire fleet is destroyed, start a new level.
    bullets.empty()
    ai_settings.increase_speed()
    
    # Increase level.
    stats.level += 1
    sb.prep_level()
    
    create_fleet(ai_settings, screen, ship, aliens)
  
def check_fleet_edges(ai_settings, aliens):
  """Respond appropriately if any aliens have reached an edge."""
  for alien in aliens.sprites():
    if alien.check_edges():
      change_fleet_direction(ai_settings, aliens)
      break
    
def change_fleet_direction(ai_settings, aliens):
  """Drop the entire fleet, and change the fleet's direction."""
  for alien in aliens.sprites():
    alien.rect.y += ai_settings.fleet_drop_speed
  ai_settings.fleet_direction *= -1
  
def ship_hit(ai_settings, screen, stats, sb, ship, aliens, bullets):
  """Respond to ship being hit by alien."""
  if stats.ships_left > 0:
    # Decrement ships_left.
    stats.ships_left -= 1
    
    # Update scoreboard.
    sb.prep_ships()
    
  else:
    stats.game_active = False
    pygame.mouse.set_visible(True)
  
  # Empty the list of aliens and bullets.
  aliens.empty()
  bullets.empty()
  
  # Create a new fleet, and center the ship.
  create_fleet(ai_settings, screen, ship, aliens)
  ship.center_ship()
  
  # Pause.
  sleep(0.5)
  
def check_aliens_bottom(ai_settings, screen, stats, sb, ship, aliens,
    bullets):
  """Check if any aliens have reached the bottom of the screen."""
  screen_rect = screen.get_rect()
  for alien in aliens.sprites():
    if alien.rect.bottom >= screen_rect.bottom:
      # Treat this the same as if the ship got hit.
      ship_hit(ai_settings, screen, stats, sb, ship, aliens, bullets)
      break
      
def update_aliens(ai_settings, screen, stats, sb, ship, aliens, bullets):
  """
  Check if the fleet is at an edge,
   then update the postions of all aliens in the fleet.
  """
  check_fleet_edges(ai_settings, aliens)
  aliens.update()
  
  # Look for alien-ship collisions.
  if pygame.sprite.spritecollideany(ship, aliens):
    ship_hit(ai_settings, screen, stats, sb, ship, aliens, bullets)

  # Look for aliens hitting the bottom of the screen.
  check_aliens_bottom(ai_settings, screen, stats, sb, ship, aliens, bullets)
      
def get_number_aliens_x(ai_settings, alien_width):
  """Determine the number of aliens that fit in a row."""
  available_space_x = ai_settings.screen_width - 2 * alien_width
  number_aliens_x = int(available_space_x / (2 * alien_width))
  return number_aliens_x
  
def get_number_rows(ai_settings, ship_height, alien_height):
  """Determine the number of rows of aliens that fit on the screen."""
  available_space_y = (ai_settings.screen_height -
              (3 * alien_height) - ship_height)
  number_rows = int(available_space_y / (2 * alien_height))
  return number_rows
  
def create_alien(ai_settings, screen, aliens, alien_number, row_number):
  """Create an alien, and place it in the row."""
  alien = Alien(ai_settings, screen)
  alien_width = alien.rect.width
  alien.x = alien_width + 2 * alien_width * alien_number
  alien.rect.x = alien.x
  alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
  aliens.add(alien)

def create_fleet(ai_settings, screen, ship, aliens):
  """Create a full fleet of aliens."""
  # Create an alien, and find number of aliens in a row.
  alien = Alien(ai_settings, screen)
  number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width)
  number_rows = get_number_rows(ai_settings, ship.rect.height,
    alien.rect.height)
  
  # Create the fleet of aliens.
  for row_number in range(number_rows):
    for alien_number in range(number_aliens_x):
      create_alien(ai_settings, screen, aliens, alien_number,
        row_number)

主函数

import pygame
from pygame.sprite import Group

from settings import Settings
from game_stats import GameStats
from scoreboard import Scoreboard
from button import Button
from ship import Ship
import game_functions as gf

def run_game():
  # Initialize pygame, settings, and screen object.
  pygame.init()
  ai_settings = Settings()
  screen = pygame.display.set_mode(
    (ai_settings.screen_width, ai_settings.screen_height))
  pygame.display.set_caption("Alien Invasion")
  
  # Make the Play button.
  play_button = Button(ai_settings, screen, "Play")
  
  # Create an instance to store game statistics, and a scoreboard.
  stats = GameStats(ai_settings)
  sb = Scoreboard(ai_settings, screen, stats)
  
  # Set the background color.
  bg_color = (230, 230, 230)
  
  # Make a ship, a group of bullets, and a group of aliens.
  ship = Ship(ai_settings, screen)
  bullets = Group()
  aliens = Group()
  
  # Create the fleet of aliens.
  gf.create_fleet(ai_settings, screen, ship, aliens)

  # Start the main loop for the game.
  while True:
    gf.check_events(ai_settings, screen, stats, sb, play_button, ship,
      aliens, bullets)
    
    if stats.game_active:
      ship.update()
      gf.update_bullets(ai_settings, screen, stats, sb, ship, aliens,
        bullets)
      gf.update_aliens(ai_settings, screen, stats, sb, ship, aliens,
        bullets)
    
    gf.update_screen(ai_settings, screen, stats, sb, ship, aliens,
      bullets, play_button)

run_game()

创建外星人类

import pygame
from pygame.sprite import Sprite

class Alien(Sprite):
  """A class to represent a single alien in the fleet."""

  def __init__(self, ai_settings, screen):
    """Initialize the alien, and set its starting position."""
    super(Alien, self).__init__()
    self.screen = screen
    self.ai_settings = ai_settings

    # Load the alien image, and set its rect attribute.
    self.image = pygame.image.load('images/alien.bmp')
    self.rect = self.image.get_rect()

    # Start each new alien near the top left of the screen.
    self.rect.x = self.rect.width
    self.rect.y = self.rect.height

    # Store the alien's exact position.
    self.x = float(self.rect.x)
    
  def check_edges(self):
    """Return True if alien is at edge of screen."""
    screen_rect = self.screen.get_rect()
    if self.rect.right >= screen_rect.right:
      return True
    elif self.rect.left <= 0:
      return True
    
  def update(self):
    """Move the alien right or left."""
    self.x += (self.ai_settings.alien_speed_factor *
            self.ai_settings.fleet_direction)
    self.rect.x = self.x

  def blitme(self):
    """Draw the alien at its current location."""
    self.screen.blit(self.image, self.rect)

创建游戏开始按钮

import pygame.font

class Button():

  def __init__(self, ai_settings, screen, msg):
    """Initialize button attributes."""
    self.screen = screen
    self.screen_rect = screen.get_rect()
    
    # Set the dimensions and properties of the button.
    self.width, self.height = 200, 50
    self.button_color = (0, 255, 0)
    self.text_color = (255, 255, 255)
    self.font = pygame.font.SysFont(None, 48)
    
    # Build the button's rect object, and center it.
    self.rect = pygame.Rect(0, 0, self.width, self.height)
    self.rect.center = self.screen_rect.center
    
    # The button message only needs to be prepped once.
    self.prep_msg(msg)

  def prep_msg(self, msg):
    """Turn msg into a rendered image, and center text on the button."""
    self.msg_image = self.font.render(msg, True, self.text_color,
      self.button_color)
    self.msg_image_rect = self.msg_image.get_rect()
    self.msg_image_rect.center = self.rect.center
    
  def draw_button(self):
    # Draw blank button, then draw message.
    self.screen.fill(self.button_color, self.rect)
    self.screen.blit(self.msg_image, self.msg_image_rect)

创建游戏状态类

class GameStats():
  """Track statistics for Alien Invasion."""
  
  def __init__(self, ai_settings):
    """Initialize statistics."""
    self.ai_settings = ai_settings
    self.reset_stats()
    
    # Start game in an inactive state.
    self.game_active = False
    
    # High score should never be reset.
    self.high_score = 0
    
  def reset_stats(self):
    """Initialize statistics that can change during the game."""
    self.ships_left = self.ai_settings.ship_limit
    self.score = 0
    self.level = 1

创建计分板

import pygame.font
from pygame.sprite import Group

from ship import Ship

class Scoreboard():
  """A class to report scoring information."""

  def __init__(self, ai_settings, screen, stats):
    """Initialize scorekeeping attributes."""
    self.screen = screen
    self.screen_rect = screen.get_rect()
    self.ai_settings = ai_settings
    self.stats = stats
    
    # Font settings for scoring information.
    self.text_color = (30, 30, 30)
    self.font = pygame.font.SysFont(None, 48)

    # Prepare the initial score images.
    self.prep_score()
    self.prep_high_score()
    self.prep_level()
    self.prep_ships()

  def prep_score(self):
    """Turn the score into a rendered image."""
    rounded_score = int(round(self.stats.score, -1))
    score_str = "{:,}".format(rounded_score)
    self.score_image = self.font.render(score_str, True, self.text_color,
      self.ai_settings.bg_color)
      
    # Display the score at the top right of the screen.
    self.score_rect = self.score_image.get_rect()
    self.score_rect.right = self.screen_rect.right - 20
    self.score_rect.top = 20
    
  def prep_high_score(self):
    """Turn the high score into a rendered image."""
    high_score = int(round(self.stats.high_score, -1))
    high_score_str = "{:,}".format(high_score)
    self.high_score_image = self.font.render(high_score_str, True,
      self.text_color, self.ai_settings.bg_color)
        
    # Center the high score at the top of the screen.
    self.high_score_rect = self.high_score_image.get_rect()
    self.high_score_rect.centerx = self.screen_rect.centerx
    self.high_score_rect.top = self.score_rect.top
    
  def prep_level(self):
    """Turn the level into a rendered image."""
    self.level_image = self.font.render(str(self.stats.level), True,
        self.text_color, self.ai_settings.bg_color)
    
    # Position the level below the score.
    self.level_rect = self.level_image.get_rect()
    self.level_rect.right = self.score_rect.right
    self.level_rect.top = self.score_rect.bottom + 10
    
  def prep_ships(self):
    """Show how many ships are left."""
    self.ships = Group()
    for ship_number in range(self.stats.ships_left):
      ship = Ship(self.ai_settings, self.screen)
      ship.rect.x = 10 + ship_number * ship.rect.width
      ship.rect.y = 10
      self.ships.add(ship)
    
  def show_score(self):
    """Draw score to the screen."""
    self.screen.blit(self.score_image, self.score_rect)
    self.screen.blit(self.high_score_image, self.high_score_rect)
    self.screen.blit(self.level_image, self.level_rect)
    # Draw ships.
    self.ships.draw(self.screen)

程序运行效果如下

点击play

python实现飞船大战

python实现飞船大战

按住方向键可以移动飞船
按住空格键可以发射子弹

更多有趣的经典小游戏实现专题,分享给大家:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python isinstance函数介绍
Apr 14 Python
理解Python中的With语句
Mar 18 Python
浅析Python中元祖、列表和字典的区别
Aug 17 Python
numpy自动生成数组详解
Dec 15 Python
使用PyInstaller将python转成可执行文件exe笔记
May 26 Python
python numpy和list查询其中某个数的个数及定位方法
Jun 27 Python
python3中函数参数的四种简单用法
Jul 09 Python
python线程的几种创建方式详解
Aug 29 Python
Python如何在windows环境安装pip及rarfile
Jun 15 Python
python openpyxl模块的使用详解
Feb 25 Python
一行代码python实现文件共享服务器
Apr 22 Python
python 判断文件或文件夹是否存在
Mar 18 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
Apr 24 #Python
pycharm下pyqt4安装及环境配置的教程
Apr 24 #Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
Apr 24 #Python
Python读入mnist二进制图像文件并显示实例
Apr 24 #Python
python实现坦克大战
Apr 24 #Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
Apr 24 #Python
python实现读取类别频数数据画水平条形图案例
Apr 24 #Python
You might like
PHP MYSQL乱码问题,使用SET NAMES utf8校正
2009/11/30 PHP
php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
2011/10/29 PHP
php中eval函数的危害与正确禁用方法
2014/06/30 PHP
Yii 2.0在Grid中格式化时间方法示例
2017/06/06 PHP
Javascript 模式实例 观察者模式
2009/10/24 Javascript
JS动态获取当前时间,并写到特定的区域
2013/05/03 Javascript
关于JS中的闭包浅谈
2013/08/23 Javascript
javascript获取所有同类checkbox选项(实例代码)
2013/11/07 Javascript
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
屏蔽相应键盘按钮操作
2014/03/10 Javascript
javascript对浅拷贝和深拷贝的详解
2016/10/14 Javascript
jquery.multiselect多选下拉框实现代码
2016/11/11 Javascript
jQuery实现的背景颜色渐变动画效果示例
2017/03/24 jQuery
详解微信小程序Radio选中样式切换
2017/07/06 Javascript
vuex实现及简略解析(小结)
2019/03/01 Javascript
详解Vue-Router源码分析路由实现原理
2019/05/15 Javascript
教你如何用Node实现API的转发(某音乐)
2019/09/20 Javascript
微信小程序云函数添加数据到数据库的方法
2020/03/04 Javascript
Python计算三角函数之asin()方法的使用
2015/05/15 Python
Python爬取网易云音乐上评论火爆的歌曲
2017/01/19 Python
Python Nose框架编写测试用例方法
2017/10/26 Python
Python使用numpy实现BP神经网络
2018/03/10 Python
使用Django连接Mysql数据库步骤
2019/01/15 Python
Python 中包/模块的 `import` 操作代码
2019/04/22 Python
Python企业编码生成系统之系统主要函数设计详解
2019/07/26 Python
python实现实时视频流播放代码实例
2020/01/11 Python
python 连续不等式语法糖实例
2020/04/15 Python
Fnac西班牙官网:法国文化和电子产品零售商
2021/03/14 全球购物
财经学院自荐信范文
2014/02/02 职场文书
中学生自我鉴定
2014/02/04 职场文书
《那片绿绿的爬山虎》教学反思
2014/02/27 职场文书
病媒生物防治方案
2014/05/13 职场文书
镇党委书记群众路线整改措施思想汇报
2014/10/13 职场文书
市委常委会班子党的群众路线教育实践活动整改方案
2014/10/25 职场文书
食品卫生管理制度
2015/08/06 职场文书
Go中的条件语句Switch示例详解
2021/08/23 Golang