循环网球赛源码原创.docx
- 文档编号:12093414
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:17
- 大小:17.73KB
循环网球赛源码原创.docx
《循环网球赛源码原创.docx》由会员分享,可在线阅读,更多相关《循环网球赛源码原创.docx(17页珍藏版)》请在冰豆网上搜索。
循环网球赛源码原创
需求:
假设有n=2k个运动员要进行网球循环赛。
设计一个满足一下要求的比赛日程表:
(1).每个选手必须与其他n-1个选手各赛一次
(2).每个选手一天只能赛一次
(3).循环赛一共进行n-1天
利用Java语言开发一个界面,输入运动员的个数,输出比赛日程表。
对于输入运动员数目不满足n=2k时,弹出信息提示用户。
共两个类,需放到com包下。
运行Match类。
第一个类:
packagecom;
importjava.awt.BorderLayout;
importjava.awt.FlowLayout;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.util.List;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JList;
importjavax.swing.JPanel;
importjavax.swing.JTextField;
/**
*网球赛
*@authorCris
*@ClassName:
Match
*@Version
*@ModifiedBy
*@Copyright@2010H<echnologyInc.
*@date2011-5-24上午11:
29:
39
*@description
*/
publicclassMatchimplementsActionListener{
privateJFramef;
privateJTextFieldtf;
privateJPanelcontainer;
privateJListmyList;
privateJLabelmessage;
privateJButtonb;
/**
*@authorCris
*@title:
main
*@date2011-5-23上午11:
07:
27
*@paramargsvoid
*/
publicstaticvoidmain(String[]args){
Matcht=newMatch();
t.go();
}
publicvoidgo(){
f=newJFrame("比赛");
f.setLocation(100,200);
f.setSize(600,500);
container=newJPanel(newBorderLayout());
f.setContentPane(container);
JPaneltitle=newJPanel(newFlowLayout());
tf=newJTextField(10);
title.add(tf);
b=newJButton("确定");
b.addActionListener(this);
title.add(b);
message=newJLabel();
title.add(message);
container.add(title,BorderLayout.NORTH);
myList=newJList();
container.add(myList,BorderLayout.CENTER);
f.setVisible(true);
}
/**
*显示比赛结果
*@authorCris
*@title:
show
*@date2011-5-24上午11:
31:
05
*@paramnvoid
*/
privatevoidshow(intn){
Crisc=newCris(n);
List>result=c.getResult();
String[]str=newString[result.size()];
for(inti=0;i StringBuildersb=newStringBuilder(); sb.append("第").append(i+1).append("天: "); List for(String[]match: matchList){ sb.append("[").append(match[0]).append("-").append(match[1]).append("]"); } str[i]=sb.toString(); } myList.setListData(str); message.setText(""); f.setVisible(true); } /** *清空数据 *@authorCris *@title: clear *@date2011-5-24上午11: 30: 36void */ privatevoidclear(){ String[]str={""}; myList.setListData(str); message.setText(""); } publicvoidactionPerformed(ActionEvente){ clear(); Strings=tf.getText(); if(s==null||"".equals(s=s.trim())){ message.setText("请输入一个偶数"); } try{ intn=Integer.parseInt(s); if(n<=0||n%2! =0){ message.setText("请输入一个偶数"); }else{ show(n); } }catch(Exceptionex){ message.setText("请输入一个偶数"); } f.setVisible(true); } } 第二个类: packagecom; importjava.util.ArrayList; importjava.util.HashMap; importjava.util.LinkedList; importjava.util.List; importjava.util.Map; importjava.util.Random; publicclassCris{ /**选手数量*/ privateintn; /**各个运动员还没进行的比赛key: 球员名称,value: 需进行的比赛集合*/ privateMap /**球员人名*/ privateString[]players; /**最终每天的比赛分布集合*/ privateList /**所有可选的比赛*/ privateList /**每天的比赛*/ List /**一个随机对象*/ privateRandomr; /**当前运算到的天数*/ privateintnowDay; publicCris(intn){ this.n=n; playerMacth=newHashMap result=newArrayList allMatchData=newLinkedList[n-1]; r=newRandom(); init(); go(); } /** *初始化球员 *@authorCris *@title: init *@date2011-5-23下午04: 22: 32void */ privatevoidinit(){ //定义球员人名,以数字代表,从1开始 players=newString[n]; for(inti=0;i //定义球员的名字 players[i]=String.valueOf(i+1); //存放每个球员要进行的比赛的集合 List //球员赛事集合 playerMacth.put(players[i],matchList); //球员集合,不变 //playerListConst.add(players[i]); } //定义每个人的比赛 for(inti=0;i for(intj=i+1;j String[]match={players[i],players[j]};//定义一个比赛 //把此赛事添加到相应球员需比赛集合中 playerMacth.get(players[i]).add(match); playerMacth.get(players[j]).add(match); } } } /** *随机获得一个当前天数可进行的比赛组合,并把此比赛组合从总集合中移除 *如果当前天数无比赛,则先获得比赛,再随机 *@authorCris *@title: getNowDayMatch *@date2011-5-24上午09: 48: 23 *@returnList */ privateList if(allMatchData[nowDay]==null){ setAllMatchNowDay(); } if(! allMatchData[nowDay].isEmpty()){ intindex=r.nextInt(allMatchData[nowDay].size()); List allMatchData[nowDay].remove(index); returnlist; }else{ returnnull; } } /** *取消前一天的比赛 *@authorCris *@title: cancelYesterday *@date2011-5-24上午09: 56: 12void */ privatevoidcancelYesterday(){ //清空当前天数的可选比赛组合 allMatchData[nowDay]=null; //时间恢复到前一天 nowDay--; //获得前一天的比赛 List //取消前一天的比赛 result.remove(nowDay); //恢复每个运动员未进行的比赛 for(String[]match: matchList){ playerMacth.get(match[0]).add(match); playerMacth.get(match[1]).add(match); } } publicvoidgo(){ //循环比赛天数 for(nowDay=0;nowDay //1.随机一个比赛 List //无比赛组合,返回上一天取消上一天的比赛,时间回退到前一天,跳过此次循环 if(matchList==null){ cancelYesterday(); continue; } //3遍历比赛去除运动员去除运动员的未进行比赛 for(String[]match: matchList){ playerMacth.get(match[0]).remove(match); playerMacth.get(match[1]).remove(match); } result.add(matchList); nowDay++; } } /** *从1号队员开始,获得当前天数所有可组合的赛事 *@authorCris *@title: setAllMatchNowDay *@date2011-5-24上午09: 42: 51void */ privatevoidsetAllMatchNowDay(){ allMatchData[nowDay]=newLinkedList intn=1;//1号运动员 //此运动员未进行的比赛 List for(String[]match: matchList){ List selectedList.add(match); doDetAllMatchNowDay(n+1,selectedList); } } /** *今天比赛的所有组合 *@authorCris *@title: doDetAllMatchNowDay *@date2011-5-24上午09: 46: 05 *@paramplayerNum *@paramselectedListvoid */ privatevoiddoDetAllMatchNowDay(intplayerNum,List //运动员名称 Stringplayer=String.valueOf(playerNum); booleanflag=true; //判断此运动员是不是已被选过 for(String[]match: selectedList){ if(match[0].equals(player)||match[1].equals(player)){ flag=false; break; } } //已被选过 if(flag==false){ //最后一个人员 if(playerNum==n){ allMatchData[nowDay].add(selectedList); }else{ doDetAllMatchNowDay(playerNum+1,selectedList); } return; } //此运动员未进行的比赛 List //此运动员可选择的比赛 List for(String[]match: matchList){ flag=true; for(String[]selected: selectedList){ if(match[0].equals(player)){ if(match[1].equals(selected[0])){ flag=false; }elseif(match[1].equals(selected[1])){ flag=false; } }else{ if(match[0].equals(selected[0])){ flag=false; }elseif(match[0].equals(selected[1])){ flag=false; } } } if(flag){ canDoList.add(match); } } //遍历此运动员可选择的比赛 for(String[]match: canDoList){ List //记录当前比赛 newList.add(match); //最后一个人员 if(playerNum==n){ allMatchData[nowDay].add(newList); }else{ doDetAllMatchNowDay(playerNum+1,newList); } } } /** *复制集合 *@authorCris *@title: copyArrayList *@date2011-5-24上午09: 24: 44 *@paramlist *@returnList */ privateList List for(String[]s: list){ newList.add(s); } returnnewList; } publicList returnresult; } }>result;
>allMatchData[];
>();
>();
>getResult(){
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 循环 网球赛 源码 原创
![提示](https://static.bdocx.com/images/bang_tan.gif)