pygame--坦克大战(二)

news2024/11/26 10:49:13

加载敌方坦克

敌方坦克的方向是随机的,使用随机数生成。

初始化敌方坦克。

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]
    # 坦克所在的区域  Rect->
    self.rect = self.image.get_rect()
    # 指定坦克初始化位置 分别距x,y轴的位置
    self.rect.left = left
    self.rect.top = top
    # 新增速度属性
    self.speed = speed
    self.stop = True

生成随机的四个方向

  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 creatEnemyTank(self):
    top = 100
    speed = random.randint(3,6)
    for i in range(MainGame.EnemTank_count):
      #每次都随机生成一个left值
      left = random.randint(1, 7)
      eTank = EnemyTank(left*100,top,speed)
      MainGame.EnemyTank_list.append(eTank)

坦克类的优化

class Tank:
  '''
   坦克类
   '''
  def display_tank(self) -> None:
    '''
     显示坦克
     '''
    # 获取最新坦克的朝向位置图片
    self.image = self.images.get(self.direction)
    MainGame.window.blit(self.image,self.rect)
  def move(self) -> None:
    '''
     坦克的移动
     '''
    if self.direction == "L":
      # 判断坦克的位置是否已左边界
      if self.rect.left > 0:
        # 修改坦克的位置 离左边的距离  - 操作
        self.rect.left = self.rect.left - self.speed
    elif self.direction == "R":
      # 判断坦克的位置是否已右边界
      if self.rect.left + self.rect.width < SCREEN_WIDTH:
        # 修改坦克的位置 离左边的距离  + 操作
        self.rect.left = self.rect.left + self.speed
    elif self.direction == "U":
      # 判断坦克的位置是否已上边界
      if self.rect.top > 0:
        # 修改坦克的位置 离上边的距离  - 操作
        self.rect.top = self.rect.top - self.speed
    elif self.direction == "D":
      # 判断坦克的位置是否已下边界
      if self.rect.top + self.rect.height < SCREEN_HEIGHT:
        # 修改坦克的位置 离上边的距离  + 操作
        self.rect.top = self.rect.top + self.speed
  def shot(self) -> None:
    '''
     坦克的射击
     '''
    pass


class MyTank(Tank):
  '''
   我方坦克类
   '''
  def __init__(self,left:int,top:int) -> None:
    # 设置我方坦克的图片资源
    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 = 'L'
    # 获取图片信息
    self.image = self.images.get(self.direction)
    # 获取图片的矩形
    self.rect = self.image.get_rect()
    # 设置我方坦克位置
    self.rect.left = left
    self.rect.top = top
    # 设置移动速度
    self.speed = 10
    # 设置移动开关, False 表示不移动, True 表示移动
    self.remove = False


class MainGame:
  '''
   游戏主窗口类
   '''
  # 游戏主窗口对象
  window =None
  # 设置我放坦克
  my_tank = None
  # 存储敌方坦克的列表
  enemy_tank_list = []
  # 设置敌方坦克的数量
  enemy_tank_count = 6


  def __init__(self) -> None:
    pass
  def start_game(self) -> None:
    '''
     开始游戏
     '''
    # 初始化游戏窗口
    pygame.display.init()
    # 创建一个窗口
    MainGame.window = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
    # 设置窗口标题
    pygame.display.set_caption('坦克大战1.0')
    # 创建一个我方 坦克
    MainGame.my_tank = MyTank(350,200)
    # 创建敌方坦克
    self.create_enemy_tank()
    # 刷新窗口
    while True:
      sleep(0.02)
      # 给窗口设置填充色
      MainGame.window.fill(BG_COLOR)
      # 增加提示文字
      # 1.要增加文字内容
      # num = 6
      text = self.get_text_surface(f'敌方坦克剩余数量{MainGame.enemy_tank_count}')
      # 2.如何把文字加上
      MainGame.window.blit(text,(10,10))
      # 增加事件
      self.get_event()
      # 显示 我方坦克
      MainGame.my_tank.display_tank()
      # 显示敌方坦克
      self.display_enemy_tank()
      # 移动坦克
      if MainGame.my_tank.remove:
        MainGame.my_tank.move()
      pygame.display.update()

敌方坦克随机移动



  def rand_move(self):
    '''
     随机移动
     '''
    # 判断步长是否为0
    if self.step <= 0:
      # 如果小于0,更换方向
      self.direction = self.rand_direction()
      # 重置步长
      self.step = 20
    else:
      # 如果大于0,移动
      self.move()
      # 步长减1
      self.step -=1

将敌方坦克加到窗口中

  def display_enemy_tank(self) -> None:
    '''
     显示敌方坦克
     '''
    for e_tank in self.enemy_tank_list:
      # 显示敌方坦克
      e_tank.display_tank()
      # 移动敌方坦克
      e_tank.rand_move()

在开始游戏方法,加载敌方坦克

 #循环展示敌方坦克
 self.display_enemy_tank()

运行结果:

image-20211126154440054

完善子弹类 

