如何在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
相关产品推荐
相关产品推荐

