@(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
}
}