开发大型项目时,做好规划后再动手编写项目很重要。规划可确保你不偏离轨道,从而提高项目成功的可能性。 下面来编写有关游戏《外星人入侵》的描述,其中虽然没有涵盖这款游戏的所有细节,但能让你清楚地知道该如何动手开发它。 在游戏《外星人入侵》中,玩家控制着一艘最初出现在屏幕底部中央的飞船。玩家可以使用箭头键左右移动飞船,还可使用空格键进行射击。游戏开始时,一群外星 人出现在天空中,他们在屏幕中向下移动。玩家的任务是射杀这些外星人。玩家将所有外星人都消灭干净后,将出现一群新的外星人,他们移动的速度更快。只要有外星人

效果图


Windows系统中首先安装pip

要安装pip,请访问pip · PyPI下载压缩包

把他放到你预先准备好的文件夹中,并解压

解压后安装pip

打开cmd,控制台命令进入pip文件夹,在命令行窗口输入python setup.py install

在python的文件夹中找到Scripts文件夹,如果在其中发现以上四个文件则表示安装成功

pip的配置设置

打开资源管理器–>右键此电脑–>点击属性–>点击高级系统设置–>点击环境变量–>将Scripts文件夹的路径添加到path变量中

在命令行输入pip,不报错就成功了


使用安装pygame

在命令行中输入pip install  pygame


以上不会的可直接在pycharm中安装

在这里直接安装pygame也可


这里准备工作就做好了

直接上代码

需要的图片文件images

ship.bmps

beijin.png

alien.bmp

将以上图片命名一致放入项目根目录下的文件夹images中

给大家看一下项目的功能模块组成

alien_invasion.py

import pygamefrom button import Button
from game_stats import GameStats
from settings import Settings
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
from scoreboard import Scoreboarddef run_game():# 初始化游戏并创建一个屏幕对象pygame.init()ai_settings=Settings()screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))bg = pygame.image.load(r"images\beijin.png")  # 图片位置#标题pygame.display.set_caption("外星人入侵")# 创建Play按钮play_button = Button(ai_settings, screen, "Play")# 创建一艘飞船、一个子弹编组和一个外星人编组ship = Ship(ai_settings, screen)# 创建一组一个用于存储子弹的编组bullets = Group()aliens = Group()# 创建外q星人群gf.create_fleet(ai_settings, screen, ship, aliens)# 创建存储游戏统计信息的实例,并创建记分牌stats = GameStats(ai_settings)sb = Scoreboard(ai_settings, screen, stats)# 开始游戏的主循环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)screen.blit(bg, (0, 0))run_game()
'''   # 创建一艘飞船ship = Ship(ai_settings,screen)# 创建一个用于存储子弹的编组bullets = Group()# 创建一个外星人alien = Alien(ai_settings, screen)
'''

game_stats.py

class GameStats():"""跟踪游戏的统计信息"""def __init__(self, ai_settings):"""初始化统计信息"""self.ai_settings = ai_settingsself.reset_stats()# 游戏刚启动时处于活动状态#self.game_active = True# 让游戏一开始处于非活动状态self.game_active = False# 在任何情况下都不应重置最高得分self.high_score = 0def reset_stats(self):"""初始化随游戏进行可能变化的统计信息"""self.ships_left = self.ai_settings.ship_limitself.score = 0self.level = 1

alien.py

import pygame
from pygame.sprite import Sprite
class Alien(Sprite):"""表示单个外星人的类"""def __init__(self, ai_settings, screen):"""初始化外星人并设置其起始位置"""super(Alien, self).__init__()self.screen = screenself.ai_settings = ai_settings# 加载外星人图像,并设置其rect属性self.image = pygame.image.load(r'images\alien.bmp')self.rect = self.image.get_rect()# 每个外星人最初都在屏幕左上角附近self.rect.x = self.rect.widthself.rect.y = self.rect.height# 存储外星人的准确位置self.x = float(self.rect.x)def blitme(self):"""在指定位置绘制外星人"""self.screen.blit(self.image, self.rect)def check_edges(self):"""如果外星人位于屏幕边缘,就返回True"""screen_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right:return Trueelif self.rect.left <= 0:return Truedef update(self):"""向左或向右移动外星人"""self.x += (self.ai_settings.alien_speed_factor *self.ai_settings.fleet_direction)self.rect.x = self.x

game_functions.py

