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

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

用go程和channel模拟网球比赛

  • 题目:两运动员打网球,用程序简单模拟一下打球过程
  • 知识点:无缓冲通道channel,go并发
  • 逻辑:

_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
    }
}
    原文作者:大爬虫Shalom
    原文地址: https://www.jianshu.com/p/fe9fa4325a76
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