多线程乒乓球双打-服务计算概论作业_第1页
多线程乒乓球双打-服务计算概论作业_第2页
多线程乒乓球双打-服务计算概论作业_第3页
多线程乒乓球双打-服务计算概论作业_第4页
多线程乒乓球双打-服务计算概论作业_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上 J I A N G S U U N I V E R S ITY 多线程模拟乒乓球双打 学院名称: 计算机 专业班级: 软件1401 学生姓名: 吴帅帅 学生学号: 指导教师姓名: 陈锦富 2017年 6月7日一、题目1. 有四个选手, A1和A2为一个队, B1和B2为另一个队. A1首先发球(启动球), 然后B1, A2, B2将最后发球. 每一轮每个选手发2个球.2. 选手不改变他们的位置.3. 比赛期间, 双方选手必须轮流发球,并且在同一个队伍的两个选手可以竞争发球.4. 当轮到某个选手时, 他/她可以调用一个叫做shot(rate) 的随机函数来模拟比赛,在

2、给定概率rate以内,该函数返回 “in”, 否则返回”out”. 例如 rate=85%, 则球在界内的概率为85%, 出界的概率为15%.5. 如果shot函数返回”in”, 对方选手必须调用shot函数把球打回.6. 如果shot函数返回”out”, 对方选手赢得1分,随后重新发球.7. 当每个选手发完2个球后比赛终止.分数多的一方赢得比赛.分数一样多,比赛为平局.8. 每个选手作为一个线程实现.二、实现思路serve: 是指发球的goroutine.serveMetux: 发球锁。playerA: 是指A队伍抢到球的goroutine.playerB: 是指B队伍抢到球的gorouti

3、ne.catch_chanel_A : 给A队伍的球的通道。catch_chanel_B : 给B队伍的球的通道。大致步骤:1. serve 先加锁,后发球(将TableTennis放入通道中,如catch_chanel_A ),然后重复上锁(serveMetux)阻塞自身。2. playerA 如果catch_chanel_A 没有球,阻塞自身。如果有球,则从通道中拿到球,shot(rate) 后返回in, 记录信息后,则将球放入给B的通道catch_chanel_B中。3. playerB 如果catch_chanel_B 没有球,阻塞自身。如果有球,则从通道中拿到球,shot(rate)

4、 后返回in, 记录信息后,则将球放入给B的通道catch_chanel_A中。如果shot(rate)返回out, 则解除锁(serveMetux),此时serve唤醒,开始下一次发球。三、实现代码package mainimport ( fmt sync math/rand container/ring strings time)var ( wg sync.WaitGroup / 用于goroutine计数 times = 2 / 每个选手发球次数 nums = 4 / 多少个选手 serveTotals = nums * times / 总发球次数 score_balls_A = mak

5、e(TableTennis, 0, serveTotals) / A的得分球 score_balls_B = make(TableTennis, 0, serveTotals) / B的得分球 turn = ring.New(4) / 发球顺序 serveMetux sync.Mutex / 发球锁 catch_chanel_B = make(chan TableTennis, 0) / B队伍接球的通道 catch_chanel_A = make(chan TableTennis, 0) / A队伍接球的通道 balls_ids = make(chan int, serveTotals) /

6、 球的id)/ 乒乓球type TableTennis struct id int trail string / 球的轨迹func serve() defer wg.Done() / 初始化发球顺序 turn.Value = A1 turn = turn.Next() turn.Value = B1 turn = turn.Next() turn.Value = A2 turn = turn.Next() turn.Value = B2 / 开始发球 for i := 0; i times; i+ for j := 0; j nums; j+ serveMetux.Lock() / 解锁时发下

7、一个球 turn = turn.Next() name := turn.Value.(string) t := TableTennis-balls_ids, name + -in if name0 = A catch_chanel_B - t else catch_chanel_A - t time.Sleep(time.Second) / 等待player goroutine对catch_chanel的使用 close(catch_chanel_A) close(catch_chanel_B)/ A队选手func playerA(name string, rate int) defer wg

8、.Done() / 延迟递减计数 for t := range catch_chanel_A / 2. 将球击打出去 rest := shot(rate) / 3. 记录球的轨迹 t.trail += - + name + - + rest / 球出界 if strings.Compare(out, rest) = 0 / 对方得分 score_balls_B = append(score_balls_B, t) fmt.Println(t) serveMetux.Unlock() continue / 4. 对面队伍准备接球 catch_chanel_B - t / B队选手func pla

9、yerB(name string, rate int) defer wg.Done() / 延迟递减计数 for t := range catch_chanel_B / 2. 将球击打出去 rest := shot(rate) / 3. 记录球的轨迹 t.trail += - + name + - + rest / 球出界 if strings.Compare(out, rest) = 0 / 对方得分 score_balls_A = append(score_balls_A, t) fmt.Println(t) serveMetux.Unlock() continue / 4. 对面队伍准备

10、接球 catch_chanel_A - t / 击球func shot(rate int) string if rand.Intn(100) rate return in else return out func main() fmt.Println(比赛开始.) / 初始化球的id for i := 0; i serveTotals; i+ balls_ids - i + 1 / 初始化发球顺序 wg.Add(nums + 1) / 累加计数 go serve() /time.Sleep(time.Second) go playerA(A1, 45) go playerA(A2, 60) go playerB(B1, 50) go playerB(B2, 90) wg.Wait() fmt.Println(比赛结束.) fmt.Printf(A : B = (%d, %d)n, len(score_balls_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论