pygame--坦克大战(二)

加载敌方坦克

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

初始化敌方坦克。

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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IP地址获取不到的原因是什么?

在数字化时代的今天&#xff0c;互联网已成为我们日常生活和工作中不可或缺的一部分。而IP地址&#xff0c;作为互联网通信的基础&#xff0c;其重要性不言而喻。然而&#xff0c;有时我们可能会遇到IP地址获取不到的问题&#xff0c;这会给我们的网络使用带来诸多不便。那么&a…

基于单片机的光伏电量检测系统的设计

**单片机设计介绍&#xff0c;基于单片机的光伏电量检测系统的设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的光伏电量检测系统的设计概要主要围绕实现光伏电量的实时监测与精准测量展开。以下是该设计的主要内…

flutter获取手机中的系统路径信息

https://www.bilibili.com/video/BV1wE421g7sw获取系统中的路径 获取系统中的路径&#xff0c;并在这个路径中创建一个文本文件【str.txt】 然后进行写入【str.txt】 再读取这个文件【str.txt】 手机没有开通root权限无法看到写入到【应用程序文档目录】路径中的文件 用来…

大创项目推荐 深度学习 python opencv 火焰检测识别 火灾检测

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

Node.js介绍

Node.js 是一个开源和跨平台的 JavaScript 运行时环境。它是几乎任何类型的项目的流行工具&#xff01;

剑指Offer题目笔记25(使用回溯法解决其他类型问题)

面试题85&#xff1a; 问题&#xff1a; ​ 输入一个正整数n&#xff0c;输出所有包含n个左括号和n个右括号的组合&#xff0c;要求每个组合的左括号和右括号匹配。 解决方案&#xff1a; ​ 使用回溯法。因为要生成n个左括号和n个右括号&#xff0c;故需要走2n步&#xff0…

LabVIEW专栏三、探针和断点

探针和断点是LabVIEW调试的常用手段&#xff0c;该节以上一节的"测试耗时"为例 探针可以打在有线条的任何地方&#xff0c;打上后&#xff0c;经过这条线的所有最后一次的数值都会显示在探针窗口。断点可以打在程序框图的所有G代码对象&#xff0c;包括结构&#xf…

浅谈通信校验码及 CRC 校验

一、信息论中的 CRC 我上大学的时候,有一门课程叫做信息论,我就是从这个课程中学到的 CRC 校验这个词的,没错,当时学完整个课程后,CRC 对我来说依然只是一个单薄的缩写词语,全称我都不知道是啥。 CRC 全称是循环冗余校验(Cyclic Redundancy Check)。 说到信息论中的…

28. BI - 图论工具和算法, 社区发现以及最短路径

本文为 「茶桁的 AI 秘籍 - BI 篇 第 28 篇」 Hi, 我是茶桁. 咱们已经讲了好几节课的 PageRank, 也了解了 PageRank 的原理就是基于图论. 之前我有给讲过, 在「数学篇」中我们有用四个章节来详细的讲解图论的相关知识。其中包括&#xff1a; 23. 图论 - 图的由来和构成24. 图…

Go实现一个并发下载器

本文将实现一个并发的文件下载器&#xff0c;可以在不重新启动整个下载的情况下处理错误。这将通过分块下载文件来实现。 Idea 首先从发出下载的HTTP请求开始&#xff0c;当采用HEAD option来请求要下载的文件时&#xff0c;在某些服务器上&#xff0c;返回的标头之一是Conte…

【C++面向对象】C++考试题库管理系统(源码)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

构建第一个ArkTS应用(FA模型)

创建ArkTS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。选择Application应用开发&#xff08;本文以应用开发为例&#xff0c;Atomic Servi…

深入理解Java内存模型及其作用

目录 1.前言 2.为什么要有 Java 内存模型&#xff1f; 2.1 一致性问题 2.2 重排序问题 3.Java 内存模型的定义 4.规范内容 4.1 主内存和工作内存交互规范 4.2 什么是 happens-before 原则&#xff1f; 1.前言 当问到 Java 内存模型的时候&#xff0c;一定要注意&#…

【轻松上手】透明屏安装教程,一步到位,让您轻松享受透明视界

透明屏以其独特的视觉效果和广泛的应用场景&#xff0c;越来越受到人们的青睐。想要轻松享受透明视界&#xff0c;正确的安装步骤至关重要。下面&#xff0c;我们将为您提供一份简单明了的透明屏安装教程&#xff0c;让您一步到位&#xff0c;轻松上手。 第一步&#xff1a;准备…

STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (a)

深入分析及学习一下上面这一段代码的构成与含义。 首先&#xff0c;这个GPIO_InitTypeDef GPIO_InitStructure;其实与int a 是完全类似的语法格式以及含义。 GPIO_InitStructure就相当于a这样一个变量。不过从这个变量的名字可以知道&#xff0c;这是一个用于GPIO初始化的结构…

Java | Leetcode Java题解之第7题整数反转

题目&#xff1a; 题解&#xff1a; class Solution {public int reverse(int x) {int rev 0;while (x ! 0) {if (rev < Integer.MIN_VALUE / 10 || rev > Integer.MAX_VALUE / 10) {return 0;}int digit x % 10;x / 10;rev rev * 10 digit;}return rev;} }

MySQL函数大全

目录 一、数值类函数 1、ABS 2、SQRT 3、POW 4、MOD 5、CEIL 6、FLOOR 7、RAND 8、ROUND 9、SIGN 二、聚合函数 三、字符串函数 1、LENGTH 2、CHAR_LENGTH 3、CONCAT 4、INSERT 5、LOWER 6、UPPER 7、LEFT 8、RIGHT 9、TRIM 10、REPLACE 11、SUBSTRING …

正则表达式(1)

文章目录 专栏导读1、match2、匹配目标3、通用匹配4、常用匹配规则表格 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN 数据分析领域优质创作者&#xff0c;专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫实战教学》&#xff0c;本专栏针对大学生…

前端调试工具之Chrome Elements、Network、Sources、TimeLine调试

常用的调试工具有Chrome浏览器的调试工具&#xff0c;火狐浏览器的Firebug插件调试工具&#xff0c;IE的开发人员工具等。它们的功能与使用方法大致相似。Chrome浏览器简洁快速&#xff0c;功能强大这里主要介绍Chrome浏览器的调试工具。 打开 Google Chrome 浏览器&#xff0c…

Java多线程实战-从零手搓一个简易线程池(三)线程工厂,核心线程与非核心线程逻辑实现

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️本系列源码仓库&#xff1a;多线程并发编程学习的多个代码片段(github) &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正…