python 历遍子弹_python之子弹移动

"""

新增功能:

完成我方坦克发射子弹的移动

"""

import pygame

import time

import random

win_width = 700

win_height = 500

bg_color = pygame.Color(0, 0, 0)

text_color = pygame.Color(255, 0, 0)

class MainGame():

window = None

my_tank = None

# 存储敌方坦克的列表

enemyTankList = []

# 定义敌方坦克的数量

enemyTankCount = 5

# 存储我方子弹的列表

myBulletList = []

def __init__(self):

pass

# 开始游戏

def startGame(self):

# 加载主窗口

# 初始化窗口

pygame.display.init()

# 设置窗口的大小以及显示

MainGame.window = pygame.display.set_mode([win_width, win_height])

# 初始化我方坦克

MainGame.my_tank = Tank(200, 300)

# 初始化敌方坦克,并将敌方坦克添加到列表中

self.createEnemyTank()

# 设计标题

pygame.display.set_caption('坦克大战1.0')

while True:

# 使用坦克移动的速度慢一些

time.sleep(0.02)

# 设置填充色

MainGame.window.fill(bg_color)

# 获取事件

self.getEvent()

# 绘制文字

MainGame.window.blit(self.getTextSuface

('地方坦克剩余%d' % len(MainGame.enemyTankList)), (10, 10))

# 调用坦克显示的方法

MainGame.my_tank.displayTank()

# 循环遍历敌方坦克列表,展示敌方坦克

self.blitEnemyTank()

# 循环遍历我方坦克的子弹

self.blitMyBullet()

# 调用移动方法

# 如果坦克的快关开启,才可以移动

if not MainGame.my_tank.stop:

MainGame.my_tank.move()

pygame.display.update()

# 初始化敌方坦克,并将敌方坦克添加到列表中

def createEnemyTank(self):

top = 100

# 循环生成敌方坦克

for i in range(MainGame.enemyTankCount):

left = random.randint(0, 600)

speed = random.randint(1, 4)

enemy = EnemyTank(left, top, speed)

MainGame.enemyTankList.append(enemy)

# 循环遍历敌方坦克列表,展示敌方坦克

def blitEnemyTank(self):

for enemyTank in MainGame.enemyTankList:

enemyTank.displayTank()

enemyTank.randMove()

# 循环遍历我方坦克的子弹

def blitMyBullet(self):

for myBullet in MainGame.myBulletList:

myBullet.displayBullet()

# 调用子弹的移动方法

myBullet.move()

# 结束游戏

def endGame(self):

print('拜拜了您勒')

exit()

# 左上角文字的绘制

def getTextSuface(self, number):

# 查看所有的字体

# print('pygame.font.get_fonts()')

# 初始化字体模块

pygame.font.init()

# 获取字体Font对象

font = pygame.font.SysFont('华文行楷', 18)

# 绘制文字信息

textSurface = font.render(number, True, text_color)

return textSurface

# 获取事件

def getEvent(self):

# 获取所有事件

eventList = pygame.event.get()

# 遍历事件

for event in eventList:

# 判断按下的键是关闭,还是方向

# 如果按下的是退出

if event.type == pygame.QUIT:

self.endGame()

if event.type == pygame.KEYDOWN:

# 判断按下的是上下左右

if event.key == pygame.K_LEFT:

MainGame.my_tank.direction = 'L'

# 修改坦克的开关状态

MainGame.my_tank.stop = False

# MainGame.my_tank.move()

print('左移')

elif event.key == pygame.K_RIGHT:

MainGame.my_tank.direction = 'R'

MainGame.my_tank.stop = False

# MainGame.my_tank.move()

print('右移')

elif event.key == pygame.K_UP:

MainGame.my_tank.direction = 'U'

MainGame.my_tank.stop = False

# MainGame.my_tank.move()

print('上移')

elif event.key == pygame.K_DOWN:

MainGame.my_tank.direction = 'D'

MainGame.my_tank.stop = False

# MainGame.my_tank.move()

print('下移')

elif event.key == pygame.K_SPACE:

print('发射子弹')

# 创建子弹 我方坦克发射

myBullet = Bullet(MainGame.my_tank)

MainGame.myBulletList.append(myBullet)

