From 51e5c2ebd78dff2043c993511921cfe1e11e4688 Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Tue, 21 Feb 2017 16:35:45 +0100 Subject: use uis/intercative.go as example --- example/interactive.go | 129 ++++++++++++++++++++++++++++++++++++++++++++ uis/interactive.go | 144 ------------------------------------------------- 2 files changed, 129 insertions(+), 144 deletions(-) create mode 100644 example/interactive.go delete mode 100644 uis/interactive.go diff --git a/example/interactive.go b/example/interactive.go new file mode 100644 index 0000000..91b2390 --- /dev/null +++ b/example/interactive.go @@ -0,0 +1,129 @@ +// Copyright (c) 2016 Florian Fischer. All rights reserved. +// Use of this source code is governed by a MIT license found in the LICENSE file. + +package main + +import ( + "bufio" + "fmt" + "os" + + "muhq.space/go/muhq/goffel/logic" +) + +var players []logic.Player +var dice logic.Dice +var reader = bufio.NewReader(os.Stdin) + +func main() { + getPlayers() + for r := 1; r < 14; r++ { + round(r) + } + broadcastWinner() +} + +func getPlayers() { + 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 + } + players = append(players, logic.NewPlayer(name)) + count++ + } +} + +func round(r int) { + fmt.Printf("Round %d\n", r) + for i := range players { + turn(&players[i]) + } +} + +func turn(p *logic.Player) { + dice.Roll(nil) + + fmt.Printf("%s's turn:\n", p.Name) + fmt.Println(dice) + + var cmd logic.Cmd + rerolls := 0 + + for { + fmt.Print("Please enter a command(h for help): ") + input, err := reader.ReadString('\n') + if err != nil { + panic(err) + } + cmd, err = logic.ParseCmd(input[0 : len(input)-1]) + if err != nil { + fmt.Printf("%v. Try \"h\".\n", err) + continue + } + switch cmd.Cmd { + case "h": + fmt.Println() + for _, helpLine := range logic.CmdHelp(cmd.Argv[0]) { + fmt.Println(helpLine) + } + case "p": + fmt.Println(p.Score) + case "d": + fmt.Println(dice) + case "q": + os.Exit(0) + case "i": + points, err := p.Score.Insert(dice, cmd.Argv[0]) + if err != nil { + fmt.Println("Insert failed:", err) + continue + } + fmt.Printf("You inserted %d into %v.\n", points, logic.ScoreNames[cmd.Argv[0]]) + return + case "c": + err = p.Score.Cancel(cmd.Argv[0]) + if err != nil { + fmt.Println(err) + continue + } + fmt.Println("You cancelled", logic.ScoreNames[cmd.Argv[0]]) + return + case "r": + if rerolls < 2 { + err := dice.Roll(cmd.Argv) + if err != nil { + fmt.Println("Reroll failed:", err) + continue + } + rerolls++ + fmt.Println(dice) + continue + } + fmt.Println("You are not allowed to reroll more than twice.") + default: + } + } +} + +func broadcastWinner() { + fmt.Println("Fin!") + winners, max := logic.FindBest(players) + + for _,p := range players { + fmt.Printf("%v scored %d\n", p, p.Score.Score()) + } + + if len(winners) == 1 { + fmt.Println("The Winner is:") + } else { + fmt.Println("The Winners are:") + } + for _, winner := range winners { + fmt.Printf("%v with %v points\n", winner.Name, max) + } +} diff --git a/uis/interactive.go b/uis/interactive.go deleted file mode 100644 index 5e7994e..0000000 --- a/uis/interactive.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright (c) 2016 Florian Fischer. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -package uis - -import ( - "bufio" - "fmt" - "os" - - . "muhq.space/go/muhq/goffel/logic" -) - -type Interactive struct { - players []Player -} - -var dices Dice -var reader = bufio.NewReader(os.Stdin) - -func (i *Interactive) Run() { - i.init() - for r := 1; r < 14; r++ { - i.round(r) - } - i.broadcastWinner() -} - -func (i *Interactive) init() { - 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, NewPlayer(name)) - count++ - - } -} -func (ui *Interactive) round(r int) { - fmt.Printf("Round %d\n", r) - for i := range ui.players { - turn(&ui.players[i]) - } -} - -func turn(p *Player) { - dices.Roll(nil) - - fmt.Printf("%s's turn:\n", p.Name) - fmt.Println(dices) - - var cmd Cmd - rerolls := 0 - - for { - fmt.Print("Please enter a command(h for help): ") - input, err := reader.ReadString('\n') - if err != nil { - panic(err) - } - cmd, err = ParseCmd(input[0 : len(input)-1]) - if err != nil { - fmt.Printf("%v. Try \"h\".\n", err) - continue - } - switch cmd.Cmd { - case "h": - fmt.Println() - for _, helpLine := range CmdHelp(cmd.Argv[0]) { - fmt.Println(helpLine) - } - case "p": - fmt.Println(p.Score) - case "d": - fmt.Println(dices) - case "q": - os.Exit(0) - case "i": - points, err := p.Score.Insert(dices, cmd.Argv[0]) - if err != nil { - fmt.Println("Insert failed:", err) - continue - } - fmt.Printf("You inserted %d into %v.\n", points, ScoreNames[cmd.Argv[0]]) - return - case "c": - err = p.Score.Cancel(cmd.Argv[0]) - if err != nil { - fmt.Println(err) - continue - } - fmt.Println("You cancelled", ScoreNames[cmd.Argv[0]]) - return - case "r": - if rerolls < 2 { - err := dices.Roll(cmd.Argv) - 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: - } - } -} - -func (ui *Interactive) broadcastWinner() { - fmt.Println("Fin!") - winners := []Player{} - max := 0 - - for _, player := range ui.players { - t := player.Score.Score() - if t > max || len(winners) == 0 { - for _, winner := range winners { - fmt.Printf("\t%v scored %v points\n", winner.Name, max) - } - max = t - winners = []Player{player} - } else if t == max { - winners = append(winners, player) - } else { - fmt.Printf("\t%v scored %v points\n", player.Name, t) - } - } - - if len(winners) == 1 { - fmt.Println("The Winner is:") - } else { - fmt.Println("The Winners are:") - } - for _, winner := range winners { - fmt.Printf("\t%v with %v points\n", winner.Name, max) - } -} -- cgit v1.2.3