循环网球赛源码原创.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;iStringBuildersb=newStringBuilder();
sb.append("第").append(i+1).append("天:
");
ListmatchList=result.get(i);
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>playerMacth;
/**球员人名*/
privateString[]players;
/**最终每天的比赛分布集合*/
privateList>result;
/**所有可选的比赛*/
privateList>allMatchData[];
/**每天的比赛*/
ListdayMatch;
/**一个随机对象*/
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);
//存放每个球员要进行的比赛的集合
ListmatchList=newLinkedList();
//球员赛事集合
playerMacth.put(players[i],matchList);
//球员集合,不变
//playerListConst.add(players[i]);
}
//定义每个人的比赛
for(inti=0;ifor(intj=i+1;jString[]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
*/
privateListgetNowDayMatch(){
if(allMatchData[nowDay]==null){
setAllMatchNowDay();
}
if(!
allMatchData[nowDay].isEmpty()){
intindex=r.nextInt(allMatchData[nowDay].size());
Listlist=allMatchData[nowDay].get(index);
allMatchData[nowDay].remove(index);
returnlist;
}else{
returnnull;
}
}
/**
*取消前一天的比赛
*@authorCris
*@title:
cancelYesterday
*@date2011-5-24上午09:
56:
12void
*/
privatevoidcancelYesterday(){
//清空当前天数的可选比赛组合
allMatchData[nowDay]=null;
//时间恢复到前一天
nowDay--;
//获得前一天的比赛
ListmatchList=result.get(nowDay);
//取消前一天的比赛
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.随机一个比赛
ListmatchList=getNowDayMatch();
//无比赛组合,返回上一天取消上一天的比赛,时间回退到前一天,跳过此次循环
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号运动员
//此运动员未进行的比赛
ListmatchList=playerMacth.get(String.valueOf(n));
for(String[]match:
matchList){
ListselectedList=newArrayList();
selectedList.add(match);
doDetAllMatchNowDay(n+1,selectedList);
}
}
/**
*今天比赛的所有组合
*@authorCris
*@title:
doDetAllMatchNowDay
*@date2011-5-24上午09:
46:
05
*@paramplayerNum
*@paramselectedListvoid
*/
privatevoiddoDetAllMatchNowDay(intplayerNum,ListselectedList){
//运动员名称
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;
}
//此运动员未进行的比赛
ListmatchList=playerMacth.get(player);
//此运动员可选择的比赛
ListcanDoList=newArrayList();
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){
ListnewList=copyArrayList(selectedList);
//记录当前比赛
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
*/
privateListcopyArrayList(Listlist){
ListnewList=newArrayList();
for(String[]s:
list){
newList.add(s);
}
returnnewList;
}
publicList>getResult(){
returnresult;
}
}