本文主要内容:

  1. 复现:Eric Matthes所著的《python编程从入门到实践》一书中,第12章到第14章的《外星人入侵》项目的代码,并成功运行。
  2. 将项目的主要文件和代码做一个分享
  3. 分享此项目完整代码的链接

第一部分:项目的效果图和目录树
项目的初始运行的效果:

项目的文件目录:

项目的依赖包:

第二部分:主要代码

alien_invasion.py
(主程序代码)

import pygame
from settings import Settings
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
from alien import Alien
from game_stats import GameStats
from button import Button
from scoreboard import Scoreboarddef run_game():'''初始化游戏并创建一个屏幕对象:return:'''# 初始化设置和屏幕对象pygame.init()ai_settings = Settings()screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))pygame.display.set_caption('Alien Invasion')# 绘制Play按钮play_button = Button(ai_settings, screen, 'Play')# 创建一个用于存储游戏统计信息的实例, 并创建记分牌stats = GameStats(ai_settings)sb = Scoreboard(ai_settings, screen, stats)# 创建一艘飞船ship = Ship(ai_settings, screen)# 创建一个用于存储子弹的编组bullets = Group()aliens = Group()# 创建外星人群gf.create_fleet(ai_settings, screen, ship, aliens)# 设置背景颜色bg_color = (230,230,230)# 创建一个外星人alien = Alien(ai_settings, screen)# 开始游戏的主循环while True:# 监视键盘和鼠标事件gf.check_events(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets)if stats.game_active:   # 如果还存在飞船,则执行以下代码ship.update()  # 更新飞船位置gf.update_bullet(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()

settings.py
(游戏参数设置文件)

    ''' 存储《外星人入侵》的所有设置的类 '''def __init__(self):'''初始化游戏的设置'''# 设置屏幕self.screen_width = 1200self.screen_height = 800self.bg_color = (230, 230, 230)# 飞船的设置self.ship_limit = 1     # 飞船艘数# 子弹设置self.bullet_width = 300    # 子弹宽度self.bullet_height = 15      # 子弹长度self.bullet_color = 60,60,60    # 子弹颜色self.bullets_allowed = 5# 设置外星人self.fleet_drop_speed = 10       # 外星人纵向移动速度# 以什么样的速度加快游戏节奏self.speedup_scale = 1.1# 外星人点数的提高速度self.score_scale = 1.5self.initialize_dynamic_settings()def initialize_dynamic_settings(self):'''初始化随游戏进行而变化的设置'''self.ship_speed_factor = 1.5self.bullet_speed_factor = 3self.alien_speed_factor = 1# fleet_direction为1表示向右移, 为-1表示向左移self.fleet_direction = 1# 计分self.alien_points = 50def increase_speed(self):'''提高速度设置和外星人点数'''self.ship_speed_factor *= self.speedup_scaleself.bullet_speed_factor *= self.speedup_scaleself.alien_speed_factor *= self.speedup_scale# 设置外星人点数self.alien_points = int(self.alien_points * self.score_scale)

game_function.py
(游戏功能文件)

