Advertisement
Guest User

Untitled

a guest
May 3rd, 2018
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MPASM 5.25 KB | None | 0 0
  1.     .data
  2. HangmanWordQuery:   .asciiz     "\nEnter a word: "
  3. InputCharacterQuery:    .asciiz     "\nEnter a character: "
  4. LineBreak:      .asciiz     "\n"
  5. HangmanWord:        .space      51
  6. HiddenWord:         .space      51
  7. WellDone:       .asciiz     "\n\nWell done! You won.\n"
  8. GameOver:       .asciiz     "\n\nGame Over! You lost.\n"
  9.    
  10.     .text
  11. main:
  12. li $s0, 15 # Anzahl maximaler Versuche
  13.  
  14. jal getHangmanWord # Springe zu Funktion getHangmanWord
  15.  
  16. jal clearConsole # Springe zu Funktion clearConsole
  17.  
  18. jal getStringLength # Springe zu Funktion getStringLength
  19. move $s1, $t0 # Speichere String Länge in $s1
  20.  
  21. move $a0, $s1 # Länge des Wortes wird als Argument übergeben
  22. jal getHiddenWord # Springe zu Funktion getHiddenWord
  23.  
  24. playGame:
  25. li $t0, 0 # $t0 = Anzahl der bereits gemachten Versuche, $s0 = Maximale Versuche
  26. mainGameLoop:
  27. beq $t0, $s0, GameOverFailure # $t0 wird mit $s0 verglichen, falls gleich hat man verloren
  28. jal getHangmanCharacter # Ein neuer Character wird eingelesen
  29. move $a0, $v0 # Ergebniswert getHangmanCharcter = Argument checkForEqualityLoop
  30. jal checkForEquality # Überprüft, ob Character im Wort vorkommt. Wenn ja: Fügt in zu ausgeblendeter Version hinzu
  31. la $a0, LineBreak # Lädt Adresse von LineBreak in $a0
  32. li $v0, 4 #  String ausgeben
  33. syscall
  34. la $a0, HiddenWord # Lädt Adresse von HiddenWord in $a0
  35. li $v0, 4 # String ausgeben
  36. syscall
  37. jal stringCompare # Überprüft, ob das Hangman Wort schon vollständig aufgedeckt wurde
  38. addi $t0, $t0, 1  # Erhöht die Anzahl der bereits gemachten Versuche um 1
  39. j mainGameLoop # Springe zurück zum Anfang des mainGameLoops
  40.  
  41. checkForEquality:
  42. li $t1, 0 # Aktuelle Index Position
  43. checkForEqualityLoop:
  44. lb $t2, HangmanWord($t1) # Character an der Stelle $t1 vom Hangman Wort wird in $t2 kopiert
  45. 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.
  46. beq $t1, $s1, exitCheckForEqualityLoop # Exit, nachdem jeder Buchstabe des Wortes überprüft wurde ($s1 = Länge des Wortes)
  47. addi $t1, $t1, 1 # Erhöhe die aktuelle Index Position um 1
  48. j checkForEqualityLoop # Springe zurück zum Anfang des checkForEqualityLoops
  49. characterEqual: # Character sind gleich
  50. sb $a0, HiddenWord($t1) # _ an der Stelle $t1 im HiddenWord wird mit dem Character ersetzt
  51. addi $t1, $t1, 1 # Erhöhe die aktuelle Index Position um 1, da vorher nicht erreicht
  52. j checkForEqualityLoop # Springe zurück zum Anfang des checkForEqualityLoops
  53. exitCheckForEqualityLoop: # Falls fertig
  54. jr $ra # Springe zurück in mainGameLoop
  55.  
  56. getHangmanWord:
  57. la $a0, HangmanWordQuery
  58. li $v0, 4 # String ausgeben
  59. syscall
  60. la $a0, HangmanWord # Buffer
  61. li $a1, 51  # Länge des Strings
  62. li $v0, 8 # String einlesen
  63. syscall
  64. jr $ra
  65.  
  66. getHangmanCharacter: # Funktion: Liest einzelne Character ein
  67. la $a0, InputCharacterQuery # Kopiert Adresse von InputCharacterQuery in $a0, um diesen zu printen
  68. li $v0, 4 # Print String
  69. syscall
  70. li $v0, 12 # Read Character und speichere diesen in $v0
  71. syscall
  72. jr $ra
  73.  
  74. getStringLength: # Funktion: Bestimme die Länge des Hangman Wortes
  75. li $t0, 0 # Aktuelle Index Position
  76. GetStringLengthLoop:
  77. lb $t1, HangmanWord($t0) # Lade Character an der Stelle $t0 des Hangman Wortes in $t1
  78. beq $t1, '\n', exitGetStringLength # Exit, falls $t1 == \n (komplettes Wort durchiteriert)
  79. addi $t0, $t0, 1 # Erhöhe Index um 1
  80. j GetStringLengthLoop
  81. exitGetStringLength:
  82. move $v0, $t0 # Gebe Index als Länge des Wortes zurück
  83. jr $ra # Springe zurück zu main
  84.  
  85. getHiddenWord:
  86. li $t0, 0 # Aktueller Index
  87. li $t1, '_' # Character der am Index eingefügt werden soll
  88. getHiddenWordLoop:
  89. beq $t0, $a0, exitGetHiddenWord # Exit, falls Index mit Wort Länge übereinstimmt
  90. sb $t1, HiddenWord($t0) # Speichere Character von $t1 im Index $t0 von HiddenWord
  91. addi $t0, $t0, 1 # Erhöhe den Index um 1
  92. j getHiddenWordLoop # Springe zurück zum Anfang des getHiddenWordLoops
  93. exitGetHiddenWord:
  94. jr $ra # Springe zurück zur main Methode
  95.  
  96. stringCompare:
  97. li $t1, 0 # Aktueller Index zum durchiterieren der Wörter
  98. stringCompareLoop:
  99. beq $t1, $s1, GameOverSuccess # Exit Success, falls durch das komplette Wort iteriert wurde (jeder char auf gleichheit überprüft)
  100. lb $t2, HangmanWord($t1) # Lade char an der stelle $t1 von HangmanWord in $t2
  101. lb $t3, HiddenWord($t1) # Lade char an der stelle $t1 von HiddenWord in $t3
  102. bne $t2, $t3, exitStringCompare # Falls beide character nicht gleich, breche loop ab
  103. addi $t1, $t1, 1 # Erhöhe Index um 1
  104. j stringCompareLoop # Springe zurück zum Anfang des stringCompareLoops
  105. exitStringCompare:
  106. jr $ra # Srpnge zurück zum mainGameLoop
  107.  
  108. GameOverSuccess:
  109. la $a0, WellDone # Lade Adresse von WellDone in $a0
  110. li $v0, 4 # String ausgeben
  111. syscall
  112. li $v0, 10 # Programm beenden
  113. syscall
  114.  
  115. GameOverFailure:
  116. la $a0, GameOver # Lade Adresse von GameOver in $a0
  117. li $v0, 4 # String ausgeben
  118. syscall
  119. li $v0, 10 # Programm beenden
  120. syscall
  121.  
  122. clearConsole:
  123. li $t0, 0 # for loop, $t0 = i = 0
  124. clearConsoleLoop:
  125. beq $t0, 10, exitClearConsoleLoop # Exit, falls $t0 = 10
  126. la $a0, LineBreak # Lade Adresse von LineBreak in $a0
  127. li $v0, 4 # Print String
  128. syscall
  129. addi $t0, $t0, 1 # Erhöhe $t0 um 1
  130. j clearConsoleLoop # Springe zurück zum Anfang des clearConsoleLoops
  131. exitClearConsoleLoop:
  132. jr $ra # Springe zurück zu main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement