python飞机大战键盘事件监听
监听不到字母键是怎么回事?其他键可以监听到代码中的例子的K_UP键可以监听到
但是字母键b监听不到
代码作用:
按下 b 键随机返回0~100炸弹数量
如图 按下k_up键改变bomb数量并输出b
换回 b 键
没有反应,这是什么原因
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
可能与其他工具或软件的按键有冲突,更换一个其他的按键试试
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:67
在1时刻找到了更好的k:4 b:-61
在2时刻找到了更好的k:3 b:-42
在15时刻找到了更好的k:3 b:-31
在63时刻找到了更好的k:7 b:-33
在134时刻找到了更好的k:18 b:-92
在250时刻找到了更好的k:12 b:-48
在499时刻找到了更好的k:4 b:1
在635时刻找到了更好的k:7 b:-18
在774时刻找到了更好的k:13 b:-59
在1772时刻找到了更好的k:7 b:-21
在5629时刻找到了更好的k:9 b:-35
其中的x就是RM,y是price
但是在训练中我们可以发现一个问题就是,随着最优k,b的更新次数增加,找到更好的k,b就需要更长的时间。这需要很多的时间成本,而且更重要的是我们只是相较于之前的模型进行了优化,但是优化了多少我们并不清楚,以及还有进行多少次数,这些都是未知数。简单的理解就是通过计算机帮助我们瞎猜,但是我们却没有一个停止猜的标准,所以说这种方式是很糟糕的一种方式。
问题分析:
根据描述,可以得知在python飞机大战游戏中,无法监听到字母键b,其他键正常监听。因此问题可能出在代码监听键盘事件的部分。同时,代码的作用是按下b键时,随机返回0~100的炸弹数量;按下K_UP键时,可以改变炸弹数量并输出b,再次按下b键则无反应。因此需要检查代码中针对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()函数后,你应该能够监听到字母键的事件了。