import sys
import pygame
from alien import Alien
from time import sleep
from bullet import Bulletdef check_events(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets):'''响应按鼠标事件'''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):'''在玩家单机Play按钮时,开始新游戏'''button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)if button_clicked and not stats.game_active:# 重置游戏设置ai_settings.initialize_dynamic_settings()# 隐藏光标pygame.mouse.set_visible(False)# 重置游戏统计信息stats.reset_stats()stats.game_active = True# 重置记分牌图像sb.prep_score()sb.prep_high_score()sb.prep_level()sb.prep_ships()# 清空外星人列表和子弹列表aliens.empty()bullets.empty()# 创建一群新的外星人,并让飞船居中create_fleet(ai_settings, screen, ship, aliens)ship.center_ship()def update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets, play_button):'''更新屏幕上的图像,并切换到新屏幕'''screen.fill(ai_settings.bg_color)  # 设置背景颜色# 在飞船和外星人后面绘制所有子弹for bullet in bullets.sprites():bullet.draw_bullet()ship.blitme()  # 绘制小船aliens.draw(screen)    # 绘制外星人# 显示得分sb.show_score()# 如果游戏处于非激活状态,就绘制Play按钮'''代码顺序非常重要,因为是顺序执行。如果此代码放于绘制外星人代码之前则play按钮将会处于底层,无法呈现完整的矩形按钮'''if not stats.game_active:play_button.draw_button()# 让最近绘制的屏幕可见pygame.display.flip()def check_keydown_events(event, ai_settings, screen, ship, bullets):'''按键响应'''if event.key == pygame.K_RIGHT:  # 如果按键盘右键,飞船右移ship.moving_right = Trueelif event.key == pygame.K_LEFT:  # 如果按键盘左键,飞船左移ship.moving_left = Trueelif event.key == pygame.K_SPACE:   # 如果按空格,发射子弹bullet_flag = Truefire_bullet(ai_settings, screen, ship, bullets)elif event.key == pygame.K_q:   # 快捷键q结束游戏sys.exit()def check_keyup_events(event, ship):'''响应松开'''if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left = Falsedef create_fleet(ai_settings, screen, ship, aliens):'''创建外星人群'''# 创建一个外星人,并计算每行可以容纳多少外星人# 外星人间距为外星人宽度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)# 创建第一群外星人for row_number in range(number_rows):for alien_number in range(number_aliens_x):creat_alien(ai_settings, screen, aliens, alien_number, row_number)def update_bullet(ai_settings, screen, stats, sb, ship, aliens, bullets):'''更新子弹位置,并删除已消失的子弹'''# 更新子弹位置bullets.update()# 删除已消失的子弹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 fire_bullet(ai_settings, screen, ship, bullets):'''如果还没有到达限制,就发射一颗子弹'''# 创建一颗子弹,并将其加入到编组bullets中if len(bullets) < ai_settings.bullets_allowed:   # 如果屏幕上的子弹未超过最大允许范围,就发射一颗子弹new_bullet = Bullet(ai_settings, screen, ship)bullets.add(new_bullet)def get_number_aliens_x(ai_settings, alien_width):'''计算每行可以容纳多少个外星人'''available_space_x = ai_settings.screen_width - 2 * alien_widthnumber_aliens_x = int(available_space_x / (2 * alien_width))return number_aliens_xdef creat_alien(ai_settings, screen, aliens, alien_number, row_number):'''创建一个外星人并将其放在当前行'''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 get_number_rows(ai_settings, ship_height, alien_height):'''计算屏幕可以容纳多少行外星人'''available_space_y = (ai_settings.screen_height - (3 * alien_height) - ship_height)number_rows = int(available_space_y / (2 * alien_height))return number_rowsdef check_fleet_edges(ai_settings, aliens):'''有外星人到达边缘时,采取相应的措施'''for alien in aliens.sprites():if alien.check_edges():change_fleet_direction(ai_settings, aliens)breakdef change_fleet_direction(ai_settings, aliens):'''将整群外星人下移,并改变它们的方向'''for alien in aliens.sprites():alien.rect.y += ai_settings.fleet_drop_speedai_settings.fleet_direction *= -1def update_aliens(ai_settings, screen, stats, sb, ship, aliens, bullets):'''检查是否有外星人位于屏幕边缘,并更新整群外星人的位置:param ai_settings::param aliens::return:'''check_fleet_edges(ai_settings, aliens)aliens.update()# 检查是否有外星人到达屏幕底端check_aliens_buttom(ai_settings, screen, stats, sb, ship, aliens, bullets)# 检测外星人和飞船碰撞if pygame.sprite.spritecollideany(ship, aliens):ship_hit(ai_settings, screen, stats, sb, ship, aliens, bullets)def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship, aliens, bullets):'''响应子弹和外星人碰撞'''# 删除发生碰撞的子弹和外星人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:# 如果外星人为0, 删除现有的子弹,加快游戏节奏,并新建一群外形人# 如果整群外星人都被消灭,就提高一个等级bullets.empty()ai_settings.increase_speed()# 提高等级stats.level += 1sb.prep_level()# 创建新的一群外星人create_fleet(ai_settings, screen, ship, aliens)def check_aliens_buttom(ai_settings, screen, stats, sb, ship, aliens, bullets):'''检查是否有外星人到达了屏幕底端'''screen_rect = screen.get_rect()for alien in aliens.sprites():if alien.rect.bottom >= screen_rect.bottom:# 像飞船被碰到一样处理ship_hit(ai_settings, screen, stats, sb, ship, aliens, bullets)breakdef ship_hit(ai_settings, screen, stats, sb, ship, aliens, bullets):'''响应被外星人撞到的飞船'''if stats.ships_left > 0:# 将ships_left减一stats.ships_left -= 1# 更新记分牌sb.prep_ships()# 清空外星人列表和子弹列表aliens.empty()bullets.empty()# 创建一群新的外星人,并将飞创放到屏幕底端中央create_fleet(ai_settings, screen, ship, aliens)ship.center_ship()# 暂停sleep(0.5)else:stats.game_active = Falsepygame.mouse.set_visible(True)def check_high_score(stats, sb):'''检查是否诞生了新的最高分'''if stats.score > stats.high_score:stats.high_score = stats.scoresb.prep_high_score()

