You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pygame中实现输入字母后在转子列表间反向绘制对应连线?

实现字母输入与从右到左的转子连线功能

我来帮你搞定这个需求!咱们直接修改代码,实现字母输入+从右向左的连线逻辑,同时修复原代码里的一些小问题:

修改后的完整代码

import pygame as pg
import sys

pg.init()
screen = pg.display.set_mode((800, 600))
clock = pg.time.Clock()
screenGray = pg.Color('gray80')
RotorFont = pg.font.SysFont("malgun gothic", 17)
textColour = pg.Color('navy')
black = pg.Color('black')  # 新增:定义连线颜色
background = pg.Surface(screen.get_size())
background.fill(screenGray)
current_letter = None  # 存储当前输入的字母

# 转子列表
rotorAA = ['G','N','Z','M','V','B','F','L','Q','R','Y','P','I','C','E','A','D','K','J','W','X','S','H','U','O','T']#2
rotorAB = ['L','Q','R','Y','D','K','J','W','X','S','H','U','O','P','I','C','F','A','G','N','Z','M','V','B','E','T']#3
rotorBA = ['Q','W','E','R','T','Y','U','I','O','P','A','S','D','F','G','H','J','K','L','Z','X','C','V','B','N','M']#4
rotorBB = ['Y','H','Q','V','L','T','C','W','K','P','S','N','X','E','O','M','B','U','G','F','A','J','D','R','Z','I']#5
rotorCA = ['D','F','P','A','N','E','Y','C','S','G','K','J','M','X','O','V','L','W','Q','H','T','U','B','R','Z','I']#6
rotorCB = ['Z','I','A','C','T','F','U','Q','N','V','P','B','D','O','L','R','S','X','M','G','H','J','W','E','K','Y']#7
rotorList = [rotorAA, rotorAB, rotorBA, rotorBB, rotorCA, rotorCB]

# 预绘制所有转子到背景(避免重复绘制)
def draw_all_rotors():
    count = 0
    k = 0
    background.fill(screenGray)
    for i in range(len(rotorList)):
        if count % 2 == 0 and count != 0:
            k += 25
        for j in range(26):
            text_surf = RotorFont.render(rotorList[i][j], 1, textColour)
            background.blit(text_surf, (25 + (i * 25) + k, 90 + (j * 16)))
        count += 1

# 初始化绘制转子
draw_all_rotors()

while True:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            pg.quit()
            sys.exit()
        # 新增:处理字母输入事件
        if event.type == pg.KEYDOWN:
            # 只接受A-Z的按键,转成大写
            if event.unicode.isalpha():
                current_letter = event.unicode.upper()
                draw_all_rotors()  # 重置背景并重新绘制转子
                if current_letter in rotorList[-1]:
                    current_idx = rotorList[-1].index(current_letter)
                    # 从最右侧转子开始,向左遍历每一对转子
                    for i in range(len(rotorList)-1, 0, -1):
                        # 只处理成对的转子(AB→AA,BB→BA,CB→CA)
                        if i % 2 == 1:
                            paired_rotor = rotorList[i-1]
                            # 获取当前字母在配对转子中的对应字符
                            paired_char = paired_rotor[current_idx]
                            paired_idx = paired_rotor.index(paired_char)
                            # 计算两个字符的坐标
                            x_right = 25 + (i * 25) + ((i//2)*25)
                            y_right = 90 + (current_idx * 16)
                            x_left = 25 + ((i-1)*25) + (((i-1)//2)*25)
                            y_left = 90 + (paired_idx * 16)
                            # 绘制连线
                            pg.draw.line(background, black, (x_right, y_right), (x_left, y_left))
                            # 更新索引,继续向左处理
                            current_idx = paired_idx

    screen.blit(background, (0,0))
    pg.display.flip()
    clock.tick(60)

关键改动说明

  • 字母输入处理:监听KEYDOWN事件,只接收A-Z字母按键,转成大写后触发连线逻辑。每次输入新字母时会重置背景,清除之前的连线避免混乱。
  • 从右向左连线逻辑:从最右侧的转子(rotorList[-1]即rotorCB)开始,向左遍历每一对转子(CB→CA,BB→BA,AB→AA),找到对应字母的位置并绘制连线。
  • 代码优化:把转子绘制逻辑封装成函数,避免重复代码;调整了转子的排版计算,让成对转子的间距更合理。
  • 修复原代码问题:补充了缺失的black颜色定义,解决了原代码中变量未初始化的问题。

现在运行代码后,按下任意A-Z字母键,就能看到从最右侧转子开始向左依次连线的效果啦!

内容的提问来源于stack exchange,提问作者Badger8808

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:05:01