GO语言系列Go知识库

GO语言初级学习之代码案例09 (channel模拟网球比赛)

2018-08-16  本文已影响13人  大爬虫Shalom

@(go语言 黑马)[GO语言]

用go程和channel模拟网球比赛

_1. 利用无缓冲channel来模拟 接球 和 击球,读取channel中的值为接球,往channel写数据为击球
_2. 设计一个运动员,实现的功能有:判断是否赢了(读不到数据时,赢),判断是否输了,失败的条件各个运动员不同
_3. go程模拟两个运动员

package main

import "fmt"

func init() {
    rand.Seed(time.Now().UnixNano())
}
var wg01 sync.WaitGroup
func main() {
    wg01.Add(2)

    ch := make(chan int)
    go Player01("shalom",ch)
    go Player02("xulong",ch)
    fmt.Println("比赛开始!")
    time.After(time.Second)
    ch <- 1

    wg01.Wait()
}
func Player01(name string, ch chan int) {
    defer wg01.Done()
    for {
        num, ok := <-ch //num为我接到的球
        if !ok {
            fmt.Printf("%s运动员赢了\n", name)
            return
        }
        fmt.Printf("--%s运动员接到了:%d\n",name,num)

        if num%13 == 0 { //我的弱点是被13整除
            fmt.Printf("%s运动员输了\n", name)
            close(ch)
            return
        }
        time.After(time.Millisecond*300)
        ball := rand.Intn(1000) //ball为我打出的球
        fmt.Printf("--%s运动员击出球:%d\n",name,ball)
        ch <- ball
    }
}
func Player02(name string, ch chan int) {
    defer wg01.Done()
    for {
        num, ok := <-ch
        if !ok {
            fmt.Printf("%s运动员赢了\n", name)
            return
        }
        fmt.Printf("----%s运动员接到了:%d\n",name,num)

        if num%11 == 0 { //我的弱点是被11整除
            fmt.Printf("%s运动员输了\n", name)
            close(ch)
            return
        }
        time.After(time.Millisecond*300)
        ball := rand.Intn(1000)
        fmt.Printf("----%s运动员击出球:%d\n",name,ball)
        ch <- ball
    }
}
上一篇 下一篇

猜你喜欢

热点阅读