第三部分:完整项目链接分享
考虑到篇幅和大家使用的方便性,我已将此项目完整的代码以及项目演示效果的视频和项目导入到pycharm的步骤的视频压缩到同一文件中,上传到了本站的资源库,供道友们免费下载。

传送门如下:
① 百度网盘:
链接:https://pan.baidu.com/s/1p8lDf_Mk0a7FpGB24v2uqQ
提取码:6pwj

② CSDN
https://download.csdn.net/download/qq_35284513/25646536
也可以点击我CSDN个人中心 --> 资源 -->【Python】飞机大战演示+源代码.rar —> 点击下载

资源使用步骤如下(资源中附带使用方法):

  1. 解压alien_invasion.rar
  2. 下载安装pycharm(社区版即可),并配置好pycharm的运行环境(具体的可百度)
  3. pycharm环境配置完成后,将解压后的整个文件夹(文件夹名:alien_invasion)拖拽到pycharm图标上会自动打开pycharm并导入完整项目
  4. 等待pycharm打开后,在最底部一栏中找到并点击Python Packages选项。如果左侧Installed一栏中没有pygame包,则在搜索框中搜索pygame,选中后点击右边Install,等待下载安装完成。
  5. 最后打开alien_invasion.py文件,运行此文件(快捷键:ctrl + shift + F5)。

另:如何正确安装和配置 pycharm, 可参考站内的大佬们分享的方法,步骤都很详细。

如果这篇文章和分享的资源对您有帮助,欢迎点赞和评论支持。极客之路,吾辈不孤。欢迎留言交流和分享。