# 松开方向键,坦克停止移动,修改坦克的开关状态

if event.type == pygame.KEYUP:

# 判断松开的键是上下左右时候才停止坦克移动

if event.key == pygame.K_UP or event.key == pygame.K_DOWN or \

event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:

MainGame.my_tank.stop = True

class Tank():

# 距离上,左

def __init__(self, top, left):

# 保存加载的图片

self.images = {'U': pygame.image.load('img/p1tankU.gif'),

'D': pygame.image.load('img/p1tankD.gif'),

'L': pygame.image.load('img/p1tankL.gif'),

'R': pygame.image.load('img/p1tankR.gif')}

# 方向

self.direction = 'U'

# 根据当前图片的方向获取图片 surface

self.image = self.images[self.direction]

# 根据图片获取区域

self.rect = self.image.get_rect()

# 设置区域的left和top

self.rect.left = left

self.rect.top = top

# 速度 决定移动的快慢

self.speed = 2

# 坦克移动的开关

self.stop = True

# 移动

def move(self):

# 判断坦克的方向进行移动

if self.direction == 'L':

if self.rect.left > 0:

self.rect.left -= self.speed

elif self.direction == 'U':

if self.rect.top > 0:

self.rect.top -= self.speed

elif self.direction == 'D':

if self.rect.top + self.rect.height < win_height:

self.rect.top += self.speed

elif self.direction == 'R':

if self.rect.left + self.rect.height < win_width:

self.rect.left += self.speed

# 射击

def shoot(self):

pass

# 展示坦克

def displayTank(self):

# 获取展示的对象

self.image = self.images[self.direction]

# 调用blit方法展示

MainGame.window.blit(self.image, self.rect)

# 我方坦克

class MyTank(Tank):

def __init__(self):

pass

# 敌方坦克

class EnemyTank(Tank):

def __init__(self, left, top, speed):

# 加载图片集

self.images = {'U': pygame.image.load('img/enemy1U.gif'),

'D': pygame.image.load('img/enemy1D.gif'),

'L': pygame.image.load('img/enemy1L.gif'),

'R': pygame.image.load('img/enemy1R.gif')

}

# 方向,随机生成敌方坦克的方向

self.direction = self.randDirection()

# 根据方向获取图片

self.image = self.images[self.direction]

# 区域

self.rect = self.image.get_rect()

# 对left和top进行赋值

self.rect.left = left

self.rect.top = top

# 速度

self.speed = speed

# 移动开关

self.stop = True

# 新增一个步数变量 step

self.step = 70

# 随机生成敌方坦克的方向

def randDirection(self):

num = random.randint(1, 4)

if num == 1:

return 'U'

elif num == 2:

return 'D'

elif num == 3:

return 'L'

elif num == 4:

return 'R'

# 敌方随机移动的方法

def randMove(self):

if self.step <= 0:

# 修改方向

self.direction = self.randDirection()

# 让步数复位

self.step = 50

else:

self.move()

# 让步数递减

self.step -= 1

# 子弹类

class Bullet():

def __init__(self, tank):

# 加载图片

self.image = pygame.image.load('img/enemymissile.gif')

# 坦克的方向决定子弹的方向

self.direction = tank.direction

# 获取区域

self.rect = self.image.get_rect()

# 子弹的left和top与方向有关

if self.direction == 'U':

self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2

self.rect.top = tank.rect.top - self.rect.height

elif self.direction == 'D':

self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2

self.rect.top = tank.rect.top + tank.rect.height

elif self.direction == 'L':

self.rect.left = tank.rect.left - self.rect.width / 2 - self.rect.width / 2

self.rect.top = tank.rect.top + tank.rect.width / 2 - self.rect.width / 2

elif self.direction == 'R':

self.rect.left = tank.rect.left + tank.rect.width

self.rect.top = tank.rect.top + tank.rect.width / 2 - self.rect.width / 2

# 子弹的速度

self.speed = 6

# 移动

def move(self):

if self.direction == 'U':

if self.rect.top > 0:

self.rect.top -= self.speed

else:

pass

elif self.direction == 'D':

if self.rect.top + self.rect.height < win_height:

self.rect.top += self.speed

else:

pass

elif self.direction == 'L':

if self.rect.left > 0:

self.rect.left -= self.speed

else:

pass

elif self.direction == 'R':

if self.rect.left + self.rect.width < win_width:

self.rect.left += self.speed

else:

pass

# 展示子弹

def displayBullet(self):

# 将图片suface加载到窗口

MainGame.window.blit(self.image, self.rect)

# 墙壁

class Wall():

def __init__(self):

pass

# 展示墙壁

def displayWall(self):

pass

# 爆炸

class Explode():

def __init__(self):

pass

# 爆炸效果

def displayExplode(self):

pass

# 音效

class Music():

def __init__(self):

pass

# 展示音效

def displayMusic(self):

pass

if __name__ == '__main__':

MainGame().startGame()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SpringBoot 2】(十)数据库相关

写在前面&#x1f6eb;更多知识总结见SpringBoot 2专栏 &#x1f695;本篇知识点总结自尚硅谷雷神的视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客首页&#x1f680;&#x1f680;…

线性分组码的最小汉明距为6_第二章 线性代数

2.1 标量、向量、矩阵和张量标量(scalar)一个标量就是一个单独的数&#xff0c;用斜体表示标量。向量(vector)一个向量是一列有序排列的数&#xff0c;用粗写的小写字母表示。矩阵(matrix)矩阵式一个二维数组&#xff0c;其中的么一个元素由两个索引(而非一个)所确定&#xff0…

【SpringBoot 2】(十一)单元测试JUnit 5 指标监控

写在前面&#x1f6eb;更多知识总结见SpringBoot 2专栏 &#x1f695;本篇知识点总结自尚硅谷雷神的视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客首页&#x1f680;&#x1f680;…

sklearn中lstm_分别用sklearn和tensorflow做房价预测

原标题&#xff1a;分别用sklearn和tensorflow做房价预测本篇是后面用tensorflow做回归时的一个参照&#xff0c;忍不住要说的是sklearn真是简单好用&#xff0c;要不是他没有卷积cnn等时髦模型&#xff0c;真是不想用其他家的了。经典的sklearn集成模型结果&#xff1a;真是又…

多个containers 共用一个pvc_2020阜新PVC-UH市政管厂家-烟台塑胶

2020阜新PVC-UH市政管厂家烟台金沃泉塑胶有限公司主要产品PVC-U、PVC-M、PVC-UH聚氯乙烯给给水管材、HDPE高密度聚乙烯给水管材、CPVC氯化聚氯乙烯、MPP高压电力电缆护套管、PERT-Ⅱ型热力管道、高分子托辊管、水处理膜壳管。公司为电网、南方电网、电建集团、建筑集团、五矿集…

【SpringBoot 2】(十二) profile功能 自定义starter

写在前面&#x1f6eb;更多知识总结见SpringBoot 2专栏 &#x1f695;本篇知识点总结自尚硅谷雷神的视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客首页&#x1f680;&#x1f680;…

jpa transaction 回滚_我遇到的JPA中事务回滚的问题

在最近的项目中&#xff0c;做的是解析XML文件&#xff0c;解析过程中会有异常&#xff0c;比如&#xff1a;XML文件中节点的数据和与之对应的数据库的字段中数据的类型不匹配&#xff1b;XML中数据长度超过数据库定义的长度&#xff1b;有数据了的重复插入问题&#xff1b;读取…

pb 怎么判断是 小数_考试90分以上的孩子是怎么学数学的?听听老师怎么说?

一二年级&#xff0c;考试上九十分很轻松。但是&#xff0c;不少小朋友一上三年级&#xff0c;成绩就落下来了。那么&#xff0c;我们来看看三年级起&#xff0c;考试还能够保持在90分以上的孩子是怎么学习数学的吧&#xff01;第一&#xff0c;计算能力过关通过这两张图片的对…

快速上手Mybatis-Plus 入门案例

写在前面&#x1f6eb;更多知识总结见Mybatis-Plus专栏 &#x1f695;内容总结自尚硅谷杨博超老师的视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客首页&#x1f680;&#x1f680;…

交换机分布缓存_网络交换机缓存在数据中心的作用

