Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "fmt"
- "log"
- "math/rand"
- "time"
- )
- type enumValue int32
- const (
- setup enumValue = iota
- play
- wrongAnswer
- correctAnswer
- higherAnswer
- lowerAnswer
- highScore
- end
- )
- type Game struct {
- state enumValue
- playerName string
- highscore int
- number int
- count int
- }
- func New() *Game {
- machine := &Game{}
- return machine
- }
- func main() {
- game := New()
- game.Run()
- }
- func setupGame(g *Game) enumValue {
- fmt.Print("Input your name: ")
- fmt.Scanf("%s\n", &g.playerName)
- rand.Seed(time.Now().UTC().UnixNano())
- g.number = rand.Intn(100)
- log.Println("Number to guess", g.number)
- return play
- }
- func playGame(g *Game) enumValue {
- fmt.Println("Guess the number? ")
- var number int
- fmt.Scanf("%d\n", &number)
- switch {
- case g.number == number:
- return correctAnswer
- case number < g.number:
- return higherAnswer
- case number > g.number:
- return lowerAnswer
- }
- if g.number == number {
- return correctAnswer
- }
- return wrongAnswer
- }
- func wrong(g *Game) enumValue {
- fmt.Println("Wrong guess, please try again.")
- g.count++
- return play
- }
- func correct(g *Game) enumValue {
- fmt.Println("Congratulations")
- fmt.Printf("You did it in %d tries.\n", g.count)
- return end
- }
- func showHighscore(g *Game) enumValue {
- return end
- }
- func higher(g *Game) enumValue {
- return end
- }
- func lower(g *Game) enumValue {
- return end
- }
- // Run is the main routine to run and will execute all the states accordingly
- func (g *Game) Run() {
- for state := g.state; state != end; {
- switch state {
- case setup:
- state = setupGame(g)
- case play:
- state = playGame(g)
- case wrongAnswer:
- state = wrong(g)
- case higherAnswer:
- state = higher(g)
- case lowerAnswer:
- state = lower(g)
- case correctAnswer:
- state = correct(g)
- case highScore:
- state = showHighscore(g)
- }
- }
- }
Add Comment
Please, Sign In to add comment