Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .data
- HangmanWordQuery: .asciiz "\nEnter a word: "
- InputCharacterQuery: .asciiz "\nEnter a character: "
- LineBreak: .asciiz "\n"
- HangmanWord: .space 51
- HiddenWord: .space 51
- WellDone: .asciiz "\n\nWell done! You won.\n"
- GameOver: .asciiz "\n\nGame Over! You lost.\n"
- .text
- main:
- li $s0, 15 # Anzahl maximaler Versuche
- jal getHangmanWord # Springe zu Funktion getHangmanWord
- jal clearConsole # Springe zu Funktion clearConsole
- jal getStringLength # Springe zu Funktion getStringLength
- move $s1, $t0 # Speichere String Länge in $s1
- move $a0, $s1 # Länge des Wortes wird als Argument übergeben
- jal getHiddenWord # Springe zu Funktion getHiddenWord
- playGame:
- li $t0, 0 # $t0 = Anzahl der bereits gemachten Versuche, $s0 = Maximale Versuche
- mainGameLoop:
- beq $t0, $s0, GameOverFailure # $t0 wird mit $s0 verglichen, falls gleich hat man verloren
- jal getHangmanCharacter # Ein neuer Character wird eingelesen
- move $a0, $v0 # Ergebniswert getHangmanCharcter = Argument checkForEqualityLoop
- jal checkForEquality # Überprüft, ob Character im Wort vorkommt. Wenn ja: Fügt in zu ausgeblendeter Version hinzu
- la $a0, LineBreak # Lädt Adresse von LineBreak in $a0
- li $v0, 4 # String ausgeben
- syscall
- la $a0, HiddenWord # Lädt Adresse von HiddenWord in $a0
- li $v0, 4 # String ausgeben
- syscall
- jal stringCompare # Überprüft, ob das Hangman Wort schon vollständig aufgedeckt wurde
- addi $t0, $t0, 1 # Erhöht die Anzahl der bereits gemachten Versuche um 1
- j mainGameLoop # Springe zurück zum Anfang des mainGameLoops
- checkForEquality:
- li $t1, 0 # Aktuelle Index Position
- checkForEqualityLoop:
- lb $t2, HangmanWord($t1) # Character an der Stelle $t1 vom Hangman Wort wird in $t2 kopiert
- beq $t2, $a0, characterEqual # Überprüft, ob der Character in $t2 der selbe wie der eingelesene Character in $a0 ist. Wenn ja: Character wird an der selben Stelle im HiddenWord hinzugefügt.
- beq $t1, $s1, exitCheckForEqualityLoop # Exit, nachdem jeder Buchstabe des Wortes überprüft wurde ($s1 = Länge des Wortes)
- addi $t1, $t1, 1 # Erhöhe die aktuelle Index Position um 1
- j checkForEqualityLoop # Springe zurück zum Anfang des checkForEqualityLoops
- characterEqual: # Character sind gleich
- sb $a0, HiddenWord($t1) # _ an der Stelle $t1 im HiddenWord wird mit dem Character ersetzt
- addi $t1, $t1, 1 # Erhöhe die aktuelle Index Position um 1, da vorher nicht erreicht
- j checkForEqualityLoop # Springe zurück zum Anfang des checkForEqualityLoops
- exitCheckForEqualityLoop: # Falls fertig
- jr $ra # Springe zurück in mainGameLoop
- getHangmanWord:
- la $a0, HangmanWordQuery
- li $v0, 4 # String ausgeben
- syscall
- la $a0, HangmanWord # Buffer
- li $a1, 51 # Länge des Strings
- li $v0, 8 # String einlesen
- syscall
- jr $ra
- getHangmanCharacter: # Funktion: Liest einzelne Character ein
- la $a0, InputCharacterQuery # Kopiert Adresse von InputCharacterQuery in $a0, um diesen zu printen
- li $v0, 4 # Print String
- syscall
- li $v0, 12 # Read Character und speichere diesen in $v0
- syscall
- jr $ra
- getStringLength: # Funktion: Bestimme die Länge des Hangman Wortes
- li $t0, 0 # Aktuelle Index Position
- GetStringLengthLoop:
- lb $t1, HangmanWord($t0) # Lade Character an der Stelle $t0 des Hangman Wortes in $t1
- beq $t1, '\n', exitGetStringLength # Exit, falls $t1 == \n (komplettes Wort durchiteriert)
- addi $t0, $t0, 1 # Erhöhe Index um 1
- j GetStringLengthLoop
- exitGetStringLength:
- move $v0, $t0 # Gebe Index als Länge des Wortes zurück
- jr $ra # Springe zurück zu main
- getHiddenWord:
- li $t0, 0 # Aktueller Index
- li $t1, '_' # Character der am Index eingefügt werden soll
- getHiddenWordLoop:
- beq $t0, $a0, exitGetHiddenWord # Exit, falls Index mit Wort Länge übereinstimmt
- sb $t1, HiddenWord($t0) # Speichere Character von $t1 im Index $t0 von HiddenWord
- addi $t0, $t0, 1 # Erhöhe den Index um 1
- j getHiddenWordLoop # Springe zurück zum Anfang des getHiddenWordLoops
- exitGetHiddenWord:
- jr $ra # Springe zurück zur main Methode
- stringCompare:
- li $t1, 0 # Aktueller Index zum durchiterieren der Wörter
- stringCompareLoop:
- beq $t1, $s1, GameOverSuccess # Exit Success, falls durch das komplette Wort iteriert wurde (jeder char auf gleichheit überprüft)
- lb $t2, HangmanWord($t1) # Lade char an der stelle $t1 von HangmanWord in $t2
- lb $t3, HiddenWord($t1) # Lade char an der stelle $t1 von HiddenWord in $t3
- bne $t2, $t3, exitStringCompare # Falls beide character nicht gleich, breche loop ab
- addi $t1, $t1, 1 # Erhöhe Index um 1
- j stringCompareLoop # Springe zurück zum Anfang des stringCompareLoops
- exitStringCompare:
- jr $ra # Srpnge zurück zum mainGameLoop
- GameOverSuccess:
- la $a0, WellDone # Lade Adresse von WellDone in $a0
- li $v0, 4 # String ausgeben
- syscall
- li $v0, 10 # Programm beenden
- syscall
- GameOverFailure:
- la $a0, GameOver # Lade Adresse von GameOver in $a0
- li $v0, 4 # String ausgeben
- syscall
- li $v0, 10 # Programm beenden
- syscall
- clearConsole:
- li $t0, 0 # for loop, $t0 = i = 0
- clearConsoleLoop:
- beq $t0, 10, exitClearConsoleLoop # Exit, falls $t0 = 10
- la $a0, LineBreak # Lade Adresse von LineBreak in $a0
- li $v0, 4 # Print String
- syscall
- addi $t0, $t0, 1 # Erhöhe $t0 um 1
- j clearConsoleLoop # Springe zurück zum Anfang des clearConsoleLoops
- exitClearConsoleLoop:
- jr $ra # Springe zurück zu main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement