This is a simple implementation of the classic textual game Hunt The Wumpus.
First publish at rosettacode.org
Walk from one room to other, in a total of 20 rooms, to find the Wumpus Monster and kill it. Each room has three tunnels to link to other rooms. All rooms are vertexes in a dodecahedron.
There are two Giant bats, which always transport you to a random empty room. Also there are two bottomless pits which kill you; Also you have 5 arrows and if miss to kill the Wumpus then it is 75% a chance which he move to adjacent room. If you miss the last shot then you loose.
You can use H to toggle Help on/off. Help display player and wumpus position, the three tunnels and the number of each room for these, and the contents of rooms too. You can delete any information you desire in Sense() subroutine.
First publish at rosettacode.org
Walk from one room to other, in a total of 20 rooms, to find the Wumpus Monster and kill it. Each room has three tunnels to link to other rooms. All rooms are vertexes in a dodecahedron.
There are two Giant bats, which always transport you to a random empty room. Also there are two bottomless pits which kill you; Also you have 5 arrows and if miss to kill the Wumpus then it is 75% a chance which he move to adjacent room. If you miss the last shot then you loose.
You can use H to toggle Help on/off. Help display player and wumpus position, the three tunnels and the number of each room for these, and the contents of rooms too. You can delete any information you desire in Sense() subroutine.
Module
WumpusGame {
Print "Game: Hunt The Wumpus"
Arrows=5
Dim Room(1 to 20)
Room(1)=(2,6,5),(3,8,1),(4,10,2),(5,2,3),(1,14,4)
Room(6)=(15,1,7),(17,6,8),(7,2,9),(18,8,10),(9,3,11)
Room(11)=(19,10,12),(11,4,13),(20,12,14),(5,11,13), (6,16,14)
Room(16)=(20,15,17),(16,7,18),(17,9,19),(18,11,20),(19,13,16)
Enum Things {EmptyRoom, Bat1, Bat2, Pit1, Pit2, Wumpus}
Dim Content(1 to 20)=EmptyRoom
i=each(Things,2) ' from 2 to End
While i {
r=random(1,20)
if Content(r)<>EmptyRoom then restart
Content(r)=Eval(i)
}
WumpusPos=r
PlayerPos=-1
TranspotPlayer()
Done=False
\\ Help is statement but here used as variable
Help=False
While Arrows>0 And Not Done {
Sense()
Print "W- Walk, T - Throw Arrow, G - Give up or H for Help"
a$=Ucase$(Key$)
If a$="W" Then {
Print "Choose Tunnel to Walk: 1, 2 or 3"
r=Val("0"+Key$)-1
if r>=0 and r<=2 then {
PlayerPos=Array(room(PlayerPos), r)
Select Case Content(PlayerPos)
Case Wumpus
Eaten()
Case Pit1, Pit2
{
Arrows=0
Print "You fall to a bottomless pit;"
}
Case Bat1, Bat2
{
Print "A giant bat takes you in another room;"
TranspotPlayer()
}
End Select
}
} Else.if a$="T" Then {
Arrows--
Print "Choose Tunnel to Throw Arrow: 1, 2 or 3"
r=Val("0"+Key$)-1
if r>=0 and r<=2 then {
i=room(PlayerPos)
If Content(Array(i, r))=Wumpus then {
Done=True
} Else.if random(1,4)<4 then WakeWumpus()
}
} Else.if a$="G" Then {
Arrows=0
} Else.if a$="H" Then Help~
}
If Done then Print "You kill the Monster Wumpus; You Win.": Exit
Print "You loose."
Sub TranspotPlayer()
local r=random(1,20)
While Content(r)<>EmptyRoom {r=random(1,20)}
PlayerPos=r
End Sub
Sub WakeWumpus()
local j=array(room(WumpusPos),random(0,2))
If content(j)=EmptyRoom Then {
swap content(j), content(WumpusPos)
WumpusPos=j
If WumpusPos=PlayerPos then Eaten()
}
End Sub
Sub Eaten()
Arrows=0
Print "You eaten by Wumpus;"
End Sub
Sub Sense()
local k=Room(PlayerPos)
local j=each(k), Wumpus_near, bat_near, pit_near
If Help then Print "Player Room:";PlayerPos, "Wumpus Room:";WumpusPos
While j {
If Help Then Print "Tunnel:";j^+1, "Room:";Array(j), "Content:";eval$(content(array(j)))
Select Case content(array(j))
Case Bat1, Bat2
bat_near=True
Case Pit1, Pit2
pit_near=True
Case Wumpus
Wumpus_near=True
End Select
}
If Wumpus_near Then Print "You smell something terrible nearby."
If bat_near Then Print "You hear a rustling."
if pit_near Then Print "You feel a cold wind blowing from a nearby cavern."
End Sub
}
WumpusGame
Print "Game: Hunt The Wumpus"
Arrows=5
Dim Room(1 to 20)
Room(1)=(2,6,5),(3,8,1),(4,10,2),(5,2,3),(1,14,4)
Room(6)=(15,1,7),(17,6,8),(7,2,9),(18,8,10),(9,3,11)
Room(11)=(19,10,12),(11,4,13),(20,12,14),(5,11,13), (6,16,14)
Room(16)=(20,15,17),(16,7,18),(17,9,19),(18,11,20),(19,13,16)
Enum Things {EmptyRoom, Bat1, Bat2, Pit1, Pit2, Wumpus}
Dim Content(1 to 20)=EmptyRoom
i=each(Things,2) ' from 2 to End
While i {
r=random(1,20)
if Content(r)<>EmptyRoom then restart
Content(r)=Eval(i)
}
WumpusPos=r
PlayerPos=-1
TranspotPlayer()
Done=False
\\ Help is statement but here used as variable
Help=False
While Arrows>0 And Not Done {
Sense()
Print "W- Walk, T - Throw Arrow, G - Give up or H for Help"
a$=Ucase$(Key$)
If a$="W" Then {
Print "Choose Tunnel to Walk: 1, 2 or 3"
r=Val("0"+Key$)-1
if r>=0 and r<=2 then {
PlayerPos=Array(room(PlayerPos), r)
Select Case Content(PlayerPos)
Case Wumpus
Eaten()
Case Pit1, Pit2
{
Arrows=0
Print "You fall to a bottomless pit;"
}
Case Bat1, Bat2
{
Print "A giant bat takes you in another room;"
TranspotPlayer()
}
End Select
}
} Else.if a$="T" Then {
Arrows--
Print "Choose Tunnel to Throw Arrow: 1, 2 or 3"
r=Val("0"+Key$)-1
if r>=0 and r<=2 then {
i=room(PlayerPos)
If Content(Array(i, r))=Wumpus then {
Done=True
} Else.if random(1,4)<4 then WakeWumpus()
}
} Else.if a$="G" Then {
Arrows=0
} Else.if a$="H" Then Help~
}
If Done then Print "You kill the Monster Wumpus; You Win.": Exit
Print "You loose."
Sub TranspotPlayer()
local r=random(1,20)
While Content(r)<>EmptyRoom {r=random(1,20)}
PlayerPos=r
End Sub
Sub WakeWumpus()
local j=array(room(WumpusPos),random(0,2))
If content(j)=EmptyRoom Then {
swap content(j), content(WumpusPos)
WumpusPos=j
If WumpusPos=PlayerPos then Eaten()
}
End Sub
Sub Eaten()
Arrows=0
Print "You eaten by Wumpus;"
End Sub
Sub Sense()
local k=Room(PlayerPos)
local j=each(k), Wumpus_near, bat_near, pit_near
If Help then Print "Player Room:";PlayerPos, "Wumpus Room:";WumpusPos
While j {
If Help Then Print "Tunnel:";j^+1, "Room:";Array(j), "Content:";eval$(content(array(j)))
Select Case content(array(j))
Case Bat1, Bat2
bat_near=True
Case Pit1, Pit2
pit_near=True
Case Wumpus
Wumpus_near=True
End Select
}
If Wumpus_near Then Print "You smell something terrible nearby."
If bat_near Then Print "You hear a rustling."
if pit_near Then Print "You feel a cold wind blowing from a nearby cavern."
End Sub
}
WumpusGame
Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου
You can feel free to write any suggestion, or idea on the subject.