Игра на угадывание языка ассемблера. Мой код продолжал цикл, хотя предположение должно быть правильным? - PullRequest
0 голосов
/ 29 января 2020

Я действительно новичок в этом, так что даже не уверен, что я даже код это правильно. Мой первый раз на самом деле. Итак, я думаю, что сделал все правильно? Я не уверен, почему он не выйдет из l oop, поскольку beq $t1, $t0, winExit должен заставить его выйти из моего l oop. Та же проблема и с LExExit. Может быть, это все неправильно ... если это плохо>.>

# The program will ask the player to try to guess the secret number 
# and receive a numerical input from the players.

    .data

# constant strings

prompt1:    .asciiz "Please guess the secret number (up to 10 tries): "
tooHigh:    .asciiz "Incorrect: Number is too high\n"
tooLow:     .asciiz "Incorrect: Number is too low\n"
userWin:    .asciiz "Congratulation! You guessed the secret number! :D"
userLose:   .asciiz "Sorry, You lose :/"

    .text

main:
#start of the loop
loop:
#Set secret number
    li $t0,4            #$t0 hold the secret number: 4
    li $t1,9            #$t1 hold the maximum number of tries: 10
    li $t2,0            #$t2 hold the number of tries. (counter)

#Prompt user for a number
    li $v0,4            #code for print_string
    la $a0,prompt1      #point to $a0 to prompt strings
    syscall             #print prompt

#Get integer from user
    li $v0,5            #code for read_int
    syscall             #get integer from user --> returned in $v0
    move    $s0,$v0     #move the resulting int to $s0

#$s0 hold the guess number

#check if it is equal, if it is then exit loop
    beq $t1, $t0, winExit       #Brand if Equal. User guess the correct number.

    addi $t2,$t2,1              # +1 to counter
    beq  $t2,$t1, loseExit      #check if counter reach the maximum number

    blt $s0,$t0, lessThan       #Branch on Lower Than. check if guess number is less than secret number
    bgt $s0,$t0, greaterThan    #Branch on Greater Than. check if guess number is higher than secret number
    j loop                      #goes back to loop

#prompt guess number is too high then loop
greaterThan:    
    li  $v0,4           #code for print_string
    la  $a0, tooHigh    #point $a0 to tooLow string
    syscall             #print prompt
    j loop      
    #go back to loop

#prompt guess number is too low then loop
lessThan:               
    li  $v0,4           #code for print_string
    la  $a0, tooLow     #point $a0 to tooLow string
    syscall             #print prompt
    j loop      #go back to loop

#print userWin to congratulate user
winExit:
    li  $v0,4           #code for print_string
    la  $a0, userWin    #point $a0 to userWin string
    syscall             #print prompt
    j exitProgram

#print userLose to user
loseExit:

    li  $v0,4           #code for print_string
    la  $a0, userLose   #point $a0 to userLose string
    syscall             #print prompt
    j exitProgram

#Exit program
exitProgram:
    li $v0,10           #code for exit
    syscall             #exit program

1 Ответ

1 голос
/ 29 января 2020
#$s0 hold the guess number

#check if it is equal, if it is then exit loop
    beq $t1, $t0, winExit       #Brand if Equal. User guess the correct number.

Проверьте, что равно? Не $s0, поэтому не угаданное число, может быть, количество попыток равно секретному числу? За исключением того, что эти переменные находятся в t (временных) регистрах, поэтому системный вызов, возможно, не сохранил их или может иметь, это зависит, но просто следуйте соглашению о вызовах.

loop:
#Set secret number
    li $t0,4            #$t0 hold the secret number: 4
    li $t1,9            #$t1 hold the maximum number of tries: 10
    li $t2,0            #$t2 hold the number of tries. (counter)

Если другая проблема исправлено, это все равно даст игроку бесконечные повторы, потому что количество попыток сбрасывается на ноль на каждой итерации.

...