作者 | AI进阶者

责编 | 郭芮

出品 | CSDN 博客

本文用Python来实现一个飞船大战的游戏,话不多说,直入主题!

创建飞船类

import pygame
from pygame.sprite import Spriteclass Ship(Sprite):def __init__(self, ai_settings, screen):"""Initialize the ship, and set its starting position."""super(Ship, self).__init__()self.screen = screenself.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.centerxself.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 = Falseself.moving_left = Falsedef center_ship(self):"""Center the ship on the screen."""self.center = self.screen_rect.centerxdef 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_factorif 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.centerdef 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 = 1200self.screen_height = 800self.bg_color = (230, 230, 230)# Ship settings.self.ship_limit = 3# Bullet settings.self.bullet_width = 3self.bullet_height = 15self.bullet_color = 60, 60, 60self.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.5self.initialize_dynamic_settings()def initialize_dynamic_settings(self):"""Initialize settings that change throughout the game."""self.ship_speed_factor = 1.5self.bullet_speed_factor = 3self.alien_speed_factor = 1# Scoring.self.alien_points = 50# fleet_direction of 1 represents right, -1 represents left.self.fleet_direction = 1def increase_speed(self):"""Increase speed settings and alien point values."""self.ship_speed_factor *= self.speedup_scaleself.bullet_speed_factor *= self.speedup_scaleself.alien_speed_factor *= self.speedup_scaleself.alien_points = int(self.alien_points * self.score_scale)

创建子弹类

import pygame
from pygame.sprite import Spriteclass 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.centerxself.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_colorself.speed_factor = ai_settings.bullet_speed_factordef 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.ydef draw_bullet(self):"""Draw the bullet to the screen."""pygame.draw.rect(self.screen, self.color, self.rect)

创建游戏功能类

import sys
from time import sleepimport pygamefrom bullet import Bullet
from alien import Aliendef check_keydown_events(event, ai_settings, screen, ship, bullets):"""Respond to keypresses."""if event.key == pygame.K_RIGHT:ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Trueelif 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 = Falseelif event.key == pygame.K_LEFT:ship.moving_left = Falsedef 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.scoresb.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 += 1sb.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)breakdef 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_speedai_settings.fleet_direction *= -1def 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 = Falsepygame.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)breakdef 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_widthnumber_aliens_x = int(available_space_x / (2 * alien_width))return number_aliens_xdef 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_rowsdef 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.widthalien.x = alien_width + 2 * alien_width * alien_numberalien.rect.x = alien.xalien.rect.y = alien.rect.height + 2 * alien.rect.height * row_numberaliens.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 Groupfrom settings import Settings
from game_stats import GameStats
from scoreboard import Scoreboard
from button import Button
from ship import Ship
import game_functions as gfdef 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 Spriteclass 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 = screenself.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.widthself.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 Trueelif self.rect.left <= 0:return Truedef 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.xdef blitme(self):"""Draw the alien at its current location."""self.screen.blit(self.image, self.rect)

创建游戏开始按钮

import pygame.fontclass Button():def __init__(self, ai_settings, screen, msg):"""Initialize button attributes."""self.screen = screenself.screen_rect = screen.get_rect()# Set the dimensions and properties of the button.self.width, self.height = 200, 50self.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.centerdef 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_settingsself.reset_stats()# Start game in an inactive state.self.game_active = False# High score should never be reset.self.high_score = 0def reset_stats(self):"""Initialize statistics that can change during the game."""self.ships_left = self.ai_settings.ship_limitself.score = 0self.level = 1

创建计分板

import pygame.font
from pygame.sprite import Groupfrom ship import Shipclass Scoreboard():"""A class to report scoring information."""def __init__(self, ai_settings, screen, stats):"""Initialize scorekeeping attributes."""self.screen = screenself.screen_rect = screen.get_rect()self.ai_settings = ai_settingsself.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 - 20self.score_rect.top = 20def 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.centerxself.high_score_rect.top = self.score_rect.topdef 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.rightself.level_rect.top = self.score_rect.bottom + 10def 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.widthship.rect.y = 10self.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:

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

声明:本文为CSDN博主「AI进阶者」原创文章,仅用于技术交流。

想为博主点赞?

想要请教博主?

扫描下方二维码,快速获取与博主直面沟通的方式吧!

热 文 推 荐 

☞达摩院 2020 预测:模块化降低芯片设计门槛 | 问底中国 IT 技术演进

☞只十分钟,唾手可得的工作机会就被我搞砸了!

☞Rust 入坑指南:鳞次栉比 | CSDN 博文精选

☞中国程序员在美遭抢劫电脑遇害,数百人悼念

☞2019,不可错过的NLP“高光时刻”

☞详解CPU几个重点基础知识

☞在以太坊上开发 Dapp 的瓶颈和门槛有哪些? | 博文精选

你点的每个“在看”,我都认真当成了喜欢

利用 Python 制作酷炫的飞船大战!|原力计划相关推荐

  1. opencv极坐标转换成直角坐标_媲美 PS,用 Python 制作酷炫极坐标全景图

    点击上方"Python数据之道",选择"星标公众号" 收藏文章的同时,不要忘记「在看」 媲美 PS, 用 Python 制作酷炫极坐标全景图 0 概述  今天要 ...

  2. Python 图像 一样大小_媲美 PS,用 Python 制作酷炫极坐标全景图

    点击上方"Python数据之道",选择"星标公众号" 收藏文章的同时,不要忘记「在看」 媲美 PS, 用 Python 制作酷炫极坐标全景图 0 概述  今天要 ...

  3. python画车辆轨迹图_如何利用 Python 绘制酷炫的 车辆轨迹 — 速度时空图?三维数据用二维图像呈现...

    说明:本文系交通攻城狮原创文章,如需转载请私信联系,侵权必究. 2020,第 30 期,编程笔记 建议直接阅读精编版:如何利用 Python 绘制酷炫的 车辆轨迹 - 速度时空图?三维数据用二维图像呈 ...

  4. 使用Python制作酷炫二维码(myqr)

    使用Python制作酷炫二维码 本篇参考自微信公众号,二三四张图片有改博主知乎的链接哦,https://mp.weixin.qq.com/s/Fq6_KKeN5T28DbfyDsGYDw 平时你见到的 ...

  5. Python制作酷炫的动画效果

    1 引言 利用Python的Matplotlib-Animation库可以制作酷炫的数学公式动画,官方教程可访问链接. 本文为了清晰说明如何利用Animation类来实现动画效果,这里采用介绍一个点沿 ...

  6. 专属微信二维码python制作_教你使用Python制作酷炫二维码

    这篇文章讲的是如何利用python制作狂拽酷炫吊炸天的二维码,非常有趣哦! 可能你见过的二维码大多长这样: 稍微好看点的长这样: 普普通通,平平凡凡,没什么特色... 但,如果二维码长这样呢! 或者这 ...

  7. 教你使用Python制作酷炫二维码

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 察己则可以知人,察今则可以知古. ...

  8. 《庆余年》值得一看吗?Python告诉你谁在关注 | CSDN原力计划

    扫码参与CSDN"原力计划" 作者 | A字头 来源 | 数据札记倌 庆余年电视剧终于在前两天上了,这两天赶紧爬取数据看一下它的表现. 庆余年 <庆余年>是作家猫腻的小 ...

  9. 用 Python 制作酷炫的可视化大屏,特简单!

    作者 | 小F 来源 | 法纳斯特 在数据时代,我们每个人既是数据的生产者,也是数据的使用者,然而初次获取和存储的原始数据杂乱无章.信息冗余.价值较低. 要想数据达到生动有趣.让人一目了然.豁然开朗的 ...

最新文章

  1. win10系统下cmd输入一下安装的软件命令提示拒绝访问解决办法
  2. String类为什么被设计为不可变的?
  3. emcy协议_CANopen协议 -
  4. CentOS 编译安装 Nodejs (实测 笔记 Centos 7.3 + node 6.9.5)
  5. 【guava】大数据量下的集合过滤—Bloom Filter
  6. SpringCloud工作笔记079---SpringBoot中使用CXF集成SpringWebServices_来创建wsdl_WebServices_服务端_以及客户端
  7. 从零开始刷Leetcode——数组(268.283.414)
  8. Win10应用程序无法正常启动0xc0000142错误的解决方法
  9. Eclipse,提交代码,版本比较时,不忽略空格
  10. 配置 php_零基础建站如何配置PHP运行环境 几种服务器环境配置的选择和方法
  11. 阿里面试官居然问我如何设计一个本地缓存
  12. 电脑突然显示只有C盘,其他磁盘不显示了----解决方法(很简单)
  13. 数据结构-顺序栈的基本操作(C语言实现)
  14. 微信公众平台开发教程(十) 订阅号与服务号的区别
  15. 在Node.js中了解Hello World
  16. 写代码之外,如何再赚一份工资?
  17. Git 笔记 - git rebase
  18. c++中的有符号数与无符号数一起运算
  19. Python异常UnicodeEncodeError: 'gbk' codec can't encode character '\uXXX' in position
  20. 解决 Navigating to current location (/userslist) is not allowed问题。

热门文章

  1. 《Linux4.0设备驱动开发详解》笔记--第五章:Linux文件系统与设备文件
  2. django 运行python manage.py sqlall books 时报错 app has migration
  3. Java关键字final、static
  4. Handler 引起的内存泄露
  5. [ubuntu] duplicated values in $PATH
  6. 通过SSH连接远程Jupyter Notebook
  7. 矩池云上关于conda的一些使用技巧
  8. android快速搭建界面,怎么样能快速搭建一个Android APP的界面和框架?
  9. leetcode python3 简单题171. Excel Sheet Column Number
  10. 探索pytest的fixture(上)