初始化子弹

 '''
   子弹类
   '''
  def __init__(self,tank) -> None:
    # 加载图片
    self.image = pygame.image.load('./img/enemymissile.gif')
    # 获取子弹的方向
    self.direction = tank.direction
    # 获取子弹的图形
    self.rect = self.image.get_rect()
    # 设置子弹的位置
    if self.direction == "L":
      # 子弹的位置 = 坦克的位置 - 子弹的宽度
      self.rect.left = tank.rect.left - self.rect.width
      # 子弹的位置 = 坦克的位置 + 坦克的高度/2 - 子弹的高度/2
      self.rect.top = tank.rect.top + tank.rect.height/2 - self.rect.height/2
    elif self.direction == "R":
      # 子弹的位置 = 坦克的位置 + 坦克的宽度
      self.rect.left = tank.rect.left + tank.rect.width
      # 子弹的位置 = 坦克的位置 + 坦克的高度/2 - 子弹的高度/2
      self.rect.top = tank.rect.top + tank.rect.height/2 - self.rect.height/2
    elif self.direction == "U":
      # 子弹的位置 = 坦克的位置 + 坦克的宽度/2 - 子弹的宽度/2
      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":
      # 子弹的位置 = 坦克的位置 + 坦克的宽度/2 - 子弹的宽度/2
      self.rect.left = tank.rect.left + tank.rect.width/2 - self.rect.width/2
      # 子弹的位置 = 坦克的位置 + 坦克的高度
      self.rect.top = tank.rect.top + tank.rect.height
    # 设置子弹的速度
    self.speed = 10

展示子弹

  #展示子弹的方法
  def displayBullet(self):
    MainGame.window.blit(self.image,self.rect)

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

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

相关文章

僵死进程(僵尸进程)

1.僵死进程产生的原因或者条件: 什么是僵死进程?当子进程先于父进程结束,父进程没有获取子进程的退出码,此时子进程变成僵死进程. 简而言之,就是子进程先结束,并且父进程没有获取它的退出码; 那么僵死进程产生的原因或者条件就是:子进程先于父进程结束,并且父进程没有获取子进…

HAL STM32 硬件I2C方式读取AS5600磁编码器获取角度例程

HAL STM32 硬件I2C方式读取AS5600磁编码器获取角度例程 &#x1f4cd;相关篇《STM32 软件I2C方式读取AS5600磁编码器获取角度例程》 ✨stm32使用硬件I2C去读取角度数据&#xff0c;通过STM32CubeMX工具配置工程&#xff0c;读取角度数据&#xff0c;只需要调用一个函数&#xf…

vulhub打靶记录——healthcare

文章目录 主机发现端口扫描FTP—21search ProPFTd EXPFTP 匿名用户登录 web服务—80目录扫描search openemr exp登录openEMR 后台 提权总结 主机发现 使用nmap扫描局域网内存活的主机&#xff0c;命令如下&#xff1a; netdiscover -i eth0 -r 192.168.151.0/24192.168.151.1…

空间数据结构(四叉树,八叉树,BVH树,BSP树,K-d树)

下文参考&#xff1a;https://www.cnblogs.com/KillerAery/p/10878367.html 游戏编程知识课程 - 四分树(quadtree)_哔哩哔哩_bilibili 利用空间数据结构可以加速计算&#xff0c;是重要的优化思想。空间数据结构常用于场景管理&#xff0c;渲染&#xff0c;物理&#xff0c;游…

云计算对象存储服务

对象存储服务&#xff08;OSS&#xff09;中的存储桶(Bucket)叫做‘OBS桶 存储桶&#xff08;Bucket&#xff09;&#xff1a;存储桶式对象存储服务中用于存储对象的基本容器&#xff0c;类似于文件系统中的文件夹。每个存储桶具有唯一的名称&#xff0c;并且可以在桶中存储任…

用于自动驾驶,无人驾驶领域的IMU六轴陀螺仪传感器:M-G370

用于自动驾驶,无人驾驶的IMU惯导模块六轴陀螺仪传感器:M-G370。自2020年&#xff0c;自动驾驶,无人驾驶已经迎来新突破&#xff0c;自动驾驶汽车作为道路交通体系的一员&#xff0c;要能做到的就是先判断周边是否有障碍物&#xff0c;自身的行驶是否会对其他交通参与成员产生危…

STM32F4系列单片机的定时器讲解和计数器,PWM信号输出,PWM信号捕获的实现对电机进行控制和监测功能

1.定时器功能介绍&#xff1a; 在控制领域里面&#xff0c;我们可以用信号输出定时器&#xff0c;进行PWM的控制&#xff0c;从而达到控制电机的目的&#xff0c;通过输入捕获功能可以用来接收外部的数字信号&#xff0c;用于测量脉冲宽度、频率或周期等。在这里给大家介绍下&…

二维相位解包理论算法和软件【全文翻译-将相位分解为 “非旋转 “和 “旋转 “(2.4)】