import sys
import pygame
from bullet import Bullet
from alien import Alien
from time import sleep
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:# 创建一颗子弹,并将其加入到编组bullets中fire_bullet(ai_settings, screen, ship, bullets)elif event.key == pygame.K_q:sys.exit()
def fire_bullet(ai_settings, screen, ship, bullets):"""如果还没有到达限制,就发射一颗子弹"""if len(bullets) < ai_settings.bullets_allowed:new_bullet = Bullet(ai_settings, screen, ship)bullets.add(new_bullet)
def check_keyup_events(event, ship):"""响应松开"""if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left = False
def 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 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按钮if not stats.game_active:play_button.draw_button()# 让最近绘制的屏幕可见pygame.display.flip()def update_bullets(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 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:# 如果整群外星人都被消灭,就提高一个等级bullets.empty()ai_settings.increase_speed()# 提高等级stats.level += 1sb.prep_level()create_fleet(ai_settings, screen, ship, aliens)def 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):create_alien(ai_settings, screen, aliens, alien_number,row_number)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 create_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)break
def change_fleet_direction(ai_settings, aliens):"""将整群外星人下移,并改变它们的方向"""for alien in aliens.sprites():alien.rect.y += ai_settings.fleet_drop_speedai_settings.fleet_direction *= -1
def update_aliens(ai_settings, screen, stats, sb, ship, aliens, bullets):""" 检查是否有外星人到达屏幕边缘然后更新所有外星人的位置"""check_fleet_edges(ai_settings, aliens)aliens.update()# 检查是否有外星人到达屏幕底端check_aliens_bottom(ai_settings, screen, stats, sb, ship, aliens, bullets)# 检测外星人和飞船碰撞if pygame.sprite.spritecollideany(ship, aliens):ship_hit(ai_settings, screen, stats, sb, ship, aliens, bullets)# 检查是否有外星人抵达屏幕底端check_aliens_bottom(ai_settings, screen, stats, sb, ship, aliens, bullets)def ship_hit(ai_settings, screen, stats, sb, ship, aliens, bullets):"""响应被外星人撞到的飞船"""if stats.ships_left > 0:# 将ships_left减1stats.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_aliens_bottom(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 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 check_high_score(stats, sb):"""检查是否诞生了新的最高得分"""if stats.score > stats.high_score:stats.high_score = stats.scoresb.prep_high_score()

button.py

import pygame.font
class Button():def __init__(self, ai_settings, screen, msg):"""初始化按钮的属性"""self.screen = screenself.screen_rect = screen.get_rect()# 设置按钮的尺寸和其他属性self.width, self.height = 200, 50self.button_color = (0, 255, 0)self.text_color = (255, 255, 255)self.font = pygame.font.SysFont(None, 48)# 创建按钮的rect对象,并使其居中self.rect = pygame.Rect(0, 0, self.width, self.height)self.rect.center = self.screen_rect.center# 按钮的标签只需创建一次self.prep_msg(msg)def prep_msg(self, msg):"""将msg渲染为图像,并使其在按钮上居中"""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):# 绘制一个用颜色填充的按钮,再绘制文本self.screen.fill(self.button_color, self.rect)self.screen.blit(self.msg_image, self.msg_image_rect)

bullet.py

import pygame
from pygame.sprite import Spriteclass Bullet(Sprite):"""一个对飞船发射的子弹进行管理的类"""def __init__(self, ai_settings, screen, ship):"""在飞船所处的位置创建一个子弹对象"""super(Bullet, self).__init__()self.screen = screen# 在(0,0)处创建一个表示子弹的矩形,再设置正确的位置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# 存储用小数表示的子弹位置self.y = float(self.rect.y)self.color = ai_settings.bullet_colorself.speed_factor = ai_settings.ship_speed_factordef update(self):"""向上移动子弹"""#更新表示子弹位置的小数值self.y -= self.speed_factor#更新表示子弹的rect的位置self.rect.y = self.ydef draw_bullet(self):"""在屏幕上绘制子弹"""pygame.draw.rect(self.screen, self.color, self.rect)

scoreboard.py

import pygame.font
from pygame.sprite import Group
from ship import Ship
class Scoreboard():"""显示得分信息的类"""def __init__(self, ai_settings, screen, stats):"""初始化显示得分涉及的属性"""self.screen = screenself.screen_rect = screen.get_rect()self.ai_settings = ai_settingsself.stats = stats# 显示得分信息时使用的字体设置self.text_color = (30, 30, 30)self.font = pygame.font.SysFont(None, 48)# 准备初始得分图像self.prep_score()# 准备包含最高得分和当前得分的图像self.prep_score()self.prep_high_score()self.prep_level()self.prep_ships()def prep_score(self):"""将得分转换为渲染的图像"""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)# 将得分放在屏幕右上角self.score_rect = self.score_image.get_rect()self.score_rect.right = self.screen_rect.right - 20self.score_rect.top = 20def show_score(self):"""在屏幕上显示飞船和得分"""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)# 绘制飞船self.ships.draw(self.screen)def prep_high_score(self):"""将最高得分转换为渲染的图像"""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)# 将最高得分放在屏幕顶部中央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):"""将等级转换为渲染的图像"""self.level_image = self.font.render(str(self.stats.level), True,self.text_color, self.ai_settings.bg_color)# 将等级放在得分下方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):"""显示还余下多少艘飞船"""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)

settings.py


class Settings():"""存储《外星人入侵》的所有设置的类"""def __init__(self):"""初始化游戏的设置"""# 屏幕设置self.screen_width = 1030self.screen_height = 700self.bg_color = (230, 230, 230)#self.bg=pygame.image.load(r"C:\Users\YJ\PycharmProjects\alien_invasion\images\beijin.png")  # 图片位置# 飞船的设置self.ship_speed_factor = 15         #船速系数15self.ship_limit=3# 子弹设置self.bullet_width = 3           #3self.bullet_height = 15         #15self.bullet_color = 230, 230, 230#self.bullet_speed_factor = 100#self.bullet_color = 60, 60, 60self.bullets_allowed = 5        #3# 外星人设置self.fleet_drop_speed = 10     #舰队下降速度1# 加快游戏节奏的速度self.speedup_scale = 1.1          #1.1# 外星人点数的提高速度self.score_scale = 1.5          #1.5self.initialize_dynamic_settings()def initialize_dynamic_settings(self):"""初始化随游戏进行而变化的设置"""self.ship_speed_factor = 5     #船速系数1.5self.bullet_speed_factor = 100    #子弹速度系数3self.alien_speed_factor = 1      #外星速度因子1# fleet_direction为1表示向右;为-1表示向左self.fleet_direction = 1        #舰队方向1# 记分self.alien_points = 50          #外星点50def increase_speed(self):"""提高速度设置和外星人点数"""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)print(self.alien_points)

ship.py

import pygame
from pygame.sprite import Sprite
class Ship(Sprite):def __init__(self, ai_settings,screen):"""初始化飞船并设置其初始位置"""super(Ship, self).__init__()self.screen = screenself.ai_settings = ai_settings# 加载飞船图像并获取其外接矩形self.image = pygame.image.load(r"images\ship.bmp")self.rect = self.image.get_rect()self.screen_rect = screen.get_rect()# 将每艘新飞船放在屏幕底部中央self.rect.centerx = self.screen_rect.centerxself.rect.bottom = self.screen_rect.bottom# 在飞船的属性center中存储小数值self.center = float(self.rect.centerx)# 移动标志self.moving_right = Falseself.moving_left = Falsedef update(self):"""根据移动标志调整飞船的位置"""# 更新飞船的center值,而不是rectif 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# 根据self.center更新rect对象self.rect.centerx = self.centerdef blitme(self):"""在指定位置绘制飞船"""self.screen.blit(self.image, self.rect)def center_ship(self):"""让飞船在屏幕上居中"""self.center = self.screen_rect.centerx

代码给大家了,大家随意,喜欢的点赞加收藏

