@(go語言 黑馬)[GO語言]
用go程和channel模擬網(wǎng)球比賽
- 題目:兩運動員打網(wǎng)球,用程序簡單模擬一下打球過程
- 知識點:無緩沖通道channel,go并發(fā)
- 邏輯:
_1. 利用無緩沖channel來模擬 接球 和 擊球,讀取channel中的值為接球,往channel寫數(shù)據(jù)為擊球
_2. 設(shè)計一個運動員,實現(xiàn)的功能有:判斷是否贏了(讀不到數(shù)據(jù)時,贏),判斷是否輸了,失敗的條件各個運動員不同
_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
}
}