2.4 将相位分解为 "非旋转 "和 "旋转 "部分 借用电磁场理论,可以用发散和卷曲来指定矢量场[9][10]。当且仅当矢量函数 F(r)(以及由其描述的场)在整个域 D 中不旋转或无旋转时,我们称之为矢量函数 F(r)、 因此,如果等式 2.30(也是第 2.2 节关于路径…

面对汽车充电桩隐私泄露威胁,应该怎么做?

想必各位车主在第一次扫码或刷卡使用汽车充电桩时&#xff0c;都会出现类似于上图的请求&#xff0c;除了上述的定位权限外&#xff0c;运营商还会索要你的网络权限、相机权限、通知权限、设备信息权限、存储权限、电话权限等。 那么你知道这些权限充电桩获取后到底用于什么吗&…

DELL服务器使用iDRAC升级BIOS等固件版本

前言 正值DELL推出DELL R730XD服务器最新的BIOS固件&#xff08;2.19.0 2024/3/18&#xff09;之际&#xff0c;本人也有合适的时间将手头的服务器BIOS固件进行升级操作。 本文博将DELL R730xd 的iDRAC8版本为例&#xff0c;介绍整个升级过程。其他DELL类型的服务器操作类似&…

黄金票据攻击

黄金票据攻击——域内横向移动技术 一、黄金票据攻击介绍&#xff1a; 黄金票据攻击是一种滥用Kerberos身份认证协议的攻击方式&#xff0c;它允许攻击者伪造域控krbtgt用户的TGT&#xff08;Ticket-Granting Ticket&#xff09;。通过这种方法&#xff0c;攻击者可以生成有效…

【C语言】2048小游戏【附源码】

一、游戏描述&#xff1a; 2048是一款数字益智类游戏&#xff0c;玩家需要使用键盘控制数字方块的移动&#xff0c;合并相同数字的方块&#xff0c;最终达到数字方块上出现“2048”的目标。 每次移动操作&#xff0c;所有数字方块会朝着指定方向同时滑动&#xff0c;并在靠近边…

supersqli-攻防世界

题目 加个报错 1 and 11 #没报错判断为单引号字符注入 爆显位 1 order by 2#回显正常 1 order by 3#报错 说明列数是2 尝试联合查询 -1 union select 1,2# 被过滤了 return preg_match("/select|update|delete|drop|insert|where|\./i",$inject); select|update|d…

vCenter Server出现no healthy upstream的解决方法

https://blog.51cto.com/wangchunhai/4907250 访问vCenter 7.0 地址后&#xff0c;页面出现“no healthy upstream”,无法正常登录vCenter&#xff0c;重启后依旧如此&#xff0c;该故障的前提是没有对vCenter做过任何配置&#xff0c;如下图所示。 尝试登录"VMware vCen…

快速排渣器与矿用快速除渣器

你不想虚度光阴&#xff0c;你想用自己的努力&#xff0c;书写自己人生的精彩&#xff0c;那么&#xff0c;你脚下的路不能回头&#xff0c;铺满掌声和鲜花的人生路上&#xff0c;脚下没有那么平坦&#xff0c;或是泥泞&#xff0c;或是陷阱&#xff0c;别管多么艰难的路程&…

前端跨页面通信方案介绍

在浏览器中&#xff0c;我们可以同时打开多个Tab页&#xff0c;每个Tab页可以粗略理解为一个“独立”的运行环境&#xff0c;即使是全局对象也不会在多个Tab间共享。然而有些时候&#xff0c;我们希望能在这些“独立”的Tab页面之间同步页面的数据、信息或状态。这就是本文说说…

ubuntu20.04 运行 lio-sam 流程记录

ubuntu20.04 运行 lio-sam 一、安装和编译1.1、安装 ROS11.2、安装 gtsam1.3、安装依赖1.4、下载源码1.5、修改文件1.6、编译和运行 二、官方数据集的运行2.1、casual_walk_2.bag2.2、outdoor.bag、west.bag2.3、park.bag 三、一些比较好的参考链接 记录流程&#xff0c;方便自…

新质生产力崛起,运营商前端运营如何跃升

“新质生产力”一个当前的热搜高频词&#xff0c;今年还被首次写进政府工作报告&#xff0c;是2024年十大工作任务的首位。那么什么是“新质生产力”&#xff1f;它对于我们的生活、学习、工作及未来发展有什么影响呢&#xff1f;今天小宝就抛砖引玉来讲一讲“新质生产力”对于…

数字化服务升级:数字乡村改善农民生活质量

随着信息技术的迅猛发展&#xff0c;数字化浪潮已经深入社会的各个角落&#xff0c;为人们的生活带来了翻天覆地的变化。在乡村地区&#xff0c;数字化服务的升级正在逐步改变农民的生活方式&#xff0c;提高他们的生活质量。本文将围绕数字化服务升级&#xff0c;探讨数字乡村…

【精心整理】2024最新Web安全攻防教程资料PPT大合集

以下是学习资料目录&#xff0c;如需要下载&#xff0c;请您前往星球查阅和获取&#xff1a;https://t.zsxq.com/18YLzWtDI 1、Sqlmap Tamper脚本编写介绍-01.pptx 2、Tamper脚本分析&#xff08;支持所有类型数据库的Tamper脚本&#xff09;-01.pptx 3 、Sqlmap Tamper脚本分析…