python项目——外星人入侵游戏相关推荐

  1. Python项目 外星人入侵游戏

    终于开始入门项目了,使用Pygame包,跟着教程的过程敲打游戏来学习,做了自己的笔记 文末有完整项目代码,或者点这 -->链接 目标 在游戏<外星人入侵>中,玩家控制着一艘最初出现在 ...

  2. Python项目外星人入侵(一):实现宇宙飞船

    文章目录 Python项目:外星人入侵(一) 安装Pygame 安装pip 安装Pygame 开始游戏项目 创建Pygame窗口以及响应用户输入 设置背景颜色 创建设置类 添加飞船图像 创建ships ...

  3. 记录第一个 python项目 外星人入侵小游戏

    学习目标:提升自己的编程能力## 标题 *> 可谓是一波三折 ,刚开始看的一本电子书 里面是python2.0的内容,我敲着在3系列的编译器试着2.0的代码可谓好不酸爽 那报错 绝了 学习内容: ...

  4. Python项目--拼图游戏(附源码)

    使用pythondiam开发出一个简易的拼图游戏,3*3的九宫格拼图,记录所用步数表示成绩, 先看一下项目运行后的预览图, 再看一下运行的gif动图:录的gif图失真,将就一下 开发过程: 设置图像 ...

  5. Python项目--外星人入侵--武装飞船

    武装飞船 开始游戏项目 创建Pygame窗口以及响应用户输入 首先,我们创建一个空的Pygame窗口.使用Pygame编写的游戏的基本结构如下: #alien_invasion.py import s ...

  6. python随机出现外星人飞船_python外星人入侵游戏如何改变飞船的大小

    Python从入门到实践里的<外星人入侵> Python外星人入侵问题分享助世界上从来不缺少风景,缺少的只是欣赏的心情. Python项目外星人入侵添加爆照效果有没有原码<Pytho ...

  7. python编程入门到实践学习笔记——外星人入侵游戏pygame(一 武装飞船)

    python编程--外星人入侵游戏pygame(一) 外星人入侵游戏一:武装飞船 安装Pygame 创建窗口及响应用户输入 更改屏幕背景色 创建设置类 创建ship飞船类 重构game_functio ...

  8. python项目练习——外星人入侵游戏(一)——武装飞船

    此项目是自学<python编程从入门到实践>这本书时,对着其中的项目进行练习,代码均按照书中代码来敲写,可以运行成功. 首先先建立alien_invasion.py所有代码的调用在此执行 ...

  9. Python 外星人入侵游戏(一):武装飞船(上)

    从这周开始Python的实践学习,首先来开发一个外星人入侵游戏,这样可以对之前的概念有更深入的理解,对交互式项目有更深入的认识 来源:<Python编程:从入门到实践> 注意:游戏< ...

最新文章

  1. Mysql 数据库命令行导出导入sql脚本
  2. AFNetworking 下载文件断点续传操作
  3. kinana 清空索引数据_(Elasticsearch)实战Elasticseartch、Logstash、Kibana
  4. IPM: Product 270015453 not scheduled in sales organization
  5. 16*64点阵屏的c语言程序,16*64点阵程序 - 单片机/MCU论坛 - 电子技术论坛 - 广受欢迎的专业电子论坛!...
  6. 糖果浏览器和139邮箱巧妙应用:将网页文字一键发送到手机上
  7. (37)FPGA三种基本逻辑门(非门)
  8. Evernote 强力替代品:开源加密笔记本 Joplin
  9. java编程找异数,异类Outliers_又名异数Malcolm_Gladwell.pdf
  10. js vue echarts 前端绘制 cie1931 马蹄图 色度图
  11. PNP三极管和NPN三极管的开关电路(EC极性接线判断简单明了)简单的技巧:三极管上箭头所在方向的二极管,只要二极管正向导通,那么三极管上下就能导通。
  12. 安装部署Ceph Calamari
  13. 若不是因为生活所迫,谁愿把自己搞得满身才华
  14. linux快捷键锁定屏幕,天天Linux-Ctrl+S快捷键锁定屏幕的问题
  15. 微信 8.0 的状态原来这么炸裂,无情地爱了爱了,做程序员的你还不赶紧设置一把?
  16. CD光盘中CDA格式转音频文件
  17. Babylon.js 拾取坐标的方法
  18. 小学教师计算机校本培训计划,中小学教师信息技术应用校本培训方案
  19. 棋盘放麦子(c++版本)
  20. 系统状态查看工具Sysstat

热门文章

  1. 《A Mixed-Initiative Interface for Animating Static Pictures》翻译
  2. SCO UNIX 讲座
  3. smush.it更新
  4. 白宫举办开源安全峰会,众多科技巨头参加
  5. 视频教程-JAVAEE真实课堂系列之XML全讲-云计算基础架构
  6. Salesforce 单点登录
  7. 安卓手机哪个服务器信号最强,安卓手机最强性能前十排行,第一名再逆袭第二名有争议...
  8. Texpad for mac(专业的LaTeX编辑工具)
  9. 【RabbitMQ】RabbitMQ基础
  10. cmake:解决MSVC下/MT 编译paho.mqtt.c的问题