// Hangman for vier by Daniel Lorch // // Run with at least 16777216 words of memory and _in the console_: // // ./risc-emu -mem=16777216 hangman.asm // class List { method isEmpty() : Int = true method append(that : List) : List = that method printAsInt() : Int = true method printAsChar() : Int = true method print() : Int = true method println() : Int = printChar(10) method contains(x: Int) : Int = false method printWildcarded(wildcard : Int; other : List) : Int = true method length() : Int = 0 method isSubsetOf(that: List) : Int = true } class Nil extends List {} class Cons extends List { field head : Int = 0 field tail : List = new Nil field separator : Int = 32 // ' ' method isEmpty(): Int = false method printAsInt(): Int = { printInt(this.head); printChar(this.separator) return this.tail.printAsInt() } method printAsChar(): Int = { printChar(this.head); printChar(this.separator) return this.tail.printAsChar() } method printWildcarded(wildcard : Int; other : List) : Int = { if other.contains(this.head) then printChar(this.head) else printChar(wildcard); printChar(this.separator) return this.tail.printWildcarded(wildcard ; other) } method print(): Int = { printChar(this.head) return this.tail.print() } method println(): Int = { this.print() return printChar(10) } method contains(x: Int): Int = if this.head == x then true else this.tail.contains(x) method append(that: List): List = { this.{ tail = this.tail.append(that) } return this } method length(): Int = 1 + this.tail.length() method isSubsetOf(that: List) : Int = if that.contains(this.head) then this.tail.isSubsetOf(that) else false } class Hangman { field guesses : Int = 0 // the current number of turns field letters : List = "" // remember the letters the user entered field misses : Int = 0 // the number of misses field correct : Int = 0 // the number of letters correctly guessed field word : List = null // the word to guess field difficulty : Int = 1 // difficulty level (1: hardest) method playfield(): Int = if this.misses == 0 then { " _______".println(); " |/ |".println(); " |".println(); " |".println(); " |".println(); " |".println(); " |".println(); " ___|___".println() return true } else if this.misses == 1 then { " _______".println(); " |/ |".println(); " | (_)".println(); " |".println(); " |".println(); " |".println(); " |".println(); " ___|___".println() return true } else if this.misses == 2 then { " _______".println(); " |/ |".println(); " | (_)".println(); " | |".println(); " |".println(); " |".println(); " |".println(); " ___|___".println() return true } else if this.misses == 3 then { " _______".println(); " |/ |".println(); " | (_)".println(); " | |".println(); " | |".println(); " |".println(); " |".println(); " ___|___".println() return true } else if this.misses == 4 then { " _______".println(); " |/ |".println(); " | (_)".println(); " | |".println(); " | |".println(); " | /".println(); " |".println(); " ___|___".println() return true } else if this.misses == 5 then { " _______".println(); " |/ |".println(); " | (_)".println(); " | |".println(); " | |".println(); " | / \\".println(); " |".println(); " ___|___".println() return true } else if this.misses == 6 then { " _______".println(); " |/ |".println(); " | (_)".println(); " | \\|".println(); " | |".println(); " | / \\".println(); " |".println(); " ___|___".println() return true } else if this.misses == 7 then { " _______".println(); " |/ |".println(); " | (_)".println(); " | \\|/".println(); " | |".println(); " | / \\".println(); " |".println(); " ___|___".println() return true } else 0 method wordtoguess() : Int = { " ".print(); this.word.printWildcarded(95; this.letters); // '_' "".println() return true } // skip invalid characters (such as newlines, non-printable characters, ..) field key : Int = 0 method readKey() : Int = { this.{ key = readChar } return // '0' to '9' 'A' to 'Z' 'a' to 'z' ' ' if ((this.key > 47) && (this.key < 58)) || ((this.key > 64) && (this.key < 91)) || ((this.key > 96) && (this.key < 123)) || (this.key == 32) then this.key else this.readKey() } method mainloop() : Int = if this.misses == 7 then { this.playfield(); "".println(); "G A M E O V E R after ".print(); printInt(this.guesses); " guesses.".println(); "The correct answer was: ".print(); this.word.println() return true } else if this.word.isSubsetOf(this.letters) then { "Congratulations! You found the word \"".print(); this.word.print(); "\" after ".print(); printInt(this.guesses); " guesses.".println() return true } else { this.playfield(); "".println(); this.wordtoguess(); "".println(); "Enter your guess: ".print(); this.{ letters = this.letters.append(new Cons.{ head = this.readKey() })}; "".println(); if this.word.contains(this.key) then "Good :-)".println() else { "Sorry, but that was wrong :-(".println(); this.{ misses = this.misses + 1 } return true }; "".println(); this.{ guesses = this.guesses + 1 } return this.mainloop() } method play() : Int = { "Welcome to Hangman".println(); "".println(); "Select a number from 1 to 9: ".print(); this.readKey(); this.{ word = if this.key == 49 then "hippopotamus" else if this.key == 50 then "chuck norris" else if this.key == 51 then "spider" else if this.key == 52 then "dolphin" else if this.key == 53 then "octopus" else if this.key == 54 then "zebra" else if this.key == 55 then "count rushmore" else if this.key == 56 then "mouse" else "hamster" }; "".println(); this.mainloop() return true } } new Hangman.play()