python打飞机源代码-如何用Python打飞机?

更新时间:2023-05-30 23:22:48 阅读: 评论:0

python打飞机源代码-如何⽤Python打飞机?
前⾔: 除了⽣孩⼦ ,啥都会 。包括打飞机 !今天⼩詹的⼀位读者就来教你如何⽤ python 打飞机 !
简述
相信⼩詹是⼀个单纯的孩⼦ ,也相信⼤家明⽩⼩詹说的打飞机是指啥意思 ,对吧 ?嗯 ,没⽑病 。就是 pygame 实现⼀个打飞机的游戏
,优秀的我啊 !
我们知道 pygame 框架可以⽤于管理图形 、动画声⾳等 ,能够利⽤它来轻松地开发复杂的游戏 ,可以让我们更加专注于⾯向对象编程 。此项⽬是基于 pygame 框架搭建的⼀个⼩游戏 ,在此⽂中将实现此项⽬的 50% ,后续会有跟进 ,源代码已经放在我的 GitHub 中 ,并在进⾏中将会不断对代码结构进⾏优化 ,对样式进⾏优化 。在本例中将会接触简单的⾯向对象编程和继承 。⾯向对象编程是提取项⽬中某种事物的关键属性进⾏抽象 ,抽象模型中包括数据和⾏为 ,类是对象的抽象 ,对象是类的实例 。
源代码获取⽅式见置顶留⾔ 。
先送上⼀波效果图(被压缩的时间略短)
效果图
游戏简介 :在游戏《外星⼈⼊侵》中 ,玩家控制着⼀艘最初出现在屏幕底部中央的飞船 。玩家可以使⽤箭头键左右移动飞船 ,还可使⽤空格键进⾏射击 。游戏开始时 ,⼀群外星⼈出现在天空中 ,他们在屏幕中向下移动 。玩家的任务是射杀这些外星⼈ 。玩家将所有外星⼈都消灭⼲净后 ,将出现⼀群新的外星⼈ ,他们移动的速度更快 。只要有外星⼈撞到了玩家的飞船或到达了屏幕底部 ,玩家就损失⼀艘飞船。玩家损失三艘飞船后 ,游戏结束 。
游戏⽤例图(第⼀次画⽤例图,不是很准确……)
⽤例图
分析该项⽬ ,飞船 、⼦弹 、外星⼈可以分别划分为具有共同属性的⼀类 ,类中定义各⾃的属性 ,包括图像 、形状 、位置 、更新位置 、绘制图像等 ;在主函数中将对象实例化 ,对对象中的成员变量和函数进⾏调⽤实现移动 、击杀等操作 ;本节实现飞船和⼦弹类和基本功能。
在构建⼦弹类时 ,⽤到了继承的概念 ,当在参与⼤型项⽬开发设计时 ,继承是⼀个⾮常关键的概念 。继承是对已有类的⼀种复⽤ ,⼦类继承⽗类 ,可以对⽗类中的⽅法和数据进⾏重写 ,也可以新定义只属于⼦类的成员变量 。当项⽬中有许多类具有相同的基本属性时 ,可以考虑将这些基本属性抽
象为⼀个⽗类 ,⼦类通过继承⽗类⽽拥有⽗类中的数据和⽅法 ,这会提⾼代码的可读性 ,也省去很多重复的代码 。
当前新建以下⼏个⽂件 :alien-invasion.py 主函数
ship.py 飞船类
bullet.py ⼦弹类
game_functions.py 许多主函数会调⽤的函数
ttings.py 配置⽂件 ,常量
其⽬录结构如下 :
形容白的成语
代码运⾏步骤 :
powershell进⼊到⼯程⽬录下(/fun_python>)
cd ./alien_invasion
python alien_invasion.py
⽅法2——按照下⾯代码部分新建⽂件 ,并复制代码
在⽂件的同级⽬录下新建images⽬录
找飞船和⼦弹的图⽚分别命名为外星飞船.png和⽣⽓.…画风有点不对 ,怪我了 ,阔以⾃⼰找图⽚替代 ,对应修改飞船类和⼦弹类的⽂件名就好 ~
进⼊到代码的根⽬录下
python alien_invasion.py
代码
alien-invasion.pyrun_game()定义了主函数 ,⾸先绘制屏幕 , 对象 screen 是⼀个 surface ,在 pygame 中,surface 是屏幕的⼀部分 ,显⽰游戏元素 。每个元素 ,外星⼈或者飞船 ,⼦弹都是⼀个surface 。
ship = Ship(game_ttings,screen)就是⼀个对象是类的实例的例⼦ ,arguments 是类初始化需要传⼊的参数 ,ship就是Ship类型的对象 ,可以访问Ship类中的数据和⽅法 。
每个游戏循环中 ,更新飞船位置 ,⼦弹位置 ,⼦弹编组 ,重新渲染游戏界⾯ 。
⼦弹编组⽤来管理屏幕中的所有⼦弹 ,其实⽤列表来管理⼦弹对象也是可以实现的 ,但是 pygame ⾃带的 Group 已经定义了⼀些函数 ,更加⽅便 。import pygame
from ttings import Settings
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
def run_game():
pygame.init()
# 获取配置
game_ttings = Settings()
# 绘制屏幕
screen = pygame.display.t_mode((game_ttings.screen_width,game_ttings.screen_height))
25的英文怎么写
backgound_color = (220,230,230)
pygame.display.t_caption("Alien Invasion")
# 飞船实例化
ship = Ship(game_ttings,screen)
# ⼦弹编组,管理屏幕中所有的⼦弹,保存继承Sprite类的Bullet实例
bullets = Group()
while True:
# 检测飞船事件:左移右移发射⼦弹
gf.check_events(ship,game_ttings,screen,bullets) # 修改飞船移动标志
ship.update() # 根据飞船移动标志重新计算飞船中⼼位置
运动会英语怎么说# 更新所有⼦弹位置
gf.update_bullets(bullets)
# 绘制飞船⼦弹
gf.update_screen(game_ttings,screen,ship,bullets)
run_game()
ship.py类飞船类中主要涉及类初始化 ,飞船位置更新和渲染飞船surface 。
在初始化中主要定义⼀些代表飞船属性的成员变量 ,如图像 ,飞船矩形外形 ,飞船中⼼ ,飞船左移标志和右移标志等 。
涉及 pygame 的图像load()⽅法和get_rect()⽅法 ,主要是为了之后飞船和外星⼈进⾏碰撞计算 ,其实可以直接lf.image = pygame.image.load('images/外星飞船.png')加载图像 ,但是图像太⼤ ,就ansform.smoothscale⽅法修改图像⼤⼩ 。import pygame
class Ship(object):
"""docstring for Ship"""
def __init__(lf, game_ttings,screen):
super(Ship, lf).__init__()
lf.game_ttings = game_ttings
lf.screen = screen # screen游戏界⾯
lf.image = pygame.image.load('images/外星飞船.png').convert_alpha() # 加载飞船图像
# 修改图像⼤⼩
lf.width,lf.height = _size()第二次世界大战的时间
lf.image = ansform.smoothscale(lf.image,(lf.width//2,lf.height//2))
< = _rect()
lf.screen_rect = _rect()
# 获取游戏界⾯的中⼼x坐标和底部位置便可确定飞船位置
< = enterx) # centerx中只能表⽰整数
# 移动标志
鲤锦
def update(lf):
"""
根据移动标志调整飞船位置
更改为根据lf.center更新位置
曼谷游记
"""
ving_right ight < lf.screen_rect.right:
# x += 1
< += lf.game_ttings.ship_speed_factor
ving_left left > 0:
# x -= 1
< -= lf.game_ttings.ship_speed_factor
# 更新centerx,因为绘制图形是根据lf.rect()
# lf.rect()定位需要根据centerx,bottom
def blitme(lf):
"""在lf.rect位置绘制图像"""
lf.screen.blit(lf.)
bullet.py
在⼦弹类中尤为需要说明的是该类继承了Sprite精灵类 ,继承精灵类中的⽅法 。import pygame from pygame.sprite import Sprite
# 继承Sprite类,完善⾃⼰的代码
class Bullet(Sprite):
"""docstring for Bullet"""
def __init__(lf, game_ttings,screen,ship):
super(Bullet, lf).__init__()
lf.screen = screen
# # 在0,0位置创建bullet,并设置宽⾼
# lf.rect = pygame.Rect(0,0,game_ttings.bullet_width,game_ttings.bullet_height)
# # 调整⼦弹位置到飞船所在位置,调整top相同,中⼼x坐标相同
# x = x
# p = p
# # 将y坐标存储为⼩数值,以便能够微调⼦弹的速度
# lf.y = )
# lf.color = game_ttings.bullet_color
# lf.speed_factor = game_ttings.bullet_speed_factor
# 把⼦弹换成⼀个好玩的图⽚,把图⽚转换成位图
lf.image = pygame.image.load('images/⽣⽓.png').convert_alpha()
# 修改图像⼤⼩
lf.width,lf.height = _size()
lf.image = ansform.smoothscale(lf.image,(lf.width//10,lf.height//10)) lf.rect = _rect()
手工小花# 调整⼦弹位置到飞船所在位置,调整top相同,中⼼x坐标相同
# 将y坐标存储为⼩数值,以便能够微调⼦弹的速度
lf.y = )
lf.speed_factor = game_ttings.bullet_speed_factor
def update(lf):
"""向上移动⼦弹"""
# 更新⼀次坐标y向上移动speed_factor个像素
lf.y -= lf.speed_factor
# 更新⼦弹的rect位置
< = lf.y
def draw_bullet(lf):
猪肉包
# """
# API:rect(Surface,color,Rect,width=0)->Rect
# draw a rectangular shape on the Surgace
# The width argument is the thickness to draw the outer edge.
# If width is zero then the rectangle will be filled.
# """
# (lf.)
"""在lf.rect位置绘制图像"""
lf.screen.blit(lf.)
game_functions.py该⽂件的作⽤主要是集成主函数逻辑函数 ,判断飞船事件 ,更新⼦弹编组和更新屏幕
fill函数填充屏幕严肃 ,参数rgb
需要说明的是 bullets ⼦弹编组需要更新判断⼦弹是否超出屏幕 ,以从编组中删除 ,否则会影响效率
⿏标和键盘监听事件();事件键pygame.K_RIGHT pygame.K_LEFT pygame.K_SPACE 事件类型pygame.KEYDOWN pygame.KEYUPimport pygame
import sys
from bullet import Bullet
def check_keydown_events(event,ship,game_ttings,screen,bullets):
"""
按下键盘事件:右移,左移,发射⼦弹
"""
if event.key == pygame.K_RIGHT:
elif event.key == pygame.K_LEFT:
elif event.key == pygame.K_SPACE:

本文发布于:2023-05-30 23:22:48,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/953761.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:飞船   位置   屏幕   对象   游戏   继承   外星   代码
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图