Irvine32汇编打字游戏错误字符显示异常问题求助
下落式打字游戏错误字符显示问题修复
问题根源
- 错误字符被循环清除:
continueLoop段中会用黑底黑字重绘整个单词,导致错误分支中刚打印的红色字符被立即覆盖消失。 - 错误输入错误推进索引:输入错误时
Index被递增,导致后续正确输入的位置偏移,且错误缓冲区的内容无法被正确覆盖。 - 错误缓冲区残留数据:输入正确字符时,错误缓冲区对应位置的旧数据未被清空,导致错误字符持续显示。
修复步骤
- 移除错误分支中对
Index的递增操作,错误输入不推进当前字符位置,用户需重新输入正确字符才能继续。 - 在错误分支添加延迟后,清空错误缓冲区的当前位置,避免残留错误字符。
- 调整绘制逻辑:先清除旧内容,再依次绘制原单词、正确字符、错误字符,确保层级正确。
- 正确输入时,同步清空错误缓冲区对应位置的内容,消除残留。
修改后的完整代码
include Irvine32.inc BUFMAX EQU 128 .data Words BYTE "house", 0 BYTE "water", 0 BYTE "foods", 0 BYTE "apple", 0 BYTE "cloud", 0 ; List of words to be typed msElapsed BYTE 0 positionX BYTE 0 positionY BYTE 1 nextWord DWORD 0 score DWORD 0 scoreMsg BYTE "Game Over", 0 char BYTE ? ; Character input by user correctBuffer BYTE BUFMAX DUP (0) ; Buffer to store correctly typed characters incorrectBuffer BYTE BUFMAX DUP (0) Index DWORD 0 .code main PROC call TypingGame invoke ExitProcess, 0 main ENDP TypingGame PROC gameLoop: ; 先清除当前位置的旧内容 mov dl, positionX mov dh, positionY call Gotoxy mov eax, black + (black * 16) call SetTextColor mov edx, OFFSET Words add edx, [nextWord] call WriteString ; 打印原单词(白色) mov dl, positionX mov dh, positionY call Gotoxy mov eax, white + (black * 16) call SetTextColor mov edx, OFFSET Words add edx, [nextWord] call WriteString ; 打印正确输入的字符(绿色) mov dl, positionX mov dh, positionY call Gotoxy mov eax, green + (black * 16) call SetTextColor mov edx, OFFSET correctBuffer call WriteString ; 打印错误输入的字符(红色) mov dl, positionX movzx eax, Index add dl, al mov dh, positionY call Gotoxy mov eax, red + (black * 16) call SetTextColor mov edx, OFFSET incorrectBuffer call WriteChar ; 延迟与输入处理 mov eax, 50 add [msElapsed], 1 call Delay call ReadKey jz continueLoop mov char, al mov esi, OFFSET Words add esi, [nextWord] add esi, [Index] movzx ebx, char cmp [esi], bl jne incorrect correct: ; 清空当前位置的错误缓冲区 mov esi, OFFSET incorrectBuffer add esi, [Index] mov BYTE PTR [esi], 0 ; 保存正确字符到缓冲区 mov esi, OFFSET correctBuffer add esi, [Index] mov [esi], bl inc esi mov BYTE PTR [esi], 0 inc [Index] ; 检查是否完成当前单词 mov esi, OFFSET Words add esi, [nextWord] add esi, [Index] cmp BYTE PTR [esi], 0 jne continueLoop ; 完成单词后重置状态 mov [Index], 0 ; 计算下一个单词的偏移(跳过当前单词的长度+1) mov esi, OFFSET Words add esi, [nextWord] findNextWord: inc esi cmp BYTE PTR [esi], 0 jne findNextWord inc esi mov eax, esi sub eax, OFFSET Words mov [nextWord], eax mov [positionX], 0 mov [positionY], 1 jmp gameLoop incorrect: ; 保存错误字符到缓冲区 mov esi, OFFSET incorrectBuffer add esi, [Index] mov [esi], bl inc esi mov BYTE PTR [esi], 0 ; 显示错误字符并延迟 mov dl, positionX movzx eax, Index add dl, al mov dh, positionY call Gotoxy mov eax, red + (black * 16) call SetTextColor mov al, char call WriteChar ; 延迟让用户看到错误字符 mov eax, 500 call Delay ; 清空错误缓冲区当前位置 mov esi, OFFSET incorrectBuffer add esi, [Index] mov BYTE PTR [esi], 0 jmp continueLoop continueLoop: ; 处理单词下落逻辑 cmp [msElapsed], 20 jl skipIncrement add [positionY], 1 mov [msElapsed], 0 skipIncrement: cmp [positionY], 24 jl gameLoop jmp endGame endGame: call Clrscr mov edx, OFFSET scoreMsg call WriteString ret TypingGame ENDP END main
关键修改说明
- 调整绘制顺序:先清除旧内容,再绘制原单词、正确字符、错误字符,避免覆盖问题。
- 错误输入不递增索引:输入错误时不再增加
Index,用户需要重新输入当前位置的正确字符。 - 错误字符显示后清空缓冲区:延迟后清空错误缓冲区对应位置,避免残留。
- 正确输入时同步清空错误缓冲区:确保错误字符被立即清除,不干扰后续显示。
- 修复下一个单词的偏移计算:原代码中
add [nextWord], TYPE BYTE只会移动1字节,改为跳过整个当前单词到下一个单词的起始位置。
内容的提问来源于stack exchange,提问作者Keithan
相关产品推荐
相关产品推荐

