// math_race package main import ( "fmt" "math/rand" "strconv" "sync" "time" ) var comp_score = 0 var user_score = 0 func main() { var winning_score int fmt.Println("What is the winning score?") fmt.Scan(&winning_score) wg := &sync.WaitGroup{} rand.Seed(time.Now().UnixNano()) chan1 := make(chan string) chan2 := make(chan string) wg.Add(1) wg.Add(1) go reciever(chan1, chan2) go computer_solve(winning_score, chan1, wg) go user_solve(winning_score, chan2, wg) wg.Wait() close(chan1) close(chan2) if user_score == winning_score { fmt.Println("User Wins!") } else { fmt.Println("Computer Wins!") } fmt.Println("Program Finished") } func computer_solve(winning_score int, chan1 chan string, wg *sync.WaitGroup) { for comp_score < winning_score { if user_score == winning_score { break } num1 := rand.Intn(11) num2 := rand.Intn(11) comp_answer := num1 * num2 comp_score++ solved := strconv.Itoa(num1) + "*" + strconv.Itoa(num2) + "=" + strconv.Itoa(comp_answer) waiting_time := rand.Int31n(5-2) + 2 time.Sleep(time.Duration(waiting_time) * time.Second) chan1 <- "Computer Solved: " + solved + " Computer Score: " + strconv.Itoa(comp_score) } wg.Done() } func user_solve(winning_score int, chan2 chan string, wg *sync.WaitGroup) { var user_answer int for user_score < winning_score { if comp_score == winning_score { break } num1 := rand.Intn(11) num2 := rand.Intn(11) fmt.Println(num1, "*", num2, "=") fmt.Scan(&user_answer) fmt.Println(user_answer) if num1*num2 == user_answer { fmt.Println("correct!") user_score++ chan2 <- "User Score: " + strconv.Itoa(user_score) } else { fmt.Println("Incorrect") } } wg.Done() } func reciever(chan1 chan string, chan2 chan string) { for { select { case msg := <-chan1: fmt.Println(msg) case msg2 := <-chan2: fmt.Println(msg2) } } }