2

我有一个有趣的问题!

我在 MIPS 中实现了一个记忆游戏,游戏首先在屏幕上随机打印一个 10-99 之间的数字,然后要求用户输入确切的数字。如果用户输入正确的数字,游戏会继续显示第一个数字和第二个随机生成的 10-99 之间的数字。并且这两个数字必须一个接一个地显示,它们之间有 3 秒的延迟。然后要求用户按照屏幕上出现的正确顺序输入数字。如果用户正确输入了两个数字,则游戏将继续输入三个数字,然后是四个数字,依此类推。

这是游戏的快速总结,但事情就是这样。

我想添加一个助手选项,如果用户输入字母 'H' ,程序会给他一个提示。

我用它来从接受数字的用户那里获取输入

李 $v0,5

系统调用

这个“读取一个整数”但是一旦用户输入一个“H”它就会给出一个运行时错误,

我虽然'H'的值是:ASCII中的72,我把它作为用户用作提示的数字,但不幸的是,程序可能会生成一个随机数'72'并且当用户输入它时,它给了他一个提示,而他不想要这个提示,他只是想继续游戏

问题:

我正在寻找的是一种用高级语言进行这种铸造的方法或任何技巧。到目前为止,我找不到任何解决此问题的方法。

并且有什么方法可以清除 MIPS 中的屏幕或控制台?因为显然它是记忆游戏!所以数字应该消失!

任何关于此的建议或问题,完全欢迎!

4

2 回答 2

3

当从键盘输入到内存时,所有字符都可以表示为 ascii,但read_int系统调用将尝试从该 ascii 中解析一个整数,并且对于非数字字符它将失败。

唯一的选择是使用字符串。创建缓冲区

buf: .byte 0,0,0      #10-99, last byte is for null

用于用户输入。读取字符串后,检查缓冲区中的第一个字符是否为“H”。

la $t1, buf
lb $t2, 0($t1)
li $t3, 72
beq $t2, $t3, help

如果没有“H”,则继续从字符串中解析一个整数。

i = buf.length-2;
j = 1;
k = 0;
while(i >= 0) {    //go in reverse
    if(buf[i] != NULL) {
        k += (buf[i] - 48) * j
        j *= 10;
    }
    i--;
}
if(k == target)print("success");

每次提示时不要忘记清除缓冲区。

于 2012-04-22T07:34:10.740 回答
0

也许您可以使用读取字符(代码 12)而不是读取整数(代码 5)

如果您确实读取字符,则需要将 ascii 转换为整数。所以这意味着需要一些操作。但它可以比我认为的其他方式更容易完成。


blackcompe 对读取字符提出了一个很好的观点。

我猜你必须读取字符串(代码 8),然后通过循环和检查 ascii 中的数字或 H 来验证用户输入。如果输入无效,则返回错误消息或其他内容。


这里还有一些从 ascii 字符串转换为数字的伪代码。这假定一个有效的数字字符串。假设您只有两位数字,所以这可能是不必要的,但应该可以。

number = 0
for(i = 0; i < str.length; i++)
    number = 10 * number + ascii(str[i]) - ascii('0');

我同意 blackcompe 的答案要好得多。但我只是想证明转换循环确实有效。我想迭代一下,这只是将一个 ascii 数字字符串转换为一个数字。它不检查 H 并假定该数字可以是任意长度。此外,您仍然需要对其在 MIPS 中的工作进行调整。

这是一个示例,表明我的转换循环确实有效。这是用python重写的示例,因此可以进行测试。当然,在 python 中做这件事毫无意义。

def pointlesslyConvertStringToNumber(str):
    number = 0
    for c in str:
        //Note: ord is a function to convert a character to ascii
        number = 10 * number + ord(c) - ord('0')
    print number 

让我们使用数字 543:

pointlesslyConvertStringToNumber("543")

以下是循环的分步说明:

  1. 10 * 0 + 53 - 48 = 数字 = 5
  2. 10 * 5 + 52 - 48 = 数字 = 54
  3. 10 * 54 + 51 - 48 = 数字 = 543

这是基于上述内容的 MIPS 子程序。我知道这行得通,但我是 MIPS 初学者,所以请原谅任何愚蠢的错误。这再次假设一个有效的数字字符串。换句话说,另一个子程序将首先验证输入。

$a0 是以 null 结尾的字符串缓冲区的地址。旁边的注释是一个稍微修改的python函数,以更好地适应MIPS代码。但这并不完全是一对一的。

getNumber:                                  # def getNumber(input):
    addi  $sp, $sp, -8                      #
    sw    $ra, 4($sp)                       #
    sw    $a0, 0($sp)                       #
    add   $t0, $a0, $zero                   #
    add   $t1, $zero, $zero                 # i = 0
    addi  $t4, $zero, 10                    #
gnLoop:                                     # while(input[i] != None):
    lb    $t2, 0($t0)                       #
    beq   $t2, $zero, gnEnd                 # 
    mult  $t1, $t4                          # number = 10 * number
    mflo  $t1                               # 
    addi  $t3, $t2, -48                     # 
    add   $t1, $t1, $t3                     # number += ord(input[i]) - ord('0')
    addi  $t0, $t0, 1                       # i +=1
    j     gnLoop                            #
gnEnd:                                      # 
    lw    $a0, 0($sp)                       #
    lw    $ra, 4($sp)                       #
    addi  $sp, $sp, 8                       # 
    add   $v0, $zero, $t1                   # return number  
    jr    $ra                               #
于 2012-04-22T06:49:52.230 回答