独情 發表於 2025-8-3 16:24:00

pygame小游戏打飞机_7射中检测

<p><strong>定义击中的函数:</strong></p>
<p>计算子弹与飞机之间的欧式距离,若该距离小于预设碰撞距离,则判定为击中敌人。​</p>
<div>
<pre class="language-python highlighter-hljs"><code># 新增 欧式距离计算函数
def distance(bx,by,ex,ey):
    a = bx-ex
    b = by-ey
    # 新增 返回两者距离值
    return (a**2+b**2)**0.5</code></pre>
</div>
<div>
<pre class="highlighter-hljs"><code># 新增 定义击中的函数
def hit(self):
    # 新增 判断是否射中敌人
    for e in enemies:
      if distance(self.x,self.y,e.x,e.y)&lt;30:</code></pre>
<p><strong>若击中成立:</strong></p>
<p>判定为击中后将敌人回复至原位,删除子弹</p>
<div>
<pre class="highlighter-hljs"><code># 新增 定义重置敌人位置的函数
def reset(self):
    # 新增 重复显示敌人的操作
    self.x = random.randint(100, 360)
    self.y = random.randint(50, 60)</code></pre>
<div>
<pre class="highlighter-hljs"><code># 新增 定义击中的函数
def hit(self):
    # 新增 判断是否射中敌人
    for e in enemies:
      if distance(self.x,self.y,e.x,e.y)&lt;30:
            # 新增 当击中敌人则移除子弹
            bullets.remove(self)
            # 新增 当击中敌人则调用reset函数将敌人位置重置
            e.reset()</code></pre>
<p><strong>完整代码:</strong></p>
<div>
<pre class="language-python highlighter-hljs"><code># 引用 pygame
import pygame
# 引用随机模块
import random

# 使程序初始化
pygame.init()
# 设置游戏窗口大小
screen = pygame.display.set_mode((480, 700))
# 设置标题
pygame.display.set_caption('打飞机')
# 设置游戏图标
icon = pygame.image.load('ufo.png')
pygame.display.set_icon(icon)
# 引入背景图片
bgImg = pygame.image.load('background.png')

# 引入玩家图片
playerImg = pygame.image.load('player.png')
# 定义玩家初始位置
playerX = 225
playerY = 450
# 定义变量表示玩家运动速度
playerStep = 0
# 变量表示敌人数量
number_of_enemies = 6


# 定义敌人的类,其中包括图片(self.img)初始位置( self.x,self.y )运动速度(self.step)
class Enemy:
    def __init__(self):
      self.img = pygame.image.load('enemy.png')
      # 通过 random 函数生成随机位置坐标
      self.x = random.randint(100, 360)
      self.y = random.randint(50, 100)
      # 定义变量表示敌人运动速度。注意:由于速度随机数为浮点型,使用 random.uniform 函数生成
      self.step = random.uniform(0.05, 0.3)
    # 新增 定义重置敌人位置的函数
    def reset(self):
      # 新增 重复显示敌人的操作
      self.x = random.randint(100, 360)
      self.y = random.randint(50, 60)


# 定义子弹的类,其中包括图片(self.img)初始位置( self.x,self.y )运动速度(self.step)
class Bullet:
    def __init__(self):
      self.img = pygame.image.load('bullet.png')
      # 将子弹显示在玩家上方
      self.x = playerX + 48
      self.y = playerY + 5
      # 定义变量表示子弹运动速度。
      self.step = 1
    # 新增 定义击中的函数
    def hit(self):
      # 新增 判断是否射中敌人
      for e in enemies:
            if distance(self.x,self.y,e.x,e.y)&lt;30:
                # 新增 当击中敌人则移除子弹
                bullets.remove(self)
                # 新增 当击中敌人则调用reset函数将敌人位置重置
                e.reset()



# 保存现有的子弹
bullets = []

# 创建列表保存创建的 number_of_enemies 个敌人
enemies = []
for i in range(number_of_enemies):
    # 每循环一次创建一个敌人保存到列表中
    enemies.append(Enemy())

# 新增 欧式距离计算函数
def distance(bx,by,ex,ey):
    a = bx-ex
    b = by-ey
    # 新增 返回两者距离值
    return (a**2+b**2)**0.5

# 定义显示敌人的函数
def show_enemy():
    # 循环控制所有敌人的显示、移动、边界反弹
    for e in enemies:
      # 使敌人出现在(enemyX, enemyY)的位置
      screen.blit(e.img, (e.x, e.y))
      # 使敌人飞机左右移动
      e.x += e.step
      # 控制敌人移动边界,当敌人碰到左右边界时反弹,当敌人运动到上下边界时停止
      if e.x &gt; 378:
            e.step *= -1
            # 当碰到左右边界时下沉
            e.y += 20
      if e.x &lt; 0:
            e.step *= -1
            e.y += 20
      # 控制边界
      if e.y &gt; 572:
            e.y = 572
      if e.y &lt; 0:
            e.y = 0


# 定义显示子弹的函数
def show_bullet():
    # 循环控制所有子弹的显示、移动和删除
    for b in bullets:
      # 使子弹出现在(b.x,b.y)的位置
      screen.blit(b.img, (b.x, b.y))
      # 新增 调用hit函数判断子弹是否击中敌人
      b.hit()
      # 使子弹向上移动
      b.y -= b.step
      # 判断子弹是否出界,是则移除
      if b.y &lt; 0:
            bullets.remove(b)


running = True
# 进行循环 游戏主循环
while running:
    # 绘制背景
    screen.blit(bgImg, (0, 0))
    # 绘制玩家
    screen.blit(playerImg, (playerX, playerY))
    # 调用显示敌人函数
    show_enemy()
    # 显示子弹
    show_bullet()
    # 获取游戏事件队列中的所有事件(涉及到玩家的各种交互,如鼠标点击、键盘操作、窗口事件等)
    for event in pygame.event.get():
      # 如果事件是QUIT事件,如点击窗口的关闭按钮,则退出循环
      if event.type == pygame.QUIT:
            # 退出循环
            running = False
      # KEYDOWN 判断键盘是否按下
      if event.type == pygame.KEYDOWN:
            # 判断按下左右键进行移动赋值
            if event.key == pygame.K_RIGHT:
                playerStep = 0.5
            elif event.key == pygame.K_LEFT:
                playerStep = -0.5
            # 判断按下空格键
            elif event.key == pygame.K_SPACE:
                # 创建一颗子弹
                bullets.append(Bullet())

      # KEYUP 判断键盘是否抬起
      if event.type == pygame.KEYUP:
            # 抬起键盘时将移动距离改为 0
            playerStep = 0

    # 玩家左右移动
    playerX += playerStep
    # 控制玩家移动的边界
    if playerX &gt; 378:
      playerX = 378
    if playerX &lt; 0:
      playerX = 0
    if playerY &gt; 572:
      playerY = 572
    if playerY &lt; 0:
      playerY = 0

    # 界面更新
    pygame.display.update()</code></pre>
<p><strong>运行效果如下:</strong></p>
<p><strong><img src="https://img2024.cnblogs.com/blog/3680152/202508/3680152-20250803162255945-2076557730.gif"></strong></p>
</div>
</div>
</div>
</div><br><br>
来源:https://www.cnblogs.com/cyber120/p/19020206
頁: [1]
查看完整版本: pygame小游戏打飞机_7射中检测