多线程乒乓球双打-服务计算概论作业.doc

多线程乒乓球双打-服务计算概论作业.doc

ID:56730475

大小:200.00 KB

页数:8页

时间:2020-07-06

多线程乒乓球双打-服务计算概论作业.doc_第1页
多线程乒乓球双打-服务计算概论作业.doc_第2页
多线程乒乓球双打-服务计算概论作业.doc_第3页
多线程乒乓球双打-服务计算概论作业.doc_第4页
多线程乒乓球双打-服务计算概论作业.doc_第5页
资源描述:

《多线程乒乓球双打-服务计算概论作业.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、JIANGSUUNIVERSITY多线程模拟乒乓球双打学院名称:计算机专业班级:软件1401学生姓名:吴帅帅学生学号:3140608020指导教师姓名:陈锦富2017年6月7日一、题目1.有四个选手,A1和A2为一个队,B1和B2为另一个队.A1首先发球(启动球),然后B1,A2,B2将最后发球.每一轮每个选手发2个球.2.选手不改变他们的位置.3.比赛期间,双方选手必须轮流发球,并且在同一个队伍的两个选手可以竞争发球.4.当轮到某个选手时,他/她可以调用一个叫做shot(rate)的随机函数来模拟比赛,在给定概率rate以内,该函数返回“in”

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

3、_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(

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

5、lls_A=make([]TableTennis,0,serveTotals)//A的得分球score_balls_B=make([]TableTennis,0,serveTotals)//B的得分球turn=ring.New(4)//发球顺序serveMetuxsync.Mutex//发球锁catch_chanel_B=make(chanTableTennis,0)//B队伍接球的通道catch_chanel_A=make(chanTableTennis,0)//A队伍接球的通道balls_ids=make(chanint,serveTotal

6、s)//球的id)//乒乓球typeTableTennisstruct{idinttrailstring//球的轨迹}funcserve(){deferwg.Done()//初始化发球顺序turn.Value="A1"turn=turn.Next()turn.Value="B1"turn=turn.Next()turn.Value="A2"turn=turn.Next()turn.Value="B2"//开始发球fori:=0;i

7、rn=turn.Next()name:=turn.Value.(string)t:=TableTennis{<-balls_ids,name+"-in"}ifname[0]=='A'{catch_chanel_B<-t}else{catch_chanel_A<-t}}}time.Sleep(time.Second)//等待playergoroutine对catch_chanel的使用close(catch_chanel_A)close(catch_chanel_B)}//A队选手funcplayerA(namestring,rateint){de

8、ferwg.Done()//延迟递减计数fort:=rangecatch_chanel_A{//2.将球击打出去rest:=shot(r

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。