2

面白い質問があります!

MIPSで記憶ゲームを実装しました。ゲームは、画面に10〜99の数字をランダムに印刷することから始まり、ユーザーに正確な数字を入力するように求めます。ユーザーが数字を正しく入力すると、ゲームは最初の数字と10〜99の間にランダムに生成された2番目の数字を表示して続行します。そして、2つの数字は、3秒の遅延で次々に表示される必要があります。次に、ユーザーは画面に表示された正しい順序で番号を入力するように求められます。ユーザーが2つの数字を正しく入力すると、ゲームは3つの数字、次に4つの数字で続行されます。

これはゲームにとって簡単な夏ですが、ここにあります。

ユーザーが文字「H」を入力すると、プログラムがヒントを与えるアシスタントオプションを追加したいと思います。

これを使用して、数値を取得するユーザーからの入力を取得しました

li $ v0,5

システムコール

これは「整数を読み取ります」が、ユーザーが「H」を入力すると、実行時エラーが発生します。

'H'の値はASCIIで72であり、ユーザーがヒントとして使用する数値として入力しましたが、残念ながら、プログラムが乱数'72'を生成し、ユーザーがそれを入力すると発生する可能性があります。 、それは彼にヒントを与えますが、彼はヒントを望んでいません、彼はただゲームを続けたいだけです

質問:

探しているのは、高級言語でそのようなキャストを行う方法またはトリックです。私は今までこの問題を解決する方法を見つけることができませんでした。

そして、MIPSで画面またはコンソールをクリアする方法はありますか?明らかにそれは記憶ゲームだからです!数字が消えるはずです!

これに関する提案や質問は大歓迎です!

4

2 に答える 2

3

キーボードからメモリに入力すると、すべての文字がASCIIとして表される場合がありますが、read_intsyscallはその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

読み取り整数 (コード 5) の代わりに読み取り文字 (コード 12) を使用できるかもしれません。

文字を読み取る場合は、ASCII から整数に変換する必要があります。つまり、何らかの操作が必要になります。しかし、それは私が考える逆の方法よりも簡単に行うことができます.


blackcompe は、読み取り文字について良い点を指摘しました。

文字列の読み取り (コード 8) を実行してから、ループして数字または ascii の H をチェックして、ユーザー入力を検証する必要があると思います。入力が無効な場合は、エラー メッセージまたは何かを返します。


また、ASCII文字列から数値に変換する擬似コードもいくつかあります。これは、数字の有効な文字列を前提としています。確かに 2 桁の数字しかないので、これは不要かもしれませんが、機能するはずです。

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 で終了する文字列バッファーのアドレスです。横のコメントは、MIPS コードにより適合するように少し変更された Python 関数です。しかし、厳密には 1 対 1 ではありません。

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 に答える