python飞机大战键盘事件监听

python飞机大战键盘事件监听
监听不到字母键是怎么回事?其他键可以监听到代码中的例子的K_UP键可以监听到
但是字母键b监听不到

代码作用:
按下 b 键随机返回0~100炸弹数量
如图 按下k_up键改变bomb数量并输出b

img

换回 b 键

img

没有反应,这是什么原因


    def event_handler(self):
        """
        @return: 如果监听到退出事件,返回 True,否则返回 False
        """
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return True
            elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                return True
            elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
                if self.is_game_over:  # 游戏已经结束
                    self.reset_game()  # 游戏已经开始
                else:
                    self.is_pause = not self.is_pause  # 切换暂停状态
            # 判断是否正在游戏
            if not self.is_game_over and not self.is_pause:
                # 监听玩家按下”b”键,引爆1颗炸弹
                if event.type == pygame.KEYDOWN and event.key == pygame.K_UP:
                    # TODO 测试炸弹数量变化(# TODO···表示待完成项目提醒)
                    self.hud_panel.show_bomb(random.randint(0,100))
                    print("b")
        return False

可能与其他工具或软件的按键有冲突,更换一个其他的按键试试

  • 这篇博客: 庖丁解牛——用纯python构建深度学习框架(一)中的 2. 使用随机模拟的方法来求解最优k,b(蒙特卡洛模拟) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • import random
    
    var_max,var_min = 100,-100
    k,b = random.randint(var_min,var_max), random.randint(var_min,var_max)
    
    min_loss = float('inf')
    best_k, best_b = None,None
    
    def model(x, k ,b):
        return x * k + b
        
    total_times = 10000
    
    for t in range(total_times):
        k, b = random.randint(var_min,var_max), random.randint(var_min,var_max)
        loss_ = loss(y,model(x_rm , k ,b))
        
        if loss_< min_loss:
            min_loss = loss_
            best_k, best_b = k, b
            print(f'在{t}时刻找到了更好的k:{best_k}  b:{best_b}')
    
    >>>0时刻找到了更好的k:17  b:671时刻找到了更好的k:4  b:-612时刻找到了更好的k:3  b:-4215时刻找到了更好的k:3  b:-3163时刻找到了更好的k:7  b:-33134时刻找到了更好的k:18  b:-92250时刻找到了更好的k:12  b:-48499时刻找到了更好的k:4  b:1635时刻找到了更好的k:7  b:-18774时刻找到了更好的k:13  b:-591772时刻找到了更好的k:7  b:-215629时刻找到了更好的k:9  b:-35
    
    

    其中的x就是RM,y是price
    但是在训练中我们可以发现一个问题就是,随着最优k,b的更新次数增加,找到更好的k,b就需要更长的时间。这需要很多的时间成本,而且更重要的是我们只是相较于之前的模型进行了优化,但是优化了多少我们并不清楚,以及还有进行多少次数,这些都是未知数。简单的理解就是通过计算机帮助我们瞎猜,但是我们却没有一个停止猜的标准,所以说这种方式是很糟糕的一种方式。

  • 以下回答由chatgpt基于相关博客总结生成:

    问题分析:

    根据描述,可以得知在python飞机大战游戏中,无法监听到字母键b,其他键正常监听。因此问题可能出在代码监听键盘事件的部分。同时,代码的作用是按下b键时,随机返回0~100的炸弹数量;按下K_UP键时,可以改变炸弹数量并输出b,再次按下b键则无反应。因此需要检查代码中针对b键所做的事件处理。

    解决方案:

    根据问题分析,可以检查以下代码的部分:

    1. 检查是否正确监听了按键事件,是否按键名字有错误。
    2. 检查是否在按下b键时,调用了正确的处理炸弹数量的函数。

    以下是一份简单的示例代码,来检查以上两个问题:

    import pygame
    import random
    
    pygame.init()
    
    # 设置屏幕
    size = width, height = 600, 400
    screen = pygame.display.set_mode(size)
    pygame.display.set_caption("Plane Game")
    
    # 加载图片
    bg_image = pygame.image.load("background.png")
    my_plane_image = pygame.image.load("plane.png")
    enemy_plane_image = pygame.image.load("enemy_plane.png")
    
    # 设置字体
    font = pygame.font.Font(None, 30)
    
    # 设置游戏状态和炸弹数量
    game_over = False
    bomb_num = 0
    
    # 按键事件的处理函数
    def handle_event(event):
        global bomb_num
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_b:
                bomb_num = random.randint(0, 100)
            elif event.key == pygame.K_UP:
                bomb_num += 10
                print("炸弹数量为:", bomb_num)
                print("按下了 b 键")
    
    while not game_over:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True
            else:
                handle_event(event)
    
        # 绘制屏幕
        screen.blit(bg_image, (0, 0))
        screen.blit(my_plane_image, (100, 100))
        screen.blit(enemy_plane_image, (300, 200))
    
        # 绘制炸弹数量文本
        text = font.render("炸弹数量:" + str(bomb_num), 1, (255, 255, 255))
        screen.blit(text, (10, 10))
    
        # 刷新屏幕
        pygame.display.flip()
    
    pygame.quit()
    

    如果代码中存在以上问题,可以根据代码结合问题的描述进行调整,如果没有问题,则可能是其他因素导致的,需要进一步排查。

    总结:

    在编写事件监听代码时,需要注意按键名称是否含有错误;在处理按键事件时,需要调用正确的处理函数。如果对代码中的原理和实现不熟悉,可以使用示例代码进行调试和参考。

该回答引用GPT
根据你提供的代码,监听键盘事件的部分似乎是正确的。然而,字母键盘事件无法被监听的问题可能是因为你没有在事件循环之前调用pygame.key.set_repeat()函数。

pygame.key.set_repeat()函数用于设置按键重复的速率。如果不调用该函数,按下字母键时只会触发一次pygame.KEYDOWN事件,而无法持续触发。

你可以在初始化游戏的代码中调用pygame.key.set_repeat()函数,如下所示:


```python
pygame.init()
pygame.key.set_repeat(1, 10)  # 设置按键重复的速率


```
这将允许按键在按下并保持按住的情况下持续触发pygame.KEYDOWN事件。第一个参数是按键按下后开始重复触发的延迟时间(以毫秒为单位),第二个参数是每次重复触发之间的间隔时间(以毫秒为单位)。

在调用pygame.key.set_repeat()函数后,你应该能够监听到字母键的事件了。