Files
basic-computer-games/00_Alternate_Languages/45_Hello/go/main.go
2022-10-31 14:12:57 +10:00

241 lines
5.8 KiB
Go

package main
import (
"bufio"
"fmt"
"os"
"strings"
"time"
)
type PROBLEM_TYPE int8
const (
SEX PROBLEM_TYPE = iota
HEALTH
MONEY
JOB
UKNOWN
)
func getYesOrNo() (bool, bool, string) {
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
if strings.ToUpper(scanner.Text()) == "YES" {
return true, true, scanner.Text()
} else if strings.ToUpper(scanner.Text()) == "NO" {
return true, false, scanner.Text()
} else {
return false, false, scanner.Text()
}
}
func printTntro() {
fmt.Println(" HELLO")
fmt.Println(" CREATIVE COMPUTING MORRISTOWN, NEW JERSEY")
fmt.Print("\n\n\n")
fmt.Println("HELLO. MY NAME IS CREATIVE COMPUTER.")
fmt.Println("\nWHAT'S YOUR NAME?")
}
func askEnjoyQuestion(user string) {
fmt.Printf("HI THERE %s, ARE YOU ENJOYING YOURSELF HERE?\n", user)
for {
valid, value, msg := getYesOrNo()
if valid {
if value {
fmt.Printf("I'M GLAD TO HEAR THAT, %s.\n", user)
fmt.Println()
} else {
fmt.Printf("OH, I'M SORRY TO HEAR THAT, %s. MAYBE WE CAN\n", user)
fmt.Println("BRIGHTEN UP YOUR VISIT A BIT.")
}
break
} else {
fmt.Printf("%s, I DON'T UNDERSTAND YOUR ANSWER OF '%s'.\n", user, msg)
fmt.Println("PLEASE ANSWER 'YES' OR 'NO'. DO YOU LIKE IT HERE?")
}
}
}
func promptForProblems(user string) PROBLEM_TYPE {
scanner := bufio.NewScanner(os.Stdin)
fmt.Println()
fmt.Printf("SAY %s, I CAN SOLVE ALL KINDS OF PROBLEMS EXCEPT\n", user)
fmt.Println("THOSE DEALING WITH GREECE. WHAT KIND OF PROBLEMS DO")
fmt.Println("YOU HAVE? (ANSWER SEX, HEALTH, MONEY, OR JOB)")
for {
scanner.Scan()
switch strings.ToUpper(scanner.Text()) {
case "SEX":
return SEX
case "HEALTH":
return HEALTH
case "MONEY":
return MONEY
case "JOB":
return JOB
default:
return UKNOWN
}
}
}
func promptTooMuchOrTooLittle() (bool, bool) {
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
if strings.ToUpper(scanner.Text()) == "TOO MUCH" {
return true, true
} else if strings.ToUpper(scanner.Text()) == "TOO LITTLE" {
return true, false
} else {
return false, false
}
}
func solveSexProblem(user string) {
fmt.Println("IS YOUR PROBLEM TOO MUCH OR TOO LITTLE?")
for {
valid, tooMuch := promptTooMuchOrTooLittle()
if valid {
if tooMuch {
fmt.Println("YOU CALL THAT A PROBLEM?!! I SHOULD HAVE SUCH PROBLEMS!")
fmt.Printf("IF IT BOTHERS YOU, %s, TAKE A COLD SHOWER.\n", user)
} else {
fmt.Printf("WHY ARE YOU HERE IN SUFFERN, %s? YOU SHOULD BE\n", user)
fmt.Println("IN TOKYO OR NEW YORK OR AMSTERDAM OR SOMEPLACE WITH SOME")
fmt.Println("REAL ACTION.")
}
return
} else {
fmt.Printf("DON'T GET ALL SHOOK, %s, JUST ANSWER THE QUESTION\n", user)
fmt.Println("WITH 'TOO MUCH' OR 'TOO LITTLE'. WHICH IS IT?")
}
}
}
func solveHealthProblem(user string) {
fmt.Printf("MY ADVICE TO YOU %s IS:\n", user)
fmt.Println(" 1. TAKE TWO ASPRIN")
fmt.Println(" 2. DRINK PLENTY OF FLUIDS (ORANGE JUICE, NOT BEER!)")
fmt.Println(" 3. GO TO BED (ALONE)")
}
func solveMoneyProblem(user string) {
fmt.Printf("SORRY, %s, I'M BROKE TOO. WHY DON'T YOU SELL\n", user)
fmt.Println("ENCYCLOPEADIAS OR MARRY SOMEONE RICH OR STOP EATING")
fmt.Println("SO YOU WON'T NEED SO MUCH MONEY?")
}
func solveJobProblem(user string) {
fmt.Printf("I CAN SYMPATHIZE WITH YOU %s. I HAVE TO WORK\n", user)
fmt.Println("VERY LONG HOURS FOR NO PAY -- AND SOME OF MY BOSSES")
fmt.Printf("REALLY BEAT ON MY KEYBOARD. MY ADVICE TO YOU, %s,\n", user)
fmt.Println("IS TO OPEN A RETAIL COMPUTER STORE. IT'S GREAT FUN.")
}
func askQuestionLoop(user string) {
for {
problem := promptForProblems(user)
switch problem {
case SEX:
solveSexProblem(user)
case HEALTH:
solveHealthProblem(user)
case MONEY:
solveMoneyProblem(user)
case JOB:
solveJobProblem(user)
case UKNOWN:
fmt.Printf("OH %s, YOUR ANSWER IS GREEK TO ME.\n", user)
}
for {
fmt.Println()
fmt.Printf("ANY MORE PROBLEMS YOU WANT SOLVED, %s?\n", user)
valid, value, _ := getYesOrNo()
if valid {
if value {
fmt.Println("WHAT KIND (SEX, MONEY, HEALTH, JOB)")
break
} else {
return
}
}
fmt.Printf("JUST A SIMPLE 'YES' OR 'NO' PLEASE, %s\n", user)
}
}
}
func goodbyeUnhappy(user string) {
fmt.Println()
fmt.Printf("TAKE A WALK, %s.\n", user)
fmt.Println()
fmt.Println()
}
func goodbyeHappy(user string) {
fmt.Printf("NICE MEETING YOU %s, HAVE A NICE DAY.\n", user)
}
func askForFee(user string) {
fmt.Println()
fmt.Printf("THAT WILL BE $5.00 FOR THE ADVICE, %s.\n", user)
fmt.Println("PLEASE LEAVE THE MONEY ON THE TERMINAL.")
time.Sleep(4 * time.Second)
fmt.Print("\n\n\n")
fmt.Println("DID YOU LEAVE THE MONEY?")
for {
valid, value, msg := getYesOrNo()
if valid {
if value {
fmt.Printf("HEY, %s, YOU LEFT NO MONEY AT ALL!\n", user)
fmt.Println("YOU ARE CHEATING ME OUT OF MY HARD-EARNED LIVING.")
fmt.Println()
fmt.Printf("WHAT A RIP OFF, %s!!!\n", user)
fmt.Println()
} else {
fmt.Printf("THAT'S HONEST, %s, BUT HOW DO YOU EXPECT\n", user)
fmt.Println("ME TO GO ON WITH MY PSYCHOLOGY STUDIES IF MY PATIENTS")
fmt.Println("DON'T PAY THEIR BILLS?")
}
return
} else {
fmt.Printf("YOUR ANSWER OF '%s' CONFUSES ME, %s.\n", msg, user)
fmt.Println("PLEASE RESPOND WITH 'YES' or 'NO'.")
}
}
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
printTntro()
scanner.Scan()
userName := scanner.Text()
fmt.Println()
askEnjoyQuestion(userName)
askQuestionLoop(userName)
askForFee(userName)
if false {
goodbyeHappy(userName) // unreachable
} else {
goodbyeUnhappy(userName)
}
}