aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fl.fischer@fau.de>2017-01-28 14:38:08 +0100
committerFlorian Fischer <florian.fl.fischer@fau.de>2017-01-28 14:38:08 +0100
commit6d1b37462d20a3248f25918161c320a6113e27de (patch)
tree5a5a2c640a34b1f1cbb8b9e8ac1fbe41762c6d43
parent7a2b66c2b67e662c5cf20aba79fdabab3a4baae9 (diff)
downloadgoffel-6d1b37462d20a3248f25918161c320a6113e27de.tar.gz
goffel-6d1b37462d20a3248f25918161c320a6113e27de.zip
add executable and a simple interactive terminal ui
-rw-r--r--goffel.go35
-rw-r--r--interactive.go201
2 files changed, 236 insertions, 0 deletions
diff --git a/goffel.go b/goffel.go
new file mode 100644
index 0000000..3bc3311
--- /dev/null
+++ b/goffel.go
@@ -0,0 +1,35 @@
+package main
+
+import (
+ "math/rand"
+ "time"
+)
+
+type UI interface {
+ Init() error
+ Round(r int) error
+ BroadcastWinner()
+}
+
+func play(ui UI) {
+ err := ui.Init()
+ if err != nil {
+ panic(err)
+ }
+
+ for round := 1; round <= 13; round++ {
+ err = ui.Round(round)
+ if err != nil {
+ panic(err)
+ }
+ }
+ ui.BroadcastWinner()
+}
+
+func main() {
+ rand.Seed(time.Now().Unix())
+
+ var ui UI
+
+ play(&Interactive{})
+}
diff --git a/interactive.go b/interactive.go
new file mode 100644
index 0000000..bb257d8
--- /dev/null
+++ b/interactive.go
@@ -0,0 +1,201 @@
+package main
+
+import (
+ "fmt"
+ "strconv"
+ "strings"
+
+ . "muhq.space/go/muhq/goffel/logic"
+)
+
+type intPlayer struct {
+ name string
+ score Score
+}
+
+type Interactive struct {
+ players []intPlayer
+}
+
+var dices Dices
+
+func (i *Interactive) Init() error {
+ name := ""
+ count := 0
+ fmt.Println("Please enter your player names. An empty line ends the player registration.")
+ for {
+ fmt.Printf("%d: ", count+1)
+ _, err := fmt.Scanln(&name)
+ if err != nil {
+ break
+ }
+ i.players = append(i.players, intPlayer{name, NewScore()})
+ count++
+
+ }
+ return nil
+}
+func (ui *Interactive) Round(r int) error {
+ fmt.Printf("Round %d\n", r)
+ for i := range ui.players {
+ turn(&ui.players[i])
+ }
+ return nil
+}
+
+func (ui *Interactive) BroadcastWinner() {
+ w := []intPlayer{}
+ s := 0
+
+ for _, p := range ui.players {
+ t := p.score.Score()
+ if t > s || len(w) == 0 {
+ s = t
+ w = []intPlayer{p}
+ } else if t == s {
+ w = append(w, p)
+ }
+ }
+
+ if len(w) == 1 {
+ fmt.Println("The Winner is:")
+ } else {
+ fmt.Println("The Winners are:")
+ }
+ for _, p := range w {
+ fmt.Println(p.name, "with", p.score.Score(), "points")
+ }
+}
+
+func turn(p *intPlayer) {
+ dices.Roll(nil)
+
+ fmt.Printf("%s's turn:\n", p.name)
+ fmt.Println(dices)
+
+ var cmd string
+ var args [5]string
+ rerolls := 0
+
+outer:
+ for {
+ cmd = " "
+ args[0], args[1], args[2], args[3], args[4] = "", "", "", "", ""
+ fmt.Print("Please enter a command(h for help): ")
+ fmt.Scanln(&cmd, &args[0], &args[1], &args[2], &args[3], &args[4])
+ switch cmd[0] {
+ case 'h':
+ cmdHelp(args[0])
+ case 'i':
+ pos, err := strconv.Atoi(args[0])
+ if err != nil {
+ fmt.Println("[pos] musst be a number.")
+ continue
+ }
+ points, err := p.score.Insert(dices, pos-1)
+ if err != nil {
+ fmt.Println("Insert failed:", err)
+ continue
+ }
+ fmt.Printf("You inserted %d into %d.\n", points, pos)
+ break outer
+ case 'p':
+ fmt.Println(p.score)
+ case 'd':
+ fmt.Println(dices)
+ case 'c':
+ pos, err := strconv.Atoi(args[0])
+ if err != nil {
+ fmt.Println("[pos] must be a number")
+ continue
+ }
+ err = p.score.Cancel(pos)
+ if err != nil {
+ fmt.Println(err)
+ continue
+ }
+ fmt.Println("You cancelled", pos)
+ break outer
+ case 'r':
+ if rerolls < 2 {
+ var idx []int
+ for _, c := range args {
+ if c == "" {
+ break
+ }
+ if n, err := strconv.Atoi(c); err == nil {
+ idx = append(idx, n)
+ } else {
+ fmt.Println(err)
+ fmt.Println("cant parse", c)
+ break
+ }
+ }
+ err := dices.Roll(idx)
+ if err != nil {
+ fmt.Println("Reroll failed:", err)
+ continue
+ }
+ rerolls++
+ fmt.Println(dices)
+ continue
+ }
+ fmt.Println("You are not allowed to reroll more than twice.")
+ default:
+ fmt.Println("Not a valid command. Try \"h\".")
+ }
+ }
+}
+
+func cmdHelp(cmd string) {
+ cmd = strings.TrimLeft(cmd, " ")
+ switch cmd {
+ case "d":
+ fmt.Println("d - print dices")
+ fmt.Println("Print out the dices")
+ case "p":
+ fmt.Println("p - print score")
+ fmt.Println("Print out your score<M-Escape>")
+ case "i":
+ fmt.Println("i [pos] - insert into score")
+ fmt.Println("Insert your current dices into your score.")
+ fmt.Println("See \"h pos\" for a explenation of the score entries")
+ case "r":
+ fmt.Println("r [dices] - reroll some dices")
+ fmt.Println("Reroll the specified dices.")
+ fmt.Println("The dices to reroll are represented by a list of their indices in the dice set.")
+ fmt.Println("Example:")
+ fmt.Println("\t\"r 1 4 5\" rerolls dice number 1, 4 and 5")
+ fmt.Println("\t\"r\" rerolls all dices")
+ case "h":
+ fmt.Println("h [cmd] - print help")
+ fmt.Println("Print the help for a specific command or gernal help.")
+ case "c":
+ fmt.Println("c [pos] - cancel a entry")
+ fmt.Println("Write 0 into your score.")
+ fmt.Println("See \"h pos\" for a explenation of the score entries")
+
+ case "pos":
+ fmt.Println("Positions:")
+ fmt.Println("\t1: Aces")
+ fmt.Println("\t2: Twos")
+ fmt.Println("\t3: Threes")
+ fmt.Println("\t4: Fours")
+ fmt.Println("\t5: Fives")
+ fmt.Println("\t6: Sixes")
+ fmt.Println("\t7: ThreeOfAKind")
+ fmt.Println("\t8: FourOfAKind")
+ fmt.Println("\t9: FullHouse")
+ fmt.Println("\t10: SmallStraight")
+ fmt.Println("\t11: LargeStraight")
+ fmt.Println("\t12: Yathzze")
+ fmt.Println("\t13: Chance")
+ default:
+ fmt.Println("h [cmd] - print help")
+ fmt.Println("p - print score")
+ fmt.Println("d - print dices")
+ fmt.Println("i [pos] - insert into score")
+ fmt.Println("r [dices] - reroll some dices")
+ fmt.Println("c [pos] - cancel a entry")
+ }
+}