Java利用数组实现2020欧冠十六强抽签
作为一个尤文球迷,之前在懂球帝里看到有兄弟用C语言实现了十六强抽签,作为一个学Java的,决定尝试一下,由于学的不好,最近在重新看Java的学习视频,刚好看到数组这一部分,然后花了五六个小时的时间实现了功能,有注释。
环境:eclipse
// An highlighted block
/*
* 欧冠十六强随机对局
* 抽签规则
* 同一联赛不互相比赛
* 小组第一和其他小组的第二比赛
* A:拜仁(德) 马竞(西)
* B:皇马(西) 门兴(德)
* C:曼城(英) 波尔图(葡)
* D:利物浦(英) 亚特兰大(意)
* E:切尔西(英) 塞维利亚(西)
* F:多特(德) 拉齐奥(意)
* G:尤文(意) 巴萨(西)
* H: 巴黎(法) 莱比锡(德)
*/
import java.util.ArrayList;
import java.util.Random;
//足球俱乐部类
class FootballClub {
String fcname; // 俱乐部名
String group; // 小组赛小组名
String gamename; // 联赛名简写
boolean isOne; // 是否是小组第一
public FootballClub(String fcname, String group, String gamename,boolean isOne) {
this.fcname = fcname;
this.group = group;
this.gamename = gamename;
this.isOne = isOne;
}
}
public class Draw {
public static void main(String[] args) {
// 初始化对象数组
FootballClub[] fs=new FootballClub[16];
// 数组录入俱乐部信息
fs[0]=new FootballClub("拜仁","A","德",true);
fs[8]=new FootballClub("马竞","A","西",false);
fs[1]=new FootballClub("皇马","B","西",true);
fs[9]=new FootballClub("门兴","B","德",false);
fs[2]=new FootballClub("曼城","C","英",true);
fs[10]=new FootballClub("波尔图","C","葡",false);
fs[3]=new FootballClub("利物浦","D","英",true);
fs[11]=new FootballClub("亚特兰大","D","意",false);
fs[4]=new FootballClub("切尔西","E","英",true);
fs[12]=new FootballClub("塞维利亚","E","西",false);
fs[5]=new FootballClub("多特","F","德",true);
fs[13]=new FootballClub("拉齐奥","F","意",false);
fs[6]=new FootballClub("尤文","G","意",true);
fs[14]=new FootballClub("巴萨","G","西",false);
fs[7]=new FootballClub("巴黎","H","法",true);
fs[15]=new FootballClub("莱比锡","H","德",false);
// 用一个二维数组来获取每个球队对应的可能的对手所对应的数组下标
int[][] oppopent=new int[8][];
// 用一个一维数组来获取每个球队可能对手的数量
int[] num=new int[8];
// 通过嵌套循环将所有的对局情况遍历,根据十六强规则进行筛选,对局结果录入二维数组
for(int i=0;i<8;i++) {
int[] numj=new int[8]; // 一个大小为8的数组,将可能的对手的下标情况录入
//System.out.println(fs[i].fcname+"可能的对手有"); // 遍历每个队可能的对手
for(int j=8;j<16;j++) {
if(!fs[i].group.equals(fs[j].group)) { // 不是同一个小组
if(!fs[i].gamename.equals(fs[j].gamename)) { // 不是同一个联赛
//System.out.print(fs[j].fcname+"\t");
numj[num[i]]=j; // 录入下标
num[i]++; // 累加对手数量
}
}
}
oppopent[i]=new int[num[i]]; // 初始化二维数组第一维的大小
for(int h=0;h<num[i];h++) {
oppopent[i][h]=numj[h]; // 将值录入到二维数组
}
//System.out.println();
}
// 遍历所有的对手情况对应的数组下标
/* for(int i=0;i<8;i++) {
for(int j=0;j<oppopent[i].length;j++) {
System.out.print(oppopent[i][j]+"\t");
}
System.out.println();
}*/
// 数组通过简单的置值实现不重复抽签 两个地方需要考虑不重复,一个是随机数不能重复,一个是已经选择的球队条件不能重复
for(int i=0;i<8;i++) { // 依次遍历对局情况
int rnum = (int) (Math.random()* (oppopent[i].length-1+0+1)+0); // 对可能的球队依次遍历,如果随机到的值
int nnum = rnum; // 将随机值获取,防止重复时使用
while(fs[oppopent[i][rnum]]==null) { // 首先判断球队是否已经选过,如果是就重新随机一个不重复的数字
rnum=(int) (Math.random()* oppopent[i].length);
while(nnum==rnum) { // 判断重新获取到的随机数是否重复,如果重复,重新随机
rnum=(int) (Math.random()* oppopent[i].length);
}
}if (fs[oppopent[i][rnum]]!=null) {// 没有被选过且随机到的数可取
System.out.println(fs[i].fcname + "\tVS\t" + fs[oppopent[i][rnum]].fcname);
fs[oppopent[i][rnum]]=null;
continue; // 判断下一个小组第一的对手
}
}
}
}
某一次让我满足的随机结果: