python实现简单飞机大战小游戏
作者:HuCheng1997 发布时间:2023-12-19 06:55:37
标签:python,飞机大战
为了熟悉Python基础语法,学习了一个经典的案例:飞机大战,最后实现效果如下:
实现步骤:
①下载64位对应python
版本的pygame
:pygame-1.9.6-cp38-cp38-win_amd64.whl
② 更新pip
:python -m pip install --upgrade pip
③ 安装pygame
:pip install pygame-1.9.6-cp38-cp38-win_amd64.whl
④ 实现代码如下:
import sys # 导入系统模块
import random # 随机数模块
import pygame # 导入pygame模块
import pygame.locals # 导入pygame本地策略
ICO_PATH = "images/app.ico" # APP_ICO
APP_NAME = "飞机大战V1.0" # APP_NAME
Enemy_IMGS = ("images/enemy1.png", "images/enemy2.png") # ENEMY_IMGS
# TODO 定义一个公共类
class Model:
window = None # 主窗体window对象
# 初始化函数
def __init__(self, img_path, x, y):
self.img = pygame.image.load(img_path)
self.x = x
self.y = y
# 将图片填充到背景中
def display(self):
Model.window.blit(self.img, (self.x, self.y))
# TODO 背景
class Background(Model):
# 背景移动
def move(self):
if self.y <= Game.WINDOW_HEIGHT:
self.y += 1
else:
self.y = 0
# 背景图片展示
def display(self):
Model.window.blit(self.img, (self.x, self.y)) # 填充背景
Model.window.blit(self.img, (self.x, self.y - Game.WINDOW_HEIGHT)) # 填充辅助背景
# TODO 玩家类
class PlayerPlane(Model):
def __init__(self, img_path, x, y):
super().__init__(img_path, x, y)
# *
self.bullets = []
def display(self, enemys):
super().display()
remove_bullets = []
for bullet in self.bullets:
bullet.move()
bullet.display()
# 如果 * 小于消失于屏幕,删除 *
if bullet.y < -11:
remove_bullets.append(bullet)
# * 的矩阵
bullet_rect = pygame.locals.Rect(bullet.x, bullet.y, 5, 11)
# TODO 进行碰撞检测
for enemy in enemys:
# 敌机的矩阵
enemy_rect = pygame.locals.Rect(enemy.x, enemy.y, 57, 43)
# 如果碰撞
if pygame.Rect.colliderect(bullet_rect, enemy_rect):
# 随机修改敌机的位置模拟敌机销毁并生成新敌机并删除 *
enemy.img = pygame.image.load(Enemy_IMGS[random.randint(0, 1)])
enemy.x = random.randint(0, Game.WINDOW_WIDTH - 57)
enemy.y = random.randint(-Game.WINDOW_WIDTH, -43)
remove_bullets.append(bullet)
break
for bullet in remove_bullets:
self.bullets.remove(bullet)
# TODO 敌机类
class EnemyPlane(Model):
def __init__(self):
self.img = pygame.image.load(Enemy_IMGS[random.randint(0, 1)])
self.x = random.randint(0, Game.WINDOW_WIDTH - 57)
self.y = random.randint(-Game.WINDOW_WIDTH, -43)
def move(self):
if self.y > Game.WINDOW_HEIGHT:
self.y = -43 # 返回初始位置
else:
self.y += 1
# TODO * 类
class Bullet(Model):
def move(self):
self.y -= 1
# TODO 游戏类
class Game:
WINDOW_WIDTH = 410
WINDOW_HEIGHT = 614
# 初始化操作
def __init__(self):
self.window = pygame.display.set_mode([Game.WINDOW_WIDTH, Game.WINDOW_HEIGHT]) # 窗口的设置
self.background = Background("images/background.png", 0, 0) # 窗体模型的设置
self.player = PlayerPlane("images/me1.png", 180, 400)
self.enemyPlanes = []
for _ in range(5):
self.enemyPlanes.append(EnemyPlane())
# 游戏的入口函数
def run(self):
self.frame_init()
while True:
self.background.move() # 背景向上移动,模拟环境移动
self.background.display() # 将图片塞入到窗体中
self.player.display(self.enemyPlanes)
for enemy in self.enemyPlanes:
enemy.move()
enemy.display()
pygame.display.update() # 刷新窗体
self.event_init() # 监听事件
# 初始化窗口
def frame_init(self):
Model.window = self.window # 将window对象赋值给Model公有类
ico = pygame.image.load(ICO_PATH) # 加载图片
pygame.display.set_icon(ico) # 设置icon
pygame.display.set_caption(APP_NAME) # 设置app_name
# 事件初始化方法
def event_init(self):
for event in pygame.event.get():
# 关闭事件
if event.type == pygame.locals.QUIT:
sys.exit()
# 监听鼠标事件
if event.type == pygame.locals.MOUSEMOTION:
pos = pygame.mouse.get_pos()
self.player.x = pos[0] - 51
self.player.y = pos[1] - 63
focus_state = pygame.mouse.get_pressed()
if focus_state[0] == 1:
pos = pygame.mouse.get_pos()
self.player.bullets.append(Bullet("images/bullet1.png", pos[0], pos[1] - 75))
if __name__ == "__main__":
Game().run()
来源:https://blog.csdn.net/qq_38697437/article/details/109246590


猜你喜欢
- Jupyter是一个在线的代码编辑工具,想要调用本地的文件则需要切换路径到相应的文件路径下切换路径要在打开Jupyter之前完成操作:cd
- 可能是由于Django使用的MySQLdb库对Python3不支持,我们用采用了PyMySQL库来代替,导致出现各种坑,特别是执行以下2条命
- 索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬件优化,应用层面优化(web服务器,缓存)等等。这里的记录的优化技巧更适用于开发人
- 导入模块import numpy as npimport pandas as pd1.读取测试数据data=pd.read_csv(r
- 问题创建一个二叉树二叉树有限多个节点的集合,这个集合可能是:空集由一个根节点,和两棵互不相交的,分别称作左子树和右子树的二叉树组成创建二叉树
- 前言:在Vue项目中,当访问的页面路由不存在或错误时,页面显示为一片空白。然而,通常我们需要对访问url不存在或者错误的情况下添加默认的40
- 切片:方便截取list、tuple、字符串部分索引的内容正序切片语法:dlist = doList[0:3]表示,从索引0开始取,直到索引3
- 迭代器跟生成器,与上篇文章讲的装饰器一样,都是属于我的一个老大难问题。通常就是遇到的时候就去搜一下,结果在一大坨各种介绍博客中看了看,回头又
- 背景在vscode刚刚装好的时候,对于开发人员来说可能需要写一些模块的测试,而这个模块可能又引用了其他模块,如果是同级目录的话可能会出现Mo
- 前言:内容提要:本文比较了 Python 中用于列表排序的两种函数 sort() 和 sorted(),帮助您选择合适的排序函数。对列表排序
- 今天我去隽辰的博客去看他的文章,在读完他的文章之后,我很自然的就去读网友们给他留的评论,在读的时候我发现他的评论是顺序的,也就是最早的评论在
- 一、软件下载官方下载地址:https://download.jetbrains.8686c.com/webstorm/WebStorm-20
- 这个原因很简单,就是你没有在相应的表单信息中写入name属性。例如:<tr> <t
- 我们很容易用numpy()和from_numpy()将Tensor和NumPy中的数组相互转换。但是需要注意的一点是: 这两个函数所产生的T
- Q:在给Dataloader设置worker数量(num_worker)时,到底设置多少合适?这个worker到底怎么工作的?
- Entity Framework 4.0 也可以支持大名鼎鼎的MySql,这篇POST将向展示如何实现EF+MyS
- 背景由于 python 自带的源下载速度非常慢,特别是安装一些库的时候,甚至有时会失败。pip国内的一些镜像 阿里云 http:
- 一、使用等号查询可以像普通查询使用等号进行查询,但必须查询时间必须和字段对应时间完全相等,比如我要查下面这个值sql如下:SELECT id
- Keras的模型是用hdf5存储的,如果想要查看模型,keras提供了get_weights的函数可以查看:for layer in mod
- 当使用MySQL做站点的时候,肯定会有不知道的错误发生,怎么记录呢?以下是具体解决方法:class.method &n