【Python】游戏:飞机大战相关推荐

  1. python写飞机大战游戏_python实现飞机大战游戏

    飞机大战(Python)代码分为两个python文件,工具类和主类,需要安装pygame模块,能完美运行(网上好多不完整的,调试得心累.实现出来,成就感还是满满的),如图所示: 完整代码如下: 1.工 ...

  2. python实现飞机大战游戏

    python实现飞机大战小游戏(含源码+视频资源) 导语: 正文: 1.开发工具 2.环境搭建 3.效果如下 Step1:定义精灵类 Step2:实现游戏主循环 Step3:制作简易的游戏开始和结束界 ...

  3. python制作飞机大战游戏准备工作相关知识点

    python制作飞机大战游戏准备工作相关知识点 1.初始化背景 `import pygame` : 导入pygame模块 `pygame.init()` : 导入并初始化所有 `pygame` 模块, ...

  4. python实现飞机大战游戏_python实现飞机大战小游戏

    本文实例为大家分享了python实现飞机大战的具体代码,供大家参考,具体内容如下 初学Python,写了一个简单的Python小游戏. 师出bilibili某前辈 pycharm自带了第三方库pyga ...

  5. c 语言500行小游戏代码,500行代码使用python写个微信小游戏飞机大战游戏.pdf

    500行行代代码码使使用用python写写个个微微信信小小游游戏戏飞飞机机大大战战游游戏戏 这篇文章主要介绍了500行代码使用python写个微信小游戏飞机大战游戏,本文通过实例代码给大家介绍的非常详 ...

  6. 飞机大战游戏python_基于Python的飞机大战游戏

    基于 Python 的飞机大战游戏 杨铠 [期刊名称] <电脑迷> [年 ( 卷 ), 期] 2017(000)021 [摘要] 我们每天都享受到科技带来的好处 , 了解计算机编程对每个人 ...

  7. 【python】飞机大战小游戏练习

    飞机大战小游戏练习 一.前提准备 二.制作步骤 1.库的导入与初始化 2.窗口操作 3.键盘按键监听相关操作 4.添加游戏背景 5.加载玩家飞机 6.获取玩家飞机矩阵 三.完整代码编写 游戏背景类编写 ...

  8. 【Python】Python小游戏--飞机大战

    一.前言 今天已经初四,舒服的在家躺尸的春节也算过去了,又要开始辛勤的(苦逼的)学习和工作了.说点题外话,今年春节的病毒疫情真的弄的人心惶惶,我也在这为国家和武汉加油,也向一线工作人员致敬,希望早日结 ...

  9. 基于python的飞机大战游戏设计与实现

    基于python的飞机大战游戏设计与实现,采用MySQL+pygame+Tkinter实现飞机大战游戏,主要功能有注册+登录+游戏初始化(开始游戏+游戏操作说明+版权信息)+游戏主界面[设置敌机种类并 ...

  10. 小甲鱼python游戏代码_【小甲鱼】零基础学习python pygame 飞机大战可执行源代码...

    [实例简介] [小甲鱼]零基础学习python pygame 飞机大战可执行源代码,觉得挺有意思,故此分享. [实例截图] [核心代码] 飞机大战 └── 飞机大战 ├── bullet.py ├── ...

最新文章

  1. 7.Windows线程切换_时钟中断切换
  2. npm运行报错:Error: ENOSPC: System limit for number of file watchers reached
  3. pymysql(part3)--pymysql常用函数
  4. 最简便的Revit信息导出到数据库本地SQL SERVER
  5. Java开发人员可以从Spring框架中学到编程技巧
  6. matlab的控制系统仿真,MATLAB控制系统仿真教程
  7. 新浪微博数据采集以及人群画像分析
  8. Pro Tools播放引擎设置详解
  9. 攻防世界-Web-练习区12题解
  10. 匀速运动,太空版愤怒的小鸟
  11. SQLServer身份证号或手机号字段隐藏某几位显示
  12. 学习路之数据库:sql查询时添加一列固定值
  13. 关于网络知识一些笔记(个人2022.06)
  14. html 评分星级显示,星级评分效果.html
  15. 使用datadog来监控os和postgresql数据库
  16. Spring AOP动态代理
  17. Ubuntu18.04.5-server网络配置介绍
  18. Zuul Filter的小坑
  19. 基于Wemos D1避障WiFi小车及智能垃圾桶设计
  20. 大旺中学2021年高考成绩查询,肇庆中学排名前十名,2021年肇庆中学排名一览表

热门文章

  1. 联想k920 android7,联想K920和小米4哪个好
  2. word论文格式修改
  3. Python利用OpenCV去除图片水印
  4. 服务器拖两个屏幕win10系统,win10怎么设置双屏显示两个桌面
  5. “净出口=资本净流出” 会计恒等式的理解
  6. MicroSoft PowerPoint 提示打开.ppt文件发生错误,要修复,修复后部分页面丢失的问题
  7. C语言--模拟实现库函数strcpy
  8. python集合运算_python集合的运算(交集、并集、差集、补集)
  9. php实现网页播放ppt,php实现ppt转html5
  10. Java 映射 获取类的变量名(包括所有的父类)