2012-04-22 49 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"); 

不要忘記每次提示時清除緩衝區。