2012-04-22 77 views
2

我有一个有趣的问题!在MIPS中铸造

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

这是一个游戏的快速总结,但这里是事情。

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

我用这个从取号

获取用户输入

李$ v0,5

系统调用

这个“读整”,但一旦用户输入'H'它给出运行时间错误,

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

的问题:

什么正在寻找一种方法或任何把戏高级语言做这样的铸造。 我找不到解决此问题的任何方法。

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

有关这方面的任何建议或问题,完全值得欢迎!

+0

如果你正在解析ascii并将其转化为数字(而且,实际上,我不明白你是怎么做的,否则,除非这是一个巨大的设计错误),那么你需要检查'H '*之前* ascii - >整数转换。更多的代码不会受到伤害。 – tbert 2012-04-22 06:17:40

+0

如果我在读取整数之前检查'H',它会每次都等待输入'H'来继续游戏。 – Husam89 2012-04-22 06:51:45

回答

0

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

如果你读的性格,你需要从ASCII到整数转换。所以这意味着需要一些操作。但它可以做得比我想的其他方式更容易。


blackcompe对阅读字符做了一个好点。

我想你将不得不做读取字符串(代码8),然后通过循环和检查数字或H ascii验证用户输入。然后返回一条错误消息或其他东西,如果输入无效。


此处还有一些伪代码可以将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 = number = 54
  3. 10 * 54 + 51-48 = number = 543

这里是基于上述的MIPS子程序。我知道这是有效的,但我是MIPS初学者,所以请原谅任何愚蠢的错误。这又是一个有效的数字字符串。换句话说,另一个子程序会首先验证输入。

$ a0是空终止的字符串缓冲区的地址。 在侧面的评论是一个稍微修改后的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        # 
+0

用户将无法输入两位数字。 – blackcompe 2012-04-22 06:50:48

+0

好点,我想他可能不得不使用读字符串。然后验证输入。 – Gohn67 2012-04-22 06:52:05

+0

是的,这真的是唯一的方法。 – blackcompe 2012-04-22 06:53:34

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"); 

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