使用pygame键盘监听只能监听到空格和数字是什么原因

img


空格和数字都是可以正常监测到,就是字母和方向键小数字键盘不行

试试使用键盘事件:

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                # 处理空格键按下事件
                # ...
            elif event.key == pygame.K_a:
                # 处理字母 "a" 键按下事件
                # ...
            elif event.key == pygame.K_LEFT:
                # 处理左箭头键按下事件
                # ...
            elif event.key == pygame.K_0:
                # 处理数字键 0 按下事件
                # ...
            # 添加其他键盘事件的处理
            # ...

有没有更完整的代码?就这个代码来看是没有问题的。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7700608
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:【Pygame实战】如果你是赛车爱好者:这款新赛车游戏分分钟让你上瘾(超跑又是谁的梦想?)
  • 除此之外, 这篇博客: 【Pygame实战】疫情期间给不能出门的你推荐一款爽游 《消灭病毒保卫城市》【强推】愿早日结束中的 代码演示: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 代码的话超级多的撒,还挺不好展示的,主要是分为三个py,这里给大家简单的展示一个主程序的

    代码吧!完整的大家都直接找我,很多代码都是显示了注释的哈,不懂的找我即可!

    最好是有一定基础的小伙伴儿找我,不然感觉新手小伙伴儿 要重头来 我讲也讲不清楚,请大家谅

    解,需要时间研究跟写文章,可能时间不够!偶尔解答问题随机哈!

    主程序代码700多行:

    import pygame
    import sys
    import traceback
    import os
    from pygame.locals import *
    import numpy as np
    import linecache
    from random import *
    import people
    import easygui as g
    from tkinter import *
    
    pygame.init()  # 游戏初始化
    pygame.mixer.init()  # 音效初始化
    
    bg_size = width, height = 1200, 700  # 屏幕大小
    screen = pygame.display.set_mode(bg_size)
    pygame.display.set_caption("消灭病毒保卫城市小游戏")  # 标题
    mycity = pygame.image.load("source/城市.jpg").convert()
    hospital_image = pygame.image.load("source/医院.jpg").convert_alpha()
    # massage_image = pygame.image.load("source/信息区.png").convert_alpha()
    
    
    good_man_image = pygame.image.load("source/健康人.png").convert_alpha()
    infect_man_image = pygame.image.load("source/感染人.png").convert_alpha()
    ill_man_image = pygame.image.load("source/重症人.png").convert_alpha()
    dead_man_image = pygame.image.load("source/死亡人.png").convert_alpha()
    cure_man_image = pygame.image.load("source/治愈人.png").convert_alpha()
    
    BLACK = (0, 0, 0)
    WHITE = (255, 255, 255)
    GREEN = (0, 255, 0)
    RED = (255, 0, 0)
    GRAY = (192, 192, 192)
    ORANGE = (255, 165, 0)
    
    # 游戏音乐
    pygame.mixer.music.load("source/背景音乐.mp3")
    pygame.mixer.music.set_volume(0.2)
    success_sound = pygame.mixer.Sound("source/正确.wav")
    success_sound.set_volume(0.2)
    lost_sound = pygame.mixer.Sound("source/失败.wav")
    lost_sound.set_volume(0.2)
    win_sound = pygame.mixer.Sound("source/胜利.wav")
    win_sound.set_volume(0.2)
    
    def ShowBack():
        # 背景图片
        # mycity = pygame.image.load("source/城市.jpg").convert()
        # hospital_image = pygame.image.load("source/医院.jpg").convert_alpha()
        doctor_image = pygame.image.load("source/医护支持.png").convert_alpha()
        pill_image = pygame.image.load("source/药物研究.png").convert_alpha()
        limit_image = pygame.image.load("source/限制出行.png").convert_alpha()
        protect_image = pygame.image.load("source/全民防护.png").convert_alpha()
        doctor_t_image = pygame.image.load("source/医护支持_t.png").convert_alpha()
        pill_t_image = pygame.image.load("source/药物研究_t.png").convert_alpha()
        limit_t_image = pygame.image.load("source/限制出行_t.png").convert_alpha()
        protect_t_image = pygame.image.load("source/全民防护_t.png").convert_alpha()
        massage_image = pygame.image.load("source/信息区.png").convert_alpha()
        money_image = pygame.image.load("source/人民币.png").convert_alpha()
        # screen.blit(mycity, (500, 0))  # 载入背景图片
        # screen.blit(hospital_image, (100, 200))  # 载入医院图片
        screen.blit(massage_image, (0, 0))  # 载入信息图片
        screen.blit(doctor_image, (300, 0))  # 载入医生图片
        screen.blit(doctor_image, (0, 200))  # 载入医生图片
        screen.blit(doctor_t_image, (0, 300))  # 载入医生文字图片
        screen.blit(pill_image, (400, 0))  # 载入药物图片
        screen.blit(pill_image, (0, 325))  # 载入药物图片
        screen.blit(pill_t_image, (0, 425))  # 载入药物图片
        screen.blit(limit_image, (300, 100))  # 载入限制出行图片
        screen.blit(limit_image, (0, 450))  # 载入限制出行图片
        screen.blit(limit_t_image, (0, 550))  # 载入限制出行图片
        screen.blit(protect_image, (400, 100))  # 载入保护图片
        screen.blit(protect_image, (0, 575))  # 载入保护图片
        screen.blit(protect_t_image, (0, 675))  # 载入保护图片
        screen.blit(money_image, (300, 2))  # 载入人民币图片
        screen.blit(money_image, (400, 2))  # 载入人民币图片
        screen.blit(money_image, (300, 102))  # 载入人民币图片
        screen.blit(money_image, (400, 102))  # 载入人民币图片
    
    # 初始化城市人数
    def InitCity(group, myimage, num):
        for i in range(num):
            gm = people.City(myimage)
            screen.blit(gm.image, gm.rect)
            group.add(gm)
    
    # 初始化医院人数
    def InitHospital(group, myimage, num):
        for i in range(num):
            gm = people.Hospital(myimage)
            screen.blit(gm.image, gm.rect)
            group.add(gm)
    
    # 住院治疗
    def AddtoHospital(group, image):
        hm = people.Hospital(image)
        group.add(hm)
        screen.blit(hm.image, hm.rect)
    
    # 死亡
    def AddtoDead(group, num):
        for i in range(num):
            dm = people.DeadErea()
            group.add(dm)
            screen.blit(dm.image, dm.rect)
    
    # 治愈
    def AddtoCure(group, num):
        for i in range(num):
            cm = people.CureErea()
            group.add(cm)
            screen.blit(cm.image, cm.rect)
    # 写入记录文件
    def PutRecord(file, record):
        f = open(file, mode='w', encoding='utf-8')
        for i in range(len(record)):
            f.write(str(record[i]))
            f.write("\n")
        f.close()
    # 读取记录
    def GetRecord(file):
        record = []
        f = open(file, mode='r', encoding='utf-8')
        for each in f.readlines():
            record.append(int(each))
        f.close()
        # print(record)
        return record
    # 清空组
    def Clear(group):
        for each in group:
            group.remove(each)
    
    # 主函数
    def main():
        pygame.mixer.music.play(-1)  # 播放背景音乐
    
        # 生成健康人组、感染人组、重症人组、治愈人组、病亡人组
        goodmans = pygame.sprite.Group()
        infectmans = pygame.sprite.Group()
        illmans = pygame.sprite.Group()
        curemans = pygame.sprite.Group()
        deadmans = pygame.sprite.Group()
        # 医院感染人和重症人
        hos_infectmans = pygame.sprite.Group()
        hos_illmans = pygame.sprite.Group()
    
        clock = pygame.time.Clock()  # 时钟
        delay = 100
        historyfile = "source/record.txt"  # 记录文件
    
        running = True  # 判断运行状态
        active = False  # 开始游戏
        waited = False  # 是否等待
        tolnum = 0  # 总人数
        goodnum = 0  # 初始化健康人数
        infectnum = 0  #  初始化感染人数
        city_infectnum = 0  # 初始化城市感染人数
        hos_infectnum = 0 # 初始化医院感染人数
        illnum = 0  # 初始化重症人数
        city_illnum = 0  # 初始化城市重症人数
        hos_illnum = 0  # 初始化医院重症人数
        curenum = 0  # 初始化治愈人数
        deadnum = 0  # 初始化死亡人数
        money = 0  # 初始钱
        doc_price = 1000  # 医护售价
        doc_num = 0  # 医护数量
        doc_cure = 5  # 每个医生医治患者数量
        pill_price = 2000  # 药物售价
        pill_level = 0  # 药物等级
        limit_price = 3000  # 限制价格
        limit_level = 0  # 限制等级
        protect_price = 4000  # 防护价格
        protect_num = 0  # 全民保护天数
        mlen = 20  # 移动步长
        getmoney = 6  # 每人每天赚钱数
        speed = 50  # 游戏速度
        protect_status = False  # 保护状态,默认没保护
        # goodtofm = [1, 2]  # 轻症感染概率
        # goodtoill = [1, 1]  # 重症感染概率
        fmtohos = [1, 50]  # 轻症患者住院概率,1/5
        fmtoill = [1, 100]  # 轻症患者转重症概率,1/10
        fmtocure = [1, 20]  # 轻症治愈概率,1/10
        illtohos = [1, 5]  # 重症住院概率,1/5
        illtodead = [1, 100]  # 重症转死亡,1/5
        illtofm = [1, 20]  # 重症转轻症,1/5
        record = []
    
        day = 1  # 天数
        time = 3  # 每天移动次数
        move = 0  # 移动计数
    
        myfont = pygame.font.Font("source/楷体_GB2312.ttf", 20)  # 使用楷体字体
        myfont_big = pygame.font.Font("source/楷体_GB2312.ttf", 36)  # 使用大字体
        myfont_small = pygame.font.Font("source/楷体_GB2312.ttf", 12)  # 使用小字体
        # 标志是否暂停游戏
        # paused = False
        # paused_image = pygame.image.load("source/暂停.png").convert_alpha()
        # resume_image = pygame.image.load("source/播放.png").convert_alpha()
        # paused_rect = paused_image.get_rect()
        # paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10
        # paused_show_image = paused_image
    
        # 主页
        mained = False  # 主页标志
        main_image = pygame.image.load("source/主页.png").convert_alpha()
        main_rect = main_image.get_rect()
        main_rect.left, main_rect.top = width - main_rect.width - 10, 10
    
        # 主页面
        start_image = pygame.image.load("source/开始游戏.png").convert_alpha()
        start_rect = start_image.get_rect()
        start_rect.left, start_rect.top = (width - start_rect.width) // 2, 380
        gameover_image = pygame.image.load("source/结束游戏.png").convert_alpha()
        gameover_rect = gameover_image.get_rect()
        gameover_rect.left, gameover_rect.top = (width - gameover_rect.width) // 2, 500
        goon_image = pygame.image.load("source/继续游戏.png").convert_alpha()
        goon_rect = goon_image.get_rect()
        goon_rect.left, goon_rect.top = (width - goon_rect.width) // 2, 380
        restart_image = pygame.image.load("source/重新开始.png").convert_alpha()
        restart_rect = restart_image.get_rect()
        restart_rect.left, restart_rect.top = (width - restart_rect.width) // 2, 440
        tolnum_add_image = pygame.image.load("source/增加.png").convert_alpha()
        tolnum_add_rect = tolnum_add_image.get_rect()
        tolnum_add_rect.left, tolnum_add_rect.top = 710, 300
        tolnum_dec_image = pygame.image.load("source/减少.png").convert_alpha()
        tolnum_dec_rect = tolnum_dec_image.get_rect()
        tolnum_dec_rect.left, tolnum_dec_rect.top = 735, 300
    
        protect_start_image = pygame.image.load("source/开始保卫.png").convert_alpha()
        protect_start_rect = protect_start_image.get_rect()
        protect_start_rect.left, protect_start_rect.top = 180, 150
        doc_buy_image = pygame.image.load("source/购买.png").convert_alpha()
        doc_buy_rect = doc_buy_image.get_rect()
        doc_buy_rect.left, doc_buy_rect.top = 310, 70
        pill_buy_image = pygame.image.load("source/购买.png").convert_alpha()
        pill_buy_rect = pill_buy_image.get_rect()
        pill_buy_rect.left, pill_buy_rect.top = 410, 70
        limit_buy_image = pygame.image.load("source/购买.png").convert_alpha()
        limit_buy_rect = limit_buy_image.get_rect()
        limit_buy_rect.left, limit_buy_rect.top = 310, 170
        protect_buy_image = pygame.image.load("source/购买.png").convert_alpha()
        protect_buy_rect = protect_buy_image.get_rect()
        protect_buy_rect.left, protect_buy_rect.top = 410, 170
        tip_text = myfont.render("对不起!您的资金不够!!", True, RED)
        doc_dec_image = pygame.image.load("source/减少.png").convert_alpha()
        doc_dec_rect = doc_dec_image.get_rect()
        doc_dec_rect.left, doc_dec_rect.top = 75, 205
        limit_dec_image = pygame.image.load("source/减少.png").convert_alpha()
        limit_dec_rect = limit_dec_image.get_rect()
        limit_dec_rect.left, limit_dec_rect.top = 75, 455
        protect_dec_image = pygame.image.load("source/减少.png").convert_alpha()
        protect_dec_rect = protect_dec_image.get_rect()
        protect_dec_rect.left, protect_dec_rect.top = 75, 580
    
        winflag = False  # 胜利标志
        recorded = False  # 是否有记录
        lostflag = False  # 失败标志
        # 自定义计时事件
        COUNT = pygame.USEREVENT
        # 每隔1秒发送一次自定义事件
        pygame.time.set_timer(COUNT, 1000)
        goon = False  # 默认新游戏
        # 计时器,当前历时时间
        counts = 0
        # 计时标志
        timer = False
        if os.path.exists(historyfile):  # 如果有记录
            recorded = True
            record = GetRecord(historyfile)
            day = record[0]
            tolnum = record[1]
            goodnum = record[2]  # 初始化健康人数
            city_infectnum = record[3]  # 初始化城市感染人数
            hos_infectnum = record[4]  # 初始化医院感染人数
            city_illnum = record[5]  # 初始化城市重症人数
            hos_illnum = record[6]  # 初始化医院重症人数
            curenum = record[7]  # 初始化治愈人数
            deadnum = record[8]  # 初始化死亡人数
            money = record[9]  # 初始钱
            doc_num = record[10]  # 医护数量
            pill_level = record[11]  # 药物等级
            limit_level = record[12]  # 限制等级
            protect_num = record[13]  # 全民保护天数
            infectnum = city_infectnum + hos_infectnum  # 初始化感染人数
            illnum = city_illnum + hos_illnum  # 初始化重症人数
        else:  # 没有记录时
            recorded = False
        ShowBack()  # 显示背景
        screen.blit(mycity, (500, 0))  # 载入城市图片
        screen.blit(hospital_image, (100, 200))  # 载入医院图片
        # 初始化组
        InitCity(goodmans, good_man_image, goodnum)  # 初始化健康人数
        InitCity(infectmans, infect_man_image, city_infectnum)  # 初始化城市感染轻症人数
        InitCity(illmans, ill_man_image, city_illnum)  # 初始化城市感染重症人数
        InitHospital(hos_infectmans, infect_man_image, hos_infectnum)  # 初始化医院感染轻症人数
        InitHospital(hos_illmans, ill_man_image, hos_illnum)  # 初始化医院感染轻症人数
        AddtoCure(curemans, curenum)  # 初始化治愈患者
        AddtoDead(deadmans, deadnum)  # 初始化病亡患者
        if tolnum == 0:
            tolnum =500
        # 记录文件
        while running:
            for event in pygame.event.get():
                if event.type == QUIT:  # 退出
                    # 写入记录文件
                    record = [day, tolnum, goodnum, city_infectnum, hos_infectnum, city_illnum, hos_illnum,\
                        curenum, deadnum, money, doc_num, pill_level, limit_level, protect_num]
                    # 确保建立文件
                    with open(historyfile, mode='w', encoding='utf-8') as f:
                        f.close()
                    PutRecord(historyfile, record)
                    pygame.quit()
                    sys.exit()
                elif event.type == MOUSEBUTTONDOWN and event.button == 1:  # 鼠标左键按下
                    # 按下主页键
                    if main_rect.collidepoint(event.pos):  # 是否主页
                        mained = True
                        active = False
                        waited = True
                        if mained:
                            pygame.mixer.music.pause()  # 背景音乐暂停
                            pygame.mixer.pause()  # 音效暂停
                    elif start_rect.collidepoint(event.pos) and not goon:  # 开始游戏
                        # print(goon)
                        active = True  # 开始游戏
                        winflag = False  # 重置
                        lostflag = False  # 重置
                        mained = False  # 重置
                        waited = False
                        paused = False
                        pygame.mixer.music.unpause()  # 背景音乐取消暂停
                        pygame.mixer.unpause()  # 音效取消暂停
                        # 初始化游戏
                        day = 1
                        goodnum = tolnum - 1
                        city_infectnum = 1
                        InitCity(goodmans, good_man_image, goodnum)  # 初始化健康人数
                        InitCity(infectmans, infect_man_image, city_infectnum)  # 初始化城市感染轻症人数
                        InitCity(illmans, ill_man_image, city_illnum)  # 初始化城市感染重症人数
                        InitHospital(hos_infectmans, infect_man_image, hos_infectnum)  # 初始化医院感染轻症人数
                        InitHospital(hos_illmans, ill_man_image, hos_illnum)  # 初始化医院感染轻症人数
                        AddtoCure(curemans, curenum)  # 初始化治愈患者
                        AddtoDead(deadmans, deadnum)  # 初始化病亡患者
                    elif goon_rect.collidepoint(event.pos) and goon:  # 继续游戏
                        active = True
                        waited = False
                        mained = False
                    elif restart_rect.collidepoint(event.pos):  # 重新开始
                        recorded = False
                        active = False
                        mained = False
                        # 重置
                        day = 0  # 天数
                        tolnum = 500  # 总人数
                        goodnum = 0  # 初始化健康人数
                        city_infectnum = 0  # 初始化城市感染人数
                        hos_infectnum = 0  # 初始化医院感染人数
                        city_illnum = 0  # 初始化城市重症人数
                        hos_illnum = 0  # 初始化医院重症人数
                        curenum = 0  # 初始化治愈人数
                        deadnum = 0  # 初始化死亡人数
                        money = 0  # 初始钱
                        doc_num = 0  # 医护数量
                        pill_level = 0  # 药物等级
                        limit_level = 0  # 限制等级
                        protect_num = 0  # 全民保护天数
                        Clear(goodmans)
                        Clear(infectmans)
                        Clear(illmans)
                        Clear(curemans)
                        Clear(deadmans)
                        Clear(hos_infectmans)
                        Clear(hos_illmans)
                    elif gameover_rect.collidepoint(event.pos):  # 结束游戏游戏
                        # 写入记录文件
                        record = [day, tolnum, goodnum, city_infectnum, hos_infectnum, city_illnum, hos_illnum, \
                                  curenum, deadnum, money, doc_num, pill_level, limit_level, protect_num]
                        # 确保建立文件
                        with open(historyfile, mode='w', encoding='utf-8') as f:
                            f.close()
                        PutRecord(historyfile, record)
                        pygame.quit()
                        sys.exit()
                    # 开始保卫
                    elif protect_start_rect.collidepoint(event.pos) and waited:
                        waited = False  # 运动
                        move = 0  # 重置
                    # 购买医护
                    elif doc_buy_rect.collidepoint(event.pos) and waited:
                        if money >= doc_price:
                            doc_num += 1
                            money -= doc_price
                        else:
                            screen.blit(tip_text, (510, 10))
                        #     g.msgbox("对不起,您的资金不够!")
    
                    # 购买药物研究
                    elif pill_buy_rect.collidepoint(event.pos) and waited:
                        if money >= pill_price:
                            pill_level += 1
                            money -= pill_price
                            illtodead[1] += int(illtodead[1] / 10)  # 死亡率降低
                            fmtoill[1] += int(fmtoill[1] / 10)  # 重症率降低
                            if illtofm[0] < illtofm[1]:
                                illtofm[0] += int(fmtoill[1] / 10)  # 转轻率提高
                            if fmtocure[0] < fmtocure[1]:
                                fmtocure[0] += int(fmtocure[1] / 10)  # 治愈率提高
                            # print(illtodead, fmtoill, illtofm, fmtocure)
                        else:
                            # g.msgbox("对不起,您的资金不够!")
                            screen.blit(tip_text, (510, 10))
                    # 购买限制投入
                    elif limit_buy_rect.collidepoint(event.pos) and waited:
                        if money >= limit_price and getmoney > 0 and mlen > 0:
                            getmoney -= 1  # 收入降低
                            limit_level += 1  # 限制等级提高
                            mlen -= 5
                            money -= limit_price
                        else:
                        #     g.msgbox("对不起,您的资金不够!")
                            screen.blit(tip_text, (510, 10))
                    # 购买保护
                    elif protect_buy_rect.collidepoint(event.pos) and waited:
                        if money >= protect_price:
                            protect_num += 1
                            money -= protect_price
                            protect_status = True
                        else:
                        #     g.msgbox("对不起,您的资金不够!")
                            screen.blit(tip_text, (510, 10))
                    # 减少医护
                    elif doc_dec_rect.collidepoint(event.pos) and waited:
                        if doc_num > 0:
                            doc_num -= 1
                            money += doc_price
                    # 减少限制
                    elif limit_dec_rect.collidepoint(event.pos) and waited:
                        if limit_level > 0:
                            limit_level -= 1
                            mlen += 5
                            getmoney += 1
                    # 减少保护
                    elif protect_dec_rect.collidepoint(event.pos) and waited:
                        if protect_num > 0:
                            protect_num -= 1
                            money += protect_price
                    # 增加总人数
                    elif tolnum_add_rect.collidepoint(event.pos):
                        if tolnum < 1000:
                            tolnum += 100
                    # 减少总人数
                    elif tolnum_dec_rect.collidepoint(event.pos):
                        if tolnum > 0:
                            tolnum -= 100
    
            if not (delay % speed) and move < time and active and not waited:  # 每5次移动一下
                screen.blit(mycity, (500, 0))  # 载入城市图片
                screen.blit(hospital_image, (100, 200))  # 载入医院图片
                move += 1
                for gm in goodmans:  # 显示健康人
                    gm.move(mlen)
                    screen.blit(gm.image, gm.rect)
                for fm in infectmans:  # 显示感染人
                    fm.move(mlen)
                    screen.blit(fm.image, fm.rect)
                    # 是否感染健康人
                    isinfect = pygame.sprite.spritecollide(fm, goodmans, False, pygame.sprite.collide_mask)
                    if isinfect and not protect_status:  # and randint(0, goodtofm[1]) < goodtofm[0]:  # 感染且没保护
                        for each in isinfect:
                            goodmans.remove(each)
                            each.image = infect_man_image
                            infectmans.add(each)
                            screen.blit(each.image, each.rect)
                    # 是否重症
                    if randint(0, fmtoill[1]) < fmtoill[0]:
                        infectmans.remove(fm)
                        fm.image = ill_man_image
                        illmans.add(fm)
                        screen.blit(fm.image, fm.rect)
                    # 是否进医院,每个医护可医治4个患者
                    if randint(0, fmtohos[1]) < fmtohos[0] and (len(hos_infectmans) + len(hos_illmans) < doc_num * doc_cure):
                        infectmans.remove(fm)
                        AddtoHospital(hos_infectmans, infect_man_image)
    
                for im in illmans:  # 显示重症人
                    im.move(mlen)
                    screen.blit(im.image, im.rect)
                    # 是否感染健康人
                    isinfect = pygame.sprite.spritecollide(im, goodmans, False, pygame.sprite.collide_mask)
                    if isinfect and not protect_status:  # and randint(0, goodtoill[1]) < goodtoill[0]:  # 感染且没保护
                        for each in isinfect:
                            goodmans.remove(each)
                            each.image = infect_man_image
                            infectmans.add(each)
                            screen.blit(each.image, each.rect)
                    # 是否住院,每个医护医治4个患者
                    if randint(0, illtohos[1]) < illtohos[0] and (len(hos_infectmans) + len(hos_illmans) < doc_num * doc_cure):
                        illmans.remove(im)
                        AddtoHospital(hos_illmans, ill_man_image)
                        continue
                    # 是否死亡
                    rate = randint(0, illtodead[1])
                    if rate < illtodead[0]:
                        # print(rate, illtodead[0])
                        illmans.remove(im)
                        AddtoDead(deadmans, 1)
    
                for hfm in hos_infectmans:  # 医院轻症患者
                    screen.blit(hfm.image, hfm.rect)
                    # 是否治愈
                    if randint(0, fmtocure[1]) < fmtocure[0]:
                        hos_infectmans.remove(hfm)
                        AddtoCure(curemans, 1)
                        money += 100  # 治愈一人赚100元
                        continue
                    # 是否转重症
                    if randint(0, fmtoill[1]) < fmtoill[0]:
                        hos_infectmans.remove(hfm)
                        hfm.image = ill_man_image
                        hos_illmans.add(hfm)
                        screen.blit(hfm.image, hfm.rect)
    
                for him in hos_illmans:  # 医院重症患者
                    screen.blit(him.image, him.rect)
                    # 是否转轻症
                    if randint(0, illtofm[1]) < illtofm[0]:
                        hos_illmans.remove(him)
                        him.image = infect_man_image
                        hos_infectmans.add(him)
                        screen.blit(him.image, him.rect)
                        continue
                    # 是否死亡
                    rate = randint(0, illtodead[1])
                    if rate < illtodead[0]:
                        # print(rate)
                        hos_illmans.remove(him)
                        AddtoDead(deadmans, 1)
    
                for cm in curemans:  # 治愈患者
                    screen.blit(cm.image, cm.rect)
    
                for dm in deadmans:  # 死亡患者
                    screen.blit(dm.image, dm.rect)
    
            elif move == time:
                success_sound.play()
                move = 0  # 重新计数
                day += 1  # 增加一天
                waited = True
                # 未入院人员每人每天赚5元
                money += (len(goodmans) + len(infectmans) + len(illmans)) * getmoney
                if protect_num > 0:
                    protect_num -= 1
                    protect_status = True
                else:
                    protect_status = False
                if (infectnum + illnum) == 0 and goodnum > 0:
                    win_sound.play()
                    active = False
                    mained = True
                    winflag = True
                elif (infectnum + illnum) == 0 and goodnum == 0:
                    lostflag = True
    
            # 显示得分情况
            # screen.blit(massage_image, (0, 0))  # 载入信息图片
            ShowBack()  # 显示背景
            goodnum = len(goodmans)  # 健康人数
            infectnum = len(infectmans) + len(hos_infectmans)  # 轻症患者
            illnum = len(illmans) + len(hos_illmans)  # 重症患者
            curenum = len(curemans)  # 治愈人数
            deadnum = len(deadmans)  # 死亡人数
            day_text = myfont_big.render(f"{str(day)}", True, RED)
            screen.blit(day_text, (75, 10))
            tolnum_text = myfont.render(f"{str(tolnum)}", True, BLACK)
            screen.blit(tolnum_text, (65, 60))
            goodnum_text = myfont.render(f"{str(goodnum)}", True, BLACK)
            screen.blit(goodnum_text, (75, 83))
            infectnum_text = myfont.render(f"{str(infectnum)}", True, BLACK)
            screen.blit(infectnum_text, (75, 106))
            illnum_text = myfont.render(f"{str(illnum)}", True, BLACK)
            screen.blit(illnum_text, (75, 129))
            curenum_text = myfont.render(f"{str(curenum)}", True, BLACK)
            screen.blit(curenum_text, (75, 152))
            deadnum_text = myfont.render(f"{str(deadnum)}", True, BLACK)
            screen.blit(deadnum_text, (75, 175))
            money_text = myfont.render(f"{str(money)}", True, RED)
            screen.blit(money_text, (210, 18))
            screen.blit(protect_start_image, protect_start_rect)  # 开始按钮
            # 显示道具价格
            doc_price_text = myfont.render(f"{str(doc_price)}", True, ORANGE)
            screen.blit(doc_price_text, (320, 3))
            pill_price_text = myfont.render(f"{str(pill_price)}", True, ORANGE)
            screen.blit(pill_price_text, (420, 3))
            limit_price_text = myfont.render(f"{str(limit_price)}", True, ORANGE)
            screen.blit(limit_price_text, (320, 103))
            protect_price_text = myfont.render(f"{str(protect_price)}", True, ORANGE)
            screen.blit(protect_price_text, (420, 103))
            # 显示购买
            screen.blit(doc_buy_image, doc_buy_rect)
            screen.blit(pill_buy_image, pill_buy_rect)
            screen.blit(limit_buy_image, limit_buy_rect)
            screen.blit(protect_buy_image, protect_buy_rect)
            # 显示道具数量
            doc_num_text = myfont.render(f"{str(doc_num)}", True, RED)
            screen.blit(doc_num_text, (5, 205))
            pill_level_text = myfont.render(f"{str(pill_level)}", True, RED)
            screen.blit(pill_level_text, (5, 330))
            limit_level_text = myfont.render(f"{str(limit_level)}", True, RED)
            screen.blit(limit_level_text, (5, 455))
            protect_num_text = myfont.render(f"{str(protect_num)}", True, RED)
            screen.blit(protect_num_text, (5, 580))
            screen.blit(doc_dec_image, doc_dec_rect)
            screen.blit(limit_dec_image, limit_dec_rect)
            screen.blit(protect_dec_image, protect_dec_rect)
            if waited:
                wait_text = myfont.render("请部署您的防护!", True, RED)
                screen.blit(wait_text, (140, 85))
    
            # 暂停/播放
            # screen.blit(paused_show_image, paused_rect)  # 暂停图片
            # 主页
            screen.blit(main_image, main_rect)  # 主页图片
    
            if not active:  # 刚启动时
                # 主页
                pygame.draw.rect(screen, GRAY, (400, 100, 400, 500), 0)  # 画矩形,位置400,100,长400,高500
                # 显示最快纪录和当前纪录
                tolnum_record_text = myfont.render(f"您的城市人口为:{tolnum} 人", True, RED)
                day_record_text = myfont.render(f"您已守护:{day} 天", True, RED)
                goodnum_record_text = myfont.render(f"健康人数为:{goodnum} 人", True, RED)
                infectnum_record_text = myfont.render(f"轻症患者有:{infectnum} 人", True, RED)
                illnum_record_text = myfont.render(f"重症患者有:{illnum} 人", True, RED)
                curenum_record_text = myfont.render(f"治愈人数有:{curenum} 人", True, RED)
                deadnum_record_text = myfont.render(f"病亡人数有:{deadnum} 人", True, RED)
                record_text = myfont.render("", True, RED)
                if not recorded and not mained:  # 没有记录,初始进入
                    goon = False
                    wel_text = myfont_big.render("欢迎进入保卫城市游戏!", True, RED)
                    screen.blit(wel_text, (410, 200))
                    screen.blit(tolnum_record_text, (480, 300))
                    # 增加和减少
                    screen.blit(tolnum_add_image, tolnum_add_rect)
                    screen.blit(tolnum_dec_image, tolnum_dec_rect)
                    # 开始游戏
                    screen.blit(start_image, start_rect)
                elif recorded and not mained:  # 读取记录
                    goon = True
                    record_text = myfont.render("您上次的游戏进度为:", True, RED)
                    screen.blit(record_text, (480, 140))
                    screen.blit(tolnum_record_text, (480, 170))
                    screen.blit(day_record_text, (480, 200))
                    screen.blit(goodnum_record_text, (480, 230))
                    screen.blit(infectnum_record_text, (480, 260))
                    screen.blit(illnum_record_text, (480, 290))
                    screen.blit(curenum_record_text, (480, 320))
                    screen.blit(deadnum_record_text, (480, 350))
                    # 继续游戏
                    screen.blit(goon_image, goon_rect)
                    # 重新开始
                    screen.blit(restart_image, restart_rect)
                elif mained:
                    if not winflag and not lostflag:  # 点击主页
                        record_text = myfont.render("您当前的游戏进度为:", True, RED)
                        # 继续游戏
                        screen.blit(goon_image, goon_rect)
                    elif winflag:  # 胜利
                        record_text = myfont.render("恭喜你!消灭所有病毒!!", True, RED)
                    elif lostflag:  # 失败
                        record_text = myfont.render("很遗憾!未能消灭病毒!!", True, RED)
                    goon = True
                    screen.blit(record_text, (480, 140))
                    screen.blit(tolnum_record_text, (480, 170))
                    screen.blit(day_record_text, (480, 200))
                    screen.blit(goodnum_record_text, (480, 230))
                    screen.blit(infectnum_record_text, (480, 260))
                    screen.blit(illnum_record_text, (480, 290))
                    screen.blit(curenum_record_text, (480, 320))
                    screen.blit(deadnum_record_text, (480, 350))
                    # 重新开始
                    screen.blit(restart_image, restart_rect)
    
                # 结束游戏
                screen.blit(gameover_image, gameover_rect)
    
            # 时间间隔
            delay -= 1
            if not delay:
                delay = 50
            pygame.display.flip()  # 页面刷新
    
            clock.tick(60)
    
    
    if __name__ == "__main__":
        try:
            main()
        except SystemExit:
            pass
        except:
            traceback.print_exc()
            pygame.quit()
            input()
  • 您还可以看一下 程序员学院老师的Python专项训练 巩固语法+数据分析+商城开发课程中的 Pygame实战项目总结小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    问题回答:

    由于pygame键盘事件监听只能监听ASCII码值在32~126之间的按键事件,而字母和一些特殊符号对应的ASCII码值不在此范围内,因此无法被pygame监听到。

    解决方案:

    1. 使用pygame.key.get_pressed()函数获取当前所有键位的状态,再通过对应的键位映射表判断对应的按键是否被按下。
    import pygame
    
    pygame.init()
    
    # 键位映射表
    keys_map = {
        pygame.K_UP: "Up",
        pygame.K_DOWN: "Down",
        pygame.K_LEFT: "Left",
        pygame.K_RIGHT: "Right",
        pygame.K_a: "a",
        pygame.K_b: "b",
        pygame.K_c: "c",
        # ...
    }
    
    # 循环监听键盘事件
    while True:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                # 判断对应按键是否被按下
                if event.key in keys_map:
                    print(keys_map[event.key])
        pygame.display.update()
    
    1. 使用pygame.key.set_allowed()函数设置可以被监听的键位事件范围。例如,设置可以监听所有的键位事件。
    import pygame
    
    pygame.init()
    
    # 设置可以被监听的键位事件范围
    pygame.key.set_allowed(None)
    
    # 循环监听键盘事件
    while True:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                print(pygame.key.name(event.key))
        pygame.display.update()
    
    1. 使用第三方库pynput监听键盘事件,该库支持监听所有键位事件。
    from pynput.keyboard import Key, Listener
    
    # 监听键盘事件
    def on_press(key):
        print(key)
    
    with Listener(on_press=on_press) as listener:
        listener.join()
    

    注意:在使用第三方库pynput时,需要使用pip安装该库。