Hunt The Wumpus/AutoHotkey

From Rosetta Code
Hunt The Wumpus/AutoHotkey is part of Hunt_The_Wumpus. You may find other members of Hunt_The_Wumpus at Category:Hunt_The_Wumpus.

AutoHotkey[edit]

 
/* _ _ _
/\ /\_ _ _ __ | |_ | |_| |__ ___
/ /_/ / | | | '_ \| __| | __| '_ \ / _ \
/ __ /| |_| | | | | |_ | |_| | | | __/
\/ /_/ \__,_|_| |_|\__| \__|_| |_|\___|
__ __
/ / /\ \ \_ _ _ __ ___ _ __ _ _ ___
Coded by errorseven \ \/ \/ / | | | '_ ` _ \| '_ \| | | / __|
11/5/2017 \ /\ /| |_| | | | | | | |_) | |_| \__ \
\/ \/ \__,_|_| |_| |_| .__/ \__,_|___/
|_|
*/

 
#include <ExTObj> ; https://goo.gl/2CRJo3
 
DllCall("AllocConsole")
 
print("You awaken in darkness. As your eyes adjust, you find yourself in a damp`n"
. "cavern with three corridors. Lying next to you is a bow and five arrows`n"
. "A voice calls out 'Kilth the Wumpus an ye shalt be freed!'`n`n"
. "To move, type the Corridor Number you wish to travel down ie: 19`n"
. "To fire an arrow. Type Shoot followed by the Room Number ie: shoot 12`n`n"
. "Press Enter to start the game...", 1)
 
arrows := 5
 
Sense := {bat: "You hear a rustling.`n"
, pit: "You feel a cold wind blowing from a nearby cavern.`n"
, wumpus: "You smell something terrible nearby.`n"}
 
Loc := {player: 0, wumpus: 0, pit1: 0, pit2: 0, bat1: 0, bat2: 0}
 
Rooms := {0: [4, 7, 1], 1: [0, 9, 2], 2: [1, 11, 3], 3:[4, 13, 2], 4: [0, 5, 3]
, 5: [4, 6, 14], 6: [7, 16, 5], 7: [6, 0, 8], 8:[7, 17, 9], 9: [8, 1, 10]
, 10: [9, 18, 11], 11:[10, 2, 12], 12: [13, 19, 11], 13: [14, 3, 12]
, 14: [5, 15, 13], 15: [14, 16, 19], 16: [6, 17, 15], 17: [16, 8, 18]
, 18: [19, 10, 17], 19: [15, 12, 18]}
 
x := range(0, 19) ; Set locations for Player, Bats, Pits, and the Wumpus
for e, v in Loc {
y:=random(0, 19)
While(!x[y])
y:=random(0, 19)
x.Delete(y)
Loc[(e)] := y
}
 
Loop { ; Game Loop
RunWait %comspec% /c "cls"
text := Format("Room: {:-50} Corridors: {}`r`n"
. "Sense: {:-50}`r`n"
, loc.player
, Rooms[loc.player].print
, senseDanger(Rooms, Loc, Sense))
 
query := print(text, 1)
 
If (Rooms[loc.player].contains(query)) { ; Move to room\
x := ""
for e, v in loc
if (e != "player" && query == v) {
if (e ~= "i)bat") {
x := randomPlayer(Loc, query)
break
}
else if (e ~= "i)pit")
gameOver("pit")
else
gameOver("wumpus")
}
loc.player := (x != "" ? x : query)
}
else if (query ~= "i)shoot") { ; --Arrows, Check Wumpus hit, Move Wumpus if Missed
--arrows
shot := StrSplit(query, " ").2
if (Rooms[loc.player].contains(shot) && loc.wumpus == shot)
gameOver("kill")
else if (arrows == 0)
gameOver("arrows")
else {
x := random(0, 3)
if (x != 0) {
loc.wumpus := Rooms[loc.wumpus][x]
if (loc.wumpus == loc.player)
gameOver("Found")
}
}
}
}
 
gameOver(x) {
RunWait %comspec% /c "cls"
 
if (x == "pit")
print("You enter the room and fall to your death!`n`n"
. "Press Enter to reload the game...", 1)
else if (x == "wumpus")
print("You enter the room with the Wumpus and at once you are devoured!`n`n"
. "Press Enter to reload the game...", 1)
else if (x == "kill")
print("Your arrow strikes true and you listen to the death throes of the Wumpus!`n"
. "You have prevailed against all the trials of the maze, but it is for naught...`n"
. "as you discover there is no escape from the Maze.`nYou wander the rest of your days in darkness "
. "and madness. Starvation drives you throw yourself into a pit...`n`n"
. "Press Enter to reload the game...", 1)
else if (x == "arrows")
print("You missed again and have no arrows remaining. You aimlessly wander the maze, `n"
. "without protection you inevitably become a meal for the dreadful Wumpus...`n`n"
. "Press Enter to reload the game...", 1)
else if (x == "found")
print("You missed, you hear the Wumpus coming, before you can nock another arrow`n"
. "the wumpus is upon you! You start to run, but it follows close on your heels."
. "Exhaustion saps you of your strength, your breath is gone, you tremble as your"
. "body can no longer go on and you feel your legs giving way....`n`n"
. "Press Enter to reload the game...", 1)
 
 
reload
}
 
randomPlayer(Loc, query) {
x := random(0, 19)
while(Loc.contains(x) || x == query)
x := random(0, 19)
 
RunWait %comspec% /c "cls"
print("You enter the room with a Bat and at once you carried to another room!`n"
. "Press Enter to continue...", 1)
return x
}
 
senseDanger(Rooms, Loc, Sense) {
for e, v in Loc
if (e != "player")
if (Rooms[loc.player].contains(loc[e]))
text .= (e ~= "i)bat" ? sense.bat
 : e ~= "i)pit" ? sense.pit : sense[(e)]) " "
return text == "" ? "You feel safe." : text
}
 
print(text,q:=0) {
stdout := FileOpen("*", "w `n")
stdin := FileOpen("*", "r `n")
 
If (Text) {
stdout.Write(text " ")
stdout.Read(0)
}
 
if (q) {
query := RTrim(stdin.ReadLine(), "`n")
return query
}
 
}