summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go72
1 files changed, 72 insertions, 0 deletions
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..d6e70f6
--- /dev/null
+++ b/main.go
@@ -0,0 +1,72 @@
+package main
+
+import (
+ "flag"
+ "fmt"
+ "log"
+ "math/rand"
+ "time"
+)
+
+func main() {
+ numPlayers := flag.Int("n", 2, "Number of players")
+ sides := flag.Int("sides", 6, "How many sides the die should have")
+ flag.Parse()
+
+ if *numPlayers < 2 {
+ log.Fatalf("we need at least 2 players")
+ }
+
+ if *sides < 2 {
+ log.Fatalf("die needs at least two sides")
+ }
+
+ fmt.Println("Welcome to the game")
+ fmt.Printf("There are %d players, each with a %d-sided die\n", *numPlayers, *sides)
+
+ game(*numPlayers, *sides)
+}
+
+type Score struct {
+ id int
+ score int
+}
+
+// The player with the lowest score wins.
+func game(numPlayers, faces int) {
+ // Get the game's winning number by throwing the die once.
+ winningNumber := throwDie(faces)
+
+ // The scores channel communicates the number of turns a
+ // player took to hit the winning number.
+ scores := make(chan Score)
+
+ for i := range numPlayers {
+ id := i + 1
+ fmt.Printf("Player %d start!\n", id)
+
+ // Spawn a player.
+ go func() {
+ var score int
+
+ // Start rolling the dice!
+ for {
+ score++
+ outcome := throwDie(faces)
+ if outcome == winningNumber {
+ scores <- Score{id: id, score: score}
+ }
+
+ time.Sleep(1 * time.Second)
+ }
+ }()
+ }
+
+ for score := range scores {
+ fmt.Printf("%v\n", score)
+ }
+}
+
+func throwDie(faces int) int {
+ return rand.Intn(faces) + 1
+}