Python 项目练习1 外星人入侵(武装飞船)

2020年07月30日

| 萬仟网IT编程

| 我要评论

本项目具体步骤在书本《Python编程:从入门到实践》第十二章中安装pygame可通过pip安装:python -m pip install --user pygame-1.9.2a0-cp35-none-win32.whlPygame窗口alien_invasion.pyimport sys import pygame from settings import Settingsfrom ship import Shipimport game_functions as gffrom p

本项目具体步骤在书本《Python编程:从入门到实践》第十二章中

安装pygame

可通过pip安装:

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

Pygame窗口

alien_invasion.py

import sys

import pygame

from settings import Settings

from ship import Ship

import game_functions as gf

from pygame.sprite import Group

def run_game(): # 初始化游戏并创建一个屏幕对象

# 初始化pygame、设置和屏幕对象

pygame.init()

ai_settings = Settings()

screen = pygame.display.set_mode(

(ai_settings.screen_width, ai_settings.screen_height))

pygame.display.set_caption("Alien Invasion")

# 创建一艘飞船

ship = Ship(ai_settings, screen)

# 创建一个用于存储子弹的编组

bullets = Group()

# 开始游戏的主循环

while True:

# 监视键盘和鼠标事件

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

ship.update()

gf.update_bullets(bullets)

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

run_game()

设置类

settings.py

class Settings():

"""存储《外星人入侵》的所有设置的类"""

def __init__(self):

"""初始化游戏的设置"""

# 屏幕设置

self.screen_width = 1200

self.screen_height = 800

self.bg_color = (230, 230, 230)

# 飞船的设置

self.ship_speed_factor = 1.5

# 子弹设置

self.bullet_speed_factor = 1

self.bullet_width = 3

self.bullet_height = 15

self.bullet_color = 60, 60, 60

self.bullets_allowed = 3

飞船图像

图片放到 images 文件夹里,图片名为 ship.bmp

图片后缀为.bmp

Ship 类

ship.py

import pygame

class Ship():

def __init__(self, ai_settings, screen):

"""初始化飞船并设置其初始位置"""

self.screen = screen

self.ai_settings = ai_settings

# 加载飞船图像并获取其外接矩形

self.image = pygame.image.load('images/ship.bmp')

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

# 在飞船的属性center中存储小数值

self.center = float(self.rect.centerx)

# 移动标志

self.moving_right = False

self.moving_left = False

def update(self):

"""根据移动标志调整飞船的位置"""

# 更新飞船的center值,而不是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

# 根据self.center更新rect对象

self.rect.centerx = self.center

def blitme(self):

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

self.screen.blit(self.image, self.rect)

响应模块 game_functions

game_functions.py

import sys

import pygame

from bullet import Bullet

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

"""响应按键"""

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)

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 check_keyup_events(event, ship):

"""响应松开"""

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, 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)

# 在飞船和外星人后面重绘所有子弹

for bullet in bullets.sprites():

bullet.draw_bullet()

ship.blitme()

# 让最近绘制的屏幕可见

pygame.display.flip()

def update_bullets(bullets):

"""更新子弹的位置,并删除已消失的子弹"""

# 更新子弹的位置

bullets.update()

# 删除已消失的子弹

for bullet in bullets.copy():

if bullet.rect.bottom <= 0:

bullets.remove(bullet)

Bullet 类

bullet.py

import pygame

from pygame.sprite import Sprite

class 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.centerx

self.rect.top = ship.rect.top

#存储用小数表示的子弹位置

self.y = float(self.rect.y)

self.color = ai_settings.bullet_color

self.speed_factor = ai_settings.bullet_speed_factor

def update(self):

"""向上移动子弹"""

#更新表示子弹位置的小数值

self.y -= self.speed_factor

#更新表示子弹的rect的位置

self.rect.y = self.y

def draw_bullet(self):

"""在屏幕上绘制子弹"""

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

效果图:

本文地址:https://blog.csdn.net/qq_41657977/article/details/107674229

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

最近,在终端启动python时,报了一个错误:failed calling sys.__interactivehook__traceback (most rec...

在某些特殊情况下,我们的 python 脚本需要调用父目录下的其他模块。例如:在编写 gne 的测试用例时,有一个脚本 generate_new_cases.p...

python 界有条不成文的准则: 计算密集型任务适合多进程,io 密集型任务适合多线程。本篇来作个比较。通常来说多线程相对于多进程有优势,因为创建一个进程开销...

bfs"""# @time : 2020/11/8# @author : jimou chen"""# 广搜def bfs(graph, start): q...

1、使用xlrd模块读取数据# 将excel表格内容导入到tables列表中def import_excel(tab): # 创建一个空列表,存储excel的数...

在学习return函数时候,还是要知道了解它最主要的函数作用,比如,怎么去实现返回一个值,另外还有就是我们经常会用到的使用return能够进行多值输出,这才是我...

使用程序难免会有出错的时候,如何从大篇代码中找出错误,不仅考验能力,还要考验小伙们的耐心。辛辛苦苦敲出的代码运行不出结果,非常着急是可以理解的。那么我们在pyt...

一、准备工作:1、安装mysql3.7,创建一个test数据库,创建student表,创建列:(列名看代码),创建几条数据(以上工作直接用navicat for...

通过fiddler抓包比较,基本可以确定是javascript生成加密cookie导致原来的请求返回521。发现问题:  打开fiddler软件,用浏览器打开目...

1.self只有在类的方法中才会有,其他函数或方法是不必带self的。2.在调用时不必传入相应的参数。3.在类的方法中(如__init__),第一参数永远是se...

网友评论

验证码:

python外星人入侵飞船上下移动_Python 项目练习1 外星人入侵(武装飞船)相关推荐

  1. 外星人入侵 python 飞船位置_《python从入门到实践》项目一:外星人入侵

    游戏编程思维导图 游戏思路 函数编写 第一次做思维导图,做的有点乱 解释:跟着<python编程从入门到实践>写完游戏程序后,写一下自己的心得体会.可以把这个游戏分为几块来理解.如果想要设 ...

  2. python支付程序源码_python项目中实现支付宝网页支付

    支付流程 在一次项目中需要引入支付宝接口实现支付宝支付,使用场景如下: 用户在我方商户系统中选择了购买商品,我方商户系统生成一张支付订单,用户点击订单的支付按钮后,页面会跳转到一个支付二维码的界面. ...

  3. python视图函数是什么_python项目Django(视图函数)

    一 Django的视图函数view 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错 ...

  4. python 大众点评模拟登陆_python项目实战:模拟登陆163邮箱,简单到爆

    前言 相信大家都会做一些有趣的Python项目,对于小白的我们来说,如果成功了的话,那成就感是非常爆棚的的,这也是非常有助学习. 接下来,为大家介绍一个selenium 模拟登陆163邮箱的代码 首先 ...

  5. python制作动态小游戏_Python——项目-小游戏2-动画绘制

    实现游戏循环还有事件的监听 在上一讲中 你需要完成这样的这样的效果, 如果你还没有完成,请不要继续往下阅读!!切记切记切记.,重要的事情说三遍 我们来看一下什么是游戏循环 所谓的游戏循环很好的理解 就 ...

  6. python飞机大战计分代码_Python项目实战-飞机大战

    {getUnitName} {getLessonName} 敬请期待 免费 {getTaskName} 剩余观看时长:{watchLimitRemaining} 回放 {activityStartTi ...

  7. python从入门到实践 第12章 武装飞船 之 调整飞船的速度程序实践

    第一个文件,main.py是主程序 #main.py import sys import pygame from settings import Settings from ship import S ...

  8. python项目一:外星人入侵:(一)武装飞船

    第一章:武装飞船 1.1.规划项目 1.2.安装Pygame 1.3.开始游戏项目 1.3.1.创建pygame窗口以及响应用户输入 1.3.2.设置背景色 1.3.3.创建设置类 1.4.添加飞船图 ...

  9. python外星人入侵游戏加随机游动_Python外星人入侵游戏(四):飞船左右移动

    今日任务: 控制飞船 动手前思考 1.如何实现左右移动:游戏是通过循环来刷新界面,那就需要在循环中更新飞船的位置,更新位置是通过按键的点击,所以操作应该在监听按键和页面刷新中完成 2.考虑到习惯,我们 ...

最新文章

  1. [Python学习] 专题四.文件基础知识
  2. Linux 统计文件行数,字节数。
  3. 数据只会告诉你该怎么走
  4. Cookie (设置与读取、超时设置、指定路径、显示用户上次登录时间)
  5. knife4j文档请求异常_umi-request 网络请求之路
  6. 计算机组装与维护精品,国家精品课程——《计算机组装与维护》.pdf
  7. matlab取整函数记录
  8. C语言实现飞机订票系统
  9. 使用matlab的appdesigner绘制Steward并联机构
  10. [Java,IDEA]连接oracle的关于oracle.jdbc.driver.OracleDriver一直驱动加载失败的原因
  11. Windows 10调整色温显示器
  12. 场效应管的分类及型号命名方法
  13. Elasticsearch集群监控指标学习
  14. HBase综合测试(头歌实践教学项目)
  15. 【转】excel音标乱码
  16. 地图经纬度坐标相互转换度分秒
  17. 菊风云 | 音视频社交崛起的背后
  18. docker搭建redis高可用集群
  19. 兰州城市学院计算机专业在哪个校区,兰州城市学院 代码
  20. 系统流程图与数据流图的联系与区别

热门文章

  1. 精灵标注助手(Colabeler)使用教程
  2. 没有学好 飞鸽传书2007
  3. 药品区块链溯源:解决溯源痛点 实现药品风控管理
  4. oem718d 基准站设置_Novatel诺瓦泰 OEM718D单机测向板卡
  5. HK-Data20190426-2数据集中GNSS消息订阅
  6. python tkinter界面布局,python图形界面tkinter布局那些事
  7. 音乐剪辑软件哪个比较好用?
  8. 汇编语言:字符串加密
  9. 服务器连局域网网卡一直不亮的解决方法
  10. 2019.07-美国数学大联盟决赛获得铜牌