外星人入侵

游戏概述:

现在准备用python开始搞一个大型游戏,模拟未来战争,地球人狙击外星人大战(其实就是小蜜蜂游戏2333),玩家控制一个飞船,用子弹歼灭屏幕上空的外星飞船;项目用到了Pygame模块,下面是模块的安装

Windows系统上Pygame安装:

访问https://bitbucket.org/pygame/pygame/downloads/地址,查找与Python版本匹配的Windows安装程序,cp35表示支持python3.5,本次使用的是python3.5版本

下载扩展名为.whl的文件,复制到项目文件夹中,打开CMD窗口,执行pip命令进行安装(主要pip跟python的版本绑定)

切换到文件目录,执行命令

python -m pip install --user pygame-1.9.2-cp35-cp35m-win32.whl

进入python,执行import pygame 无报错则表示安装成功

宇宙飞船

实现功能,屏幕下方显示一艘宇宙飞船,可以左右移动,按空格键可以发射子弹

1、全局配置settings.py:

全局配置、初始各种原始数据,没啥好说的,有什么需要初始设置的东西放到这里就好了

class Settings():

'''存储外星人入侵中所有的设置'''

def __init__(self):

'''初始化设置'''

#设置各种初始数据

classSettings():'''存储外星人入侵中所有的设置'''

def __init__(self):'''初始化设置'''self.screen_width= 900self.screen_heigt= 600self.bg_color= (230,230,230) #设置背景色 灰色

self.ship_speed_factor= 1.9 #飞船移动速度

self.ship_image_path = 'images/ship.png' #飞船图片路径

self.bullet_speed_factor= 0.5 #子弹移动速度

self.bullet_width = 3self.bullet_height= 15self.bullet_color= 60,60,60self.bullets_allowed= 4 #允许屏幕中出现子弹的数量

完整settings.py代码

2、程序主体程序alien_invasion.py:

程序运行的主体架构都在此文件中,while 循环之前是各种实例化,while循环之后调用各种函数进行处理

import pygame

from settings import Settings

from ship import Ship

from bullet import Bullet

from pygame.sprite import Group

import game_functions as gf

def run_game():

pygame.init() # 初始化背景设置

ai_settings = Settings() # 全局设置

screen = pygame.display.set_mode( # 创建screen显示窗口

(ai_settings.screen_width,ai_settings.screen_heigt)

)

pygame.display.set_caption('Alien Invasion') # 标题

# 创建飞船

ship = Ship(ai_settings,screen)

# 创建子弹编组

bullets = Group()

# 开始游戏主循环

while True:

# 监视键盘和鼠标事件

gf.check_events(ai_settings,screen,ship,bullets)

# 移动飞船

gf.update_ship(ship)

# 更新子弹位置

gf.update_bullets(bullets)

# 更新屏幕

gf.update_screen(ai_settings,screen,ship,bullets)

run_game()

importpygamefrom settings importSettingsfrom ship importShipfrom bullet importBulletfrom pygame.sprite importGroupimportgame_functions as gfdefrun_game():

pygame.init()#初始化背景设置

ai_settings = Settings() #全局设置

screen= pygame.display.set_mode( #创建screen显示窗口

(ai_settings.screen_width,ai_settings.screen_heigt)

)

pygame.display.set_caption('Alien Invasion') #标题

#创建飞船

ship =Ship(ai_settings,screen)#创建子弹编组

bullets =Group()#开始游戏主循环

whileTrue:#监视键盘和鼠标事件

gf.check_events(ai_settings,screen,ship,bullets)#移动飞船

gf.update_ship(ship)#更新子弹位置

gf.update_bullets(bullets)#更新屏幕

gf.update_screen(ai_settings,screen,ship,bullets)

run_game()

完整alien_invasion.py代码

3、宇宙飞船模块ship.py:

创建飞船Ship类,初始化飞船图片和位置信息,设置绘制飞船的函数blitme,以及飞船移动update的函数

import pygame

class Ship():

'''飞船所有信息'''

def __init__(self,ai_settings,screen):

# 加载飞船图片、获取外接矩行,设置飞船在screen的位置

---snip---

# 移动标志

self.moving_right = False

self.moving_left = False

def blitme(self):

'''在指定位置绘制飞船'''

---snip---

def update(self):

# 向右移动飞船、向左移动飞船

---snip---

importpygameclassShip():'''飞船所有信息'''

def __init__(self,ai_settings,screen):

self.screen=screen

self.ai_settings=ai_settings#加载飞船图片、获取外接矩形

self.image = pygame.image.load(self.ai_settings.ship_image_path) #加载图片

self.rect = self.image.get_rect() #获取图片外接矩形

self.screen_rect = screen.get_rect() #获取屏幕外接矩形

#将每搜新飞船放到并木底部中心

self.rect.centerx =self.screen_rect.centerx

self.rect.bottom=self.screen_rect.bottom#设置成浮点类型

self.center = float(self.rect.centerx) #self.rect.centerx设置不了浮点数 只能另设置一个变量进行运算

#移动标志

self.moving_right =False

self.moving_left=Falsedefblitme(self):'''在指定位置绘制飞船'''self.screen.blit(self.image,self.rect)defupdate(self):#向右移动飞船

if self.moving_right and self.rect.right

self.center+=self.ai_settings.ship_speed_factor#向左移动飞船

if self.moving_left and self.rect.left >self.screen_rect.left:

self.center-=self.ai_settings.ship_speed_factor

self.rect.centerx= self.center

完整ship.py代码

4、创建子弹模块bullet.py:

创建子弹Bullet类,跟Ship类似,初始化子弹的各种信息,设置子弹相对飞船的初始位置,设置绘制子弹的函数draw_bullet,子弹位置移动函数update(函数名不能改)

import pygame

from pygame.sprite import Sprite

import time

class Bullet(Sprite):

'''飞船子弹进行管理'''

def __init__(self,ai_settings,screen,ship):

# 创建子弹矩形初始位置(0,0,3,15)左上角,设置子弹的初始位置(飞船顶部)

---ship---

def update(self):

# 子弹位置更新

---ship---

def draw_bullet(self):

# 绘制子弹图片

---ship---

#!/usr/bin/env python#-*- coding:utf-8 -*-#-Author-Lian

importpygamefrom pygame.sprite importSpriteimporttimeclassBullet(Sprite):'''飞船子弹进行管理'''

def __init__(self,ai_settings,screen,ship):

super(Bullet,self).__init__()

self.screen=screen#创建子弹矩形初始位置(0,0,3,15)分别对应lef,top,宽,高

self.rect =pygame.Rect(0,0,

ai_settings.bullet_width, ai_settings.bullet_height)

self.rect.centerx= ship.rect.centerx #设置中心点x轴坐标跟飞船一致

self.rect.top = ship.rect.top #设置y轴坐标顶部跟飞船一致

#设置成小数进行计算

self.top =float(self.rect.top)

self.color=ai_settings.bullet_color

self.speed_factor=ai_settings.bullet_speed_factordefupdate(self):

self.top-=self.speed_factor

self.rect.top=self.topprint(self.rect.top)defdraw_bullet(self):

pygame.draw.rect(self.screen,self.color,self.rect)

完整bullet.py代码

5、储存运算的模块game_functions.py:

项目的主体运算模块:check_events监视键盘和鼠标事件,update_screen更新屏幕不断地刷新

import sys

import pygame

from bullet import Bullet

def check_events(ai_settings,screen,ship,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)

def update_screen(ai_settings,screen,ship,bullets):

'''更新屏幕上的图片,并切换到新屏幕'''

screen.fill(ai_settings.bg_color) # 设置背景颜色

ship.blitme() # 绘制飞船

# 循环子弹组里面的元素,进行绘制 为空时不执行

for bullet in bullets.sprites():

bullet.draw_bullet() # 绘制子弹

# 显示最新屏幕,擦拭旧屏幕

pygame.display.flip()

def check_keydown_events(event,ai_settings,screen,ship,bullets):

'''飞船左右移动、发射子弹'''

---snip - --

def check_keyup_events(event,ship):

'''飞船左右移动'''

---snip - --

def update_bullets(bullets):

'''更新子弹位置,删除子弹'''

---snip---

def update_ship(ship):

'''更新飞船位置'''

---snip---

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)

importsysimportpygamefrom bullet importBulletdefcheck_events(ai_settings,screen,ship,bullets):#监视键盘和鼠标事件

for event inpygame.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)defupdate_screen(ai_settings,screen,ship,bullets):'''更新屏幕上的图片,并切换到新屏幕'''screen.fill(ai_settings.bg_color)#设置背景颜色

ship.blitme() #绘制飞船

#循环子弹组里面的元素,进行绘制 为空时不执行

for bullet inbullets.sprites():

bullet.draw_bullet()#绘制子弹

#显示最新屏幕,擦拭旧屏幕

pygame.display.flip()#print('1')

defcheck_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:

fire_bullet(ai_settings,screen,ship,bullets)defcheck_keyup_events(event,ship):if event.key ==pygame.K_RIGHT:

ship.moving_right=Falseelif event.key ==pygame.K_LEFT:

ship.moving_left=Falsedefupdate_bullets(bullets):'''更新子弹位置,删除子弹'''bullets.update()#子弹组每个成员执行self.update()操作

for bullet inbullets.sprites():if bullet.rect.bottom <= 0: #子弹出界 删除

bullets.remove(bullet)defupdate_ship(ship):

ship.update()deffire_bullet(ai_settings,screen,ship,bullets):#创建一个子弹对象 加入到子弹组

if len(bullets) < ai_settings.bullets_allowed: #子弹少于允许值时再生成

new_bullet =Bullet(ai_settings, screen, ship)

bullets.add(new_bullet)

完整代码game_functions.py代码

效果图:

其他功能---待续....

python大游戏_Python开发【项目】:大型模拟战争游戏(外星人入侵)相关推荐

  1. python做的大型游戏_Python有做大型游戏的潜力吗?

    由于最近我要考试忙不过来没修改回答,谢谢评论区大们的指正,我认识到的pygame库确实可以做游戏,但是pygame限制很多,特别是做大型游戏方面,3D还没有相关的优化方法等(3D游戏,pygame表示 ...

  2. python之穿越火线游戏代码_python开发的小球完全弹性碰撞游戏代码

    #python tkinter #python version 3.3.2 from tkinter import * ''' 判断 两个小球 { 圆心:A(x1,y1) 半径:r X轴速度:Vax ...

  3. python环境准备_python开发环境准备

    python 以版本众多,包之间依赖复杂而著称,所以一个趁手的开发环境还是很有必要的. 我的建议是用Anaconda做环境隔离.包管理,PyCharm做项目开发,jupyter做笔记,ipython和 ...

  4. python石头剪刀布循环_python基础教程之实现石头剪刀布游戏示例

    下边是标准.你与你的敌人,在同一时间作出特殊的手式,务必是下边一种手式:石块,剪刀,布.胜者从 下边的标准中造成,这一标准自身是个谬论. (a) 布包石块. (b)石头砸剪刀, (c)剪刀剪碎布.在你 ...

  5. python编的俄罗斯方块游戏_Python使用pygame模块编写俄罗斯方块游戏的代码实例

    文章先介绍了关于俄罗斯方块游戏的几个术语. 边框--由10*20个空格组成,方块就落在这里面. 盒子--组成方块的其中小方块,是组成方块的基本单元. 方块--从边框顶掉下的东西,游戏者可以翻转和改变位 ...

  6. 学习游戏服务器开发必看,C++游戏服务器开发常用工具介绍

    C++游戏服务器开发常用工具介绍 在软件开发过程中需要使用的工具类型实属众多,从需求建模到软件测试,从代码编译到工程管理,这些工具都对项目有着不可替代的作用.庄子有云,"吾生也有涯,而知也无 ...

  7. java游戏_java开发的七个金典游戏你小时候肯定玩过

    相信很多刚接触编程的同学,对于Java开发能做些什么.做过哪些游戏, 并不是特别清楚.那么今天小编就为大家分享下, 万能的Java开发过的那些经典游戏吧! 手机上的Java即J2ME(Java 2 M ...

  8. java 拼图游戏_Java小项目之:拼图游戏!

    Java小项目之:拼图游戏! 今天教大家用java做出一个拼图游戏,很适合java初学者练手. 所用素材: 部分代码: package picture_mosical; import java.awt ...

  9. 全面战争模拟器 for Mac(模拟战争游戏)

    全面战争模拟器 for Mac是一款非常好玩的策略.模拟类型的游戏,你可以在全面战争模拟器特别版中经历各个时代的战争,多个不同的场景供你选择,这里提供Totally Accurate Battle S ...

  10. 模拟经营动物园java,动物园游戏下载|动物园下载 (经典模拟经营游戏)_单机游戏下载...

    动物园是一款十分经典的模拟经营类游戏,游戏画面精美可玩性很高,玩家们将经营自己的动物园,吸引更多的游客,赚取更多的资金来让自己成为动物园大亨. 动物园是一款由Excalibur制作,Merge Gam ...

最新文章

  1. 阿里深度序列匹配模型SDM:如何刻画大型推荐系统的用户行为?
  2. vuejs及相关工具介绍
  3. 【BZOJ1146】【CTSC2008】网络管理 [整体二分]
  4. Python 定时调度
  5. docker 覆盖 entrypoint_最佳实践,Dockerfile中ENTRYPOINT与CMD指令的区别与建议
  6. java中split以“.“ 、“\“、“|”分隔
  7. 段落排版--行间距, 行高(line-height)
  8. Win10系统如何查看声卡ID
  9. unit 12 文档练习
  10. 由_exit()引起的对于缓冲区的理解
  11. 实对称矩阵的特征值求法_机器学习和线性代数 - 特征值和特征向量
  12. SPI通信协议_02
  13. Spyder5 显示器校准 色彩校准
  14. 中国最受欢迎50大技术博客评选结果详见
  15. [Linux命令] Cat是一只可爱的猫
  16. Web 图集应用,属于非游戏类的图集/雪碧图对象/JS雪碧图/前端图集/JS图集
  17. 研华运动控制卡接线图_ADVANTECH研华PCI-1245S运动控制卡4轴DSP架构脉冲型 步进/伺服电机SCARA控制通用PCI卡...
  18. 马云说聪明的人都离开了阿里,剩下的成了富翁
  19. 【物联网那些事儿】18 大物联网操作系统,Raspbian Pi、Ubuntu Core、Windows 10 IoT、Micropython、OpenWrt ....你用过哪几个?
  20. Car-eye JT/T1078 视频服务器开发过程中的音频处理

热门文章

  1. android mjpg格式,Camera常用格式MJPEG和jpeg-turbo库
  2. 华为机试HJ102:字符统计
  3. MathorCup 高校数学建模挑战赛第一届——大数据竞赛论文格式及提交规范
  4. .ul>li 和 .ul li的区别
  5. 定了!自考还没有报名的每人补贴8000元!政策扶持,名额有限,速看!!!!...
  6. SpringBoot整合RedisTemplate实现缓存信息监控
  7. 1150 Travelling Salesman Problem (25 分)(分析题目,细节处理)
  8. 使用openjtag和openocd操作IXP425的flash
  9. 老男孩教育 | 5分钟带你搞懂日志采集利器Filebeat!
  10. Nothing Phone 1智能手机;索尼X系列三款便携式蓝牙音箱;三星第二代SmartSSD计算存储驱动器 | 科技新品...