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的单元测试
Apr 28 Python
Python 搭建Web站点之Web服务器与Web框架
Nov 06 Python
Python numpy实现数组合并实例(vstack,hstack)
Jan 09 Python
Python获取二维矩阵每列最大值的方法
Apr 03 Python
查看Django和flask版本的方法
May 14 Python
python 利用栈和队列模拟递归的过程
May 29 Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
Jul 27 Python
python处理document文档保留原样式
Sep 23 Python
keras.layer.input()用法说明
Jun 16 Python
Python实现FTP文件定时自动下载的步骤
Dec 19 Python
python tkinter模块的简单使用
Apr 07 Python
python基础之文件操作
Oct 24 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
Win9x/ME下Apache+PHP安装配置
2006/10/09 PHP
解析smarty模板中类似for的功能实现
2013/06/18 PHP
解析PHP计算页面执行时间的实现代码
2013/06/18 PHP
PHP跨平台获取服务器IP地址自定义函数分享
2014/12/29 PHP
Javascript 面向对象特性
2009/12/28 Javascript
IE6下focus与blur错乱的解决方案
2011/07/31 Javascript
jquery实现图片裁剪思路及实现
2013/08/16 Javascript
Javascript排序算法之合并排序(归并排序)的2个例子
2014/04/04 Javascript
javascript实现iframe框架延时加载的方法
2014/10/30 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
javascript文本模板用法实例
2015/07/31 Javascript
微信小程序 生命周期详解
2016/10/12 Javascript
vue中使用refs定位dom出现undefined的解决方法
2017/12/21 Javascript
JavaScript使用math.js进行精确计算操作示例
2018/06/19 Javascript
mpvue写一个CPASS小程序的示例
2018/09/04 Javascript
关于AngularJS中几种Providers的区别总结
2020/05/17 Javascript
React倒计时功能实现代码——解耦通用
2020/09/18 Javascript
Python中查看文件名和文件路径
2017/03/31 Python
python实现单向链表详解
2018/02/08 Python
解决已经安装requests,却依然提示No module named requests问题
2018/05/18 Python
opencv python 基于KNN的手写体识别的实例
2018/08/03 Python
dpn网络的pytorch实现方式
2020/01/14 Python
django实现将修改好的新模型写入数据库
2020/03/31 Python
Python在字符串中处理html和xml的方法
2020/07/31 Python
python中使用.py配置文件的方法详解
2020/11/23 Python
俄罗斯最大的在线手表商店:Bestwatch.ru
2020/01/11 全球购物
小组口号大全
2014/06/09 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
车贷收入证明范本
2014/09/14 职场文书
八年级英语教学计划
2015/01/23 职场文书
范文之农村基层党建工作报告
2019/10/24 职场文书
Python WSGI 规范简介
2021/04/11 Python
Python如何配置环境变量详解
2021/05/18 Python
Node实现搜索框进行模糊查询
2021/06/28 Javascript
python树莓派通过队列实现进程交互的程序分析
2021/07/04 Python
asyncio异步编程之Task对象详解
2022/03/13 Python