什么产生了缓存&#xff1f;网络交换机要配置多少缓存才够用&#xff1f;缓存容量是否有标准可以衡量&#xff1f; 当网络交换机接口收到超出其所能处理的流量后&#xff0c;它会选择要么将其缓存&#xff0c;或者将其丢弃。 缓存通常都是因为网络接口速率不同造成的&#xff0…

黑苹果 选择语言 点不了_什么是天然的“黑钻”?—科普贴

天然黑钻也被成为“碳酸氢”&#xff0c;具有与白钻相同的化学成分&#xff0c;然而黑钻石的晶体结构是不同的&#xff0c;这意味着它们由许多小晶体组成&#xff0c;它们以随机的形式粘在一起&#xff0c;而不是一个具有可识别自然线的固体锥形。天然黑钻石有极高的含物&#…

sim卡没坏但苹果手机无服务_解决手机插SIM卡后都显示“无SIM卡”的故障问题

故障现象顾客描述手机插SIM卡后都显示“无SIM卡”。维修过程引起插入SIM卡却显示“无SIM卡”的故障&#xff0c;除了可能是SIM卡座的供电、时钟、复位及SIM卡插入检测信号不正常导致外&#xff0c;还有可能是基带不正常导致的。插上手机卡&#xff0c;左上角提示“无SIM卡”&am…

Mybatis-Plus实现简单的增删改查 实体类上的注解

写在前面&#x1f6eb;更多知识总结见Mybatis-Plus专栏 &#x1f695;内容总结自尚硅谷杨博超老师的视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客首页&#x1f680;&#x1f680;…

webpack 读取文件夹下的文件_webpack基本介绍及使用

1.什么是webpackwebpack是一个前端资源加载/打包工具。它根据模块的依赖关系进行静态分析&#xff0c;然后将这些模块按照指定的规则生成对应的静态资源。从上图看出&#xff0c;webpack可以将多种静态资源js&#xff0c;css&#xff0c;less转换成一个静态文件&#xff0c;减少…

conda失败说没有写权限_爱情中,为什么男生表白失败,女生还说可以继续做朋友,想过没有...

在爱情中&#xff0c;不是每个男生都是幸运的&#xff0c;也不是每次的表白都是如你所愿的。有成功总有失败&#xff0c;成功是喜悦的&#xff0c;但是失败却是痛苦的。不过有的时候男生和女生表白以后&#xff0c;女生对男生说了这样的一段&#xff0c;其实我希望以后我们还是…

Mybatis-Plus中Wrapper条件构造器的使用

写在前面 &#x1f6eb;更多知识总结见Mybatis-Plus专栏 &#x1f695;内容总结自尚硅谷杨博超老师的视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客首页&#x1f680;&#x1f680…

springboot设置默认值_线上Bug无法复现?老司机教你一招,SpringBoot远程调试不用愁!...

前言在部署线上项目时&#xff0c;相信大家都会遇到一个问题&#xff0c;线上的 Bug 但是在本地不会复现&#xff0c;多么无奈。此时最常用的就是取到前端传递的数据用接口测试工具测试&#xff0c;比如 POSTMAN&#xff0c;复杂不&#xff0c;难受不&#xff1f;今天陈某教你一…

Mybatis-Plus的分页 乐观锁插件 通用枚举 多数据源

写在前面&#x1f6eb;更多知识总结见Mybatis-Plus专栏 &#x1f695;内容总结自尚硅谷杨博超老师的视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客首页&#x1f680;&#x1f680;…

学python哪个网站好-有哪些值得推荐的Python学习网站|

现在那个网站可以学习python爬虫&#xff1f; 为大家分享Python学习经验: 1、寻找一本Python书籍&#xff0c;要求浅显易懂、全面细致程较好&#xff0c;专注于这一本&#xff0c;从头开始研究&#xff0c;把整本书掌握透彻。 2、找一个项目练手&#xff0c;熟悉基础后&#xf…

等待的操作过时_不会过时的6种网站seo优化操作

SEO优化一直在变化&#xff0c;百度和谷歌的算法也在不断的迭代更新&#xff0c;所以竞争永远不会停止。今天小编就来给大家分享一下&#xff0c;6种不会过时的网站seo优化操作。1.保持正常优化为网站访客提供高质量的内容、卓越的用户体验和安全性以及卓越的技术网站。这可能需…