main.go
package main
import (
"math/rand"
"time"
)
func main() {
// generate a random seed
rand.Seed(time.Now().UnixNano())
a := newAnswer()
m := newMenu(a)
m.run()
}
animal.go
package main
type animal struct {
name string
hasScales bool
hasTail bool
hasLegs bool
livesInWater bool
}
func fish() animal {
return animal{
name: "fish",
hasScales: true,
hasTail: true,
hasLegs: false,
livesInWater: true,
}
}
func lizard() animal {
return animal{
name: "lizard",
hasScales: true,
hasTail: true,
hasLegs: true,
livesInWater: false,
}
}
func crab() animal {
return animal{
name: "crab",
hasScales: false,
hasTail: false,
hasLegs: true,
livesInWater: true,
}
}
answer.go
package main
import (
"math/rand"
)
type answer struct {
chosen animal
all []animal
}
// newAnswer returns an answer
func newAnswer() answer {
var a answer
a.all = []animal{
fish(),
lizard(),
crab(),
}
// generate a random integer based on the length of the slice
randomInteger := rand.Intn(len(a.all) - 1)
// assign the chosen animal
a.chosen = a.all[randomInteger]
return a
}
func (a answer) name() string {
return a.chosen.name
}
func (a answer) hasScales() string {
if a.chosen.hasScales == true {
return "Yes, this animal has scales."
}
return "No, this animal does not have scales."
}
func (a answer) hasTail() string {
if a.chosen.hasTail == true {
return "Yes, this animal does have a tail."
}
return "No, this animal does not have a tail."
}
func (a answer) hasLegs() string {
if a.chosen.hasLegs == true {
return "Yes, this animal does have legs."
}
return "No, this animal does not have legs."
}
func (a answer) livesInWater() string {
if a.chosen.livesInWater == true {
return "Yes, this animal lives in the water."
}
return "No, this animal does not live in the water."
}
menu.go
package main
import (
"bufio"
"fmt"
"log"
"os"
"strconv"
)
type menu struct {
scanner *bufio.Scanner
answer answer
player string
}
func newMenu(a answer) menu {
return menu{answer: a, scanner: bufio.NewScanner(os.Stdin)}
}
func (m menu) run() {
fmt.Println("Hello, what is your name?")
m.scanner.Scan()
if err := m.scanner.Err(); err != nil {
log.Println(err)
os.Exit(1)
}
m.player = m.scanner.Text()
fmt.Printf("\n\n")
fmt.Println("Hello", m.player, "let's play a game!")
fmt.Println("I will think of an animal and you will try to guess what it is.")
fmt.Printf("The possible answers are: ")
for i := range m.answer.all {
fmt.Printf("%s ", m.answer.all[i].name)
}
fmt.Printf("\n")
m.top()
}
func (m menu) top() {
for {
fmt.Printf("\n\n")
fmt.Println("What would you like to do?")
fmt.Println("1) Ask a question about the animal")
fmt.Println("2) Guess the animal")
fmt.Println("3) Quit the program")
m.scanner.Scan()
if err := m.scanner.Err(); err != nil {
log.Println(err)
os.Exit(1)
}
switch m.scanner.Text() {
case "1":
m.question()
continue
case "2":
m.guess()
continue
case "3":
fmt.Printf("Good bye %s, thanks for playing!\n", m.player)
os.Exit(1)
default:
fmt.Println("I'm sorry, that isn't one of your choices. Please try again.")
}
}
}
func (m menu) question() {
for {
fmt.Printf("\n\n")
fmt.Println("What would you like to ask?")
fmt.Println("1) Does the animal have scales?")
fmt.Println("2) Does the animal have a tail?")
fmt.Println("3) Does the animal have legs?")
fmt.Println("4) Does the animal live in the water?")
m.scanner.Scan()
if err := m.scanner.Err(); err != nil {
log.Println(err)
os.Exit(1)
}
switch m.scanner.Text() {
case "1":
fmt.Println(m.answer.hasScales())
return
case "2":
fmt.Println(m.answer.hasTail())
return
case "3":
fmt.Println(m.answer.hasLegs())
return
case "4":
fmt.Println(m.answer.livesInWater())
return
default:
fmt.Printf("\n\n")
fmt.Println("I'm sorry, I didn't understand that answer. " +
"Please enter a number that corresponds with your question.")
}
}
}
func (m menu) guess() {
for {
fmt.Printf("\n\n")
fmt.Println("What animal am I thinking of?")
for i := range m.answer.all {
fmt.Printf("%v) %s\n", i+1, m.answer.all[i].name)
}
m.scanner.Scan()
if err := m.scanner.Err(); err != nil {
log.Println(err)
os.Exit(1)
}
i, err := strconv.Atoi(m.scanner.Text())
if err != nil || i > len(m.answer.all) || i < 1 {
fmt.Println("I'm sorry, I didn't understand that answer. Please enter an answer by typing in a number.")
continue
}
if m.answer.all[i-1].name == m.answer.chosen.name {
fmt.Printf("\n\n")
fmt.Printf("That's right %s! I was thinking of %s\n", m.player, m.answer.chosen.name)
return
}
fmt.Printf("\n\n")
fmt.Printf("Sorry %s, that wasn't the animal I was thinking of.\n", m.player)
return
}
}
网友评论