Hunt the Wumpus: Difference between revisions
Content added Content deleted
(Added Go) |
|||
Line 41: | Line 41: | ||
=={{header|C#}}== |
=={{header|C#}}== |
||
See [[Hunt_The_Wumpus/CSharp]]. |
See [[Hunt_The_Wumpus/CSharp]]. |
||
=={{header|Go}}== |
|||
I've tried to stick as closely as possible to the task description but, as some points are unclear, I've had to make the following assumptions: |
|||
1. The bats and the pits are in separate rooms but the Wumpus can be in any room whether there's another hazard in it or not. |
|||
2. The game starts with the player in room 1 which initially contains no hazards. |
|||
3. If a bat transports the player to a random empty room, it returns to its original room. |
|||
4. If the Wumpus wakes up and moves to an 'adjacent' room, it means a room adjacent to the Wumpus not necessarily the player. |
|||
<lang go>package main |
|||
import ( |
|||
"bufio" |
|||
"fmt" |
|||
"log" |
|||
"math/rand" |
|||
"os" |
|||
"strconv" |
|||
"strings" |
|||
"time" |
|||
) |
|||
var cave = map[int][3]int{ |
|||
1: {2, 3, 4}, 2: {1, 5, 6}, 3: {1, 7, 8}, 4: {1, 9, 10}, 5: {2, 9, 11}, |
|||
6: {2, 7, 12}, 7: {3, 6, 13}, 8: {3, 10, 14}, 9: {4, 5, 15}, 10: {4, 8, 16}, |
|||
11: {5, 12, 17}, 12: {6, 11, 18}, 13: {7, 14, 18}, 14: {8, 13, 19}, |
|||
15: {9, 16, 17}, 16: {10, 15, 19}, 17: {11, 20, 15}, 18: {12, 13, 20}, |
|||
19: {14, 16, 20}, 20: {17, 18, 19}, |
|||
} |
|||
var player, wumpus, bat1, bat2, pit1, pit2 int |
|||
var arrows = 5 |
|||
func isEmpty(r int) bool { |
|||
if r != player && r != wumpus && r != bat1 && r != bat2 && r != pit1 && r != pit2 { |
|||
return true |
|||
} |
|||
return false |
|||
} |
|||
func sense(adj [3]int) { |
|||
bat := false |
|||
pit := false |
|||
for _, ar := range adj { |
|||
if ar == wumpus { |
|||
fmt.Println("You smell something terrible nearby.") |
|||
} |
|||
switch ar { |
|||
case bat1, bat2: |
|||
if !bat { |
|||
fmt.Println("You hear a rustling.") |
|||
bat = true |
|||
} |
|||
case pit1, pit2: |
|||
if !pit { |
|||
fmt.Println("You feel a cold wind blowing from a nearby cavern.") |
|||
pit = true |
|||
} |
|||
} |
|||
} |
|||
fmt.Println() |
|||
} |
|||
func check(err error) { |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
} |
|||
func plural(n int) string { |
|||
if n != 1 { |
|||
return "s" |
|||
} |
|||
return "" |
|||
} |
|||
func main() { |
|||
rand.Seed(time.Now().UnixNano()) |
|||
player = 1 |
|||
wumpus = rand.Intn(19) + 2 // 2 to 20 |
|||
bat1 = rand.Intn(19) + 2 |
|||
for { |
|||
bat2 = rand.Intn(19) + 2 |
|||
if bat2 != bat1 { |
|||
break |
|||
} |
|||
} |
|||
for { |
|||
pit1 = rand.Intn(19) + 2 |
|||
if pit1 != bat1 && pit1 != bat2 { |
|||
break |
|||
} |
|||
} |
|||
for { |
|||
pit2 = rand.Intn(19) + 2 |
|||
if pit2 != bat1 && pit2 != bat2 && pit2 != pit1 { |
|||
break |
|||
} |
|||
} |
|||
scanner := bufio.NewScanner(os.Stdin) |
|||
for { |
|||
fmt.Printf("\nYou are in room %d with %d arrow%s left\n", player, arrows, plural(arrows)) |
|||
adj := cave[player] |
|||
fmt.Printf("The adjacent rooms are %v\n", adj) |
|||
sense(adj) |
|||
var room int |
|||
for { |
|||
fmt.Print("Choose an adjacent room : ") |
|||
scanner.Scan() |
|||
room, _ = strconv.Atoi(scanner.Text()) |
|||
if room != adj[0] && room != adj[1] && room != adj[2] { |
|||
fmt.Println("Invalid response, try again") |
|||
} else { |
|||
break |
|||
} |
|||
} |
|||
check(scanner.Err()) |
|||
var action byte |
|||
for { |
|||
fmt.Print("Walk or shoot w/s : ") |
|||
scanner.Scan() |
|||
reply := strings.ToLower(scanner.Text()) |
|||
if len(reply) != 1 || (len(reply) == 1 && reply[0] != 'w' && reply[0] != 's') { |
|||
fmt.Println("Invalid response, try again") |
|||
} else { |
|||
action = reply[0] |
|||
break |
|||
} |
|||
} |
|||
check(scanner.Err()) |
|||
if action == 'w' { |
|||
player = room |
|||
switch player { |
|||
case wumpus: |
|||
fmt.Println("You have been eaten by the Wumpus and lost the game!") |
|||
return |
|||
case pit1, pit2: |
|||
fmt.Println("You have fallen down a bottomless pit and lost the game!") |
|||
return |
|||
case bat1, bat2: |
|||
for { |
|||
room = rand.Intn(19) + 2 |
|||
if isEmpty(room) { |
|||
fmt.Println("A bat has transported you to a random empty room") |
|||
player = room |
|||
break |
|||
} |
|||
} |
|||
} |
|||
} else { |
|||
if room == wumpus { |
|||
fmt.Println("You have killed the Wumpus and won the game!!") |
|||
return |
|||
} else { |
|||
chance := rand.Intn(4) // 0 to 3 |
|||
if chance > 0 { // 75% probability |
|||
wumpus = cave[wumpus][rand.Intn(3)] |
|||
if player == wumpus { |
|||
fmt.Println("You have been eaten by the Wumpus and lost the game!") |
|||
return |
|||
} |
|||
} |
|||
} |
|||
arrows-- |
|||
if arrows == 0 { |
|||
fmt.Println("You have run out of arrows and lost the game!") |
|||
return |
|||
} |
|||
} |
|||
} |
|||
}</lang> |
|||
=={{header|IS-BASIC}}== |
=={{header|IS-BASIC}}== |