壹 · 解释说明

创作声明

本代码纯手搓,没有借助任何AI工具或他人代码,如有雷同,纯属巧合!

代码可免费复制,但如需转载请标明原作者

创作背景&灵感来源

作为一名初三生,中考终于结束,这才忙里偷空,编些东西消遣……

2026,这一年是多少人心目中的足球盛会,无论是民间的苏超、闵超、东北超,还是职业的英超、欧冠、世界杯,都能给我们带来极大的震撼。世界杯的比赛精彩纷呈,各位想必看着手也挺痒的吧?不如以编程为工具,来一场属于自己的足球联赛!

功能介绍

显然,这是一个模拟足球赛事的世界杯,你可以自定义球队名称和球队的能力值,也可以输入球队名称,让电脑在一定范围内随机决定球队的能力值。

足球赛事模拟共分两个阶段——

1.第一阶段 小组赛

随机分组,每组采用主客双循环赛制

2.第二阶段 淘汰赛

随机决定淘汰赛位置,常规赛-加时赛-点球大战

——介绍的比较简略,但程序运行时的说明本身就已经很详尽了,所以不作过多冗余的解释

不足之处

1.小组赛采用双循环赛制,与常见国际大赛的赛制略有不同

2.无种子保护机制,分组和淘汰赛位置纯随机分布

3.点球大战无法提前结束,即使差距巨大也依然要赛满5轮才能跳出

4.程序运行速度依赖电脑性能,且整个过程较慢,对快性子不友好

(5.史山代码,无法轻易看懂)

如果你有解决方案,欢迎评论区留言!如遇其他bug,也欢迎提出……

贰 · 史山代码

完整代码展示(可直接复制,但若转载须标注原作者)

#include<bits/stdc++.h>
#include<windows.h>
#define GREEN "\033[32m"
#define RED "\033[31m"
#define YELLOW  "\033[33m"
#define GOLD "\033[1;33m"
#define RESET "\033[37m"
using namespace std;
int agus[4],bgus[4],ran[4],ascore,bscore,t,finals;
vector<int>aj;
vector<int>bj; 
string a,b;
int groups,ineach,outline,fujia,fujias;//组数,每组队伍个数,淘汰赛线,附加赛线 ,附加名额 
int infinals; 
int tt[1010];//淘汰赛
bool zhijie; 
struct yuanlaide{
	int val;
	int alive;
}ytt[1010]; 
int ttt,alives;
int tp[10];//铜牌争夺战 
int winners[10];//最终金、银、铜牌! 
bool vis[1010];
struct node{
	int val;//编号 
	int sc;//积分
	int wins,loses;//胜负得分 
	int jin;//净得分 
	int w,l,p;//胜负平 局数 
}g[1010][1010];
node xrank[1010];//显示排名用的 
node fj[1010];//附加赛
int gt[1010];
map<int,string>idx;
map<string,int>ridx; 
vector<int>jqmin;//每场比赛的进球时间
map<int,vector<string> >jqd;//进球时间对应的进球队伍编号
int abi[1010];//每个球队对应的能力值 
vector<node>jinf;//晋级待定的队伍 
node fdicide[1010];//重新排名,取前fujias名 
bool cmp(node x,node y){
	if(x.sc!=y.sc) return x.sc>y.sc;
	if(x.jin!=y.jin) return x.jin>y.jin;
	if(x.w!=y.w) return x.w>y.w;
	if(x.wins!=y.wins) return x.wins>y.wins;
	if(abi[x.val]!=abi[y.val]) return abi[x.val]>abi[y.val];
	return x.val<y.val;
}
bool sea(int gus){
	for(int i=1;i<=3;i++) if(ran[i]==gus) return true;
	return false;
}
int m(string a,string b,int gr,int rod,int cha){
	jqmin.clear();jqd.clear();
	ascore=bscore=0;
	system("cls");
	cout<<char(gr+'A'-1)<<"组 第"<<rod<<"轮 第"<<cha<<"场"<<endl;
	cout<<a<<" VS "<<b;
	Sleep(1000);
	system("cls");
	int timemanager=0;
	int aabi=abi[ridx[a]],babi=abi[ridx[b]];
	int calat=-80*aabi+9000,calbt=-80*babi+9000;
	calat/=10,calbt/=10;
	while(timemanager<=5400){
		system("cls");
		cout<<timemanager/60<<":"<<timemanager%60<<endl;
		cout<<a<<" "<<ascore<<"-"<<bscore<<" "<<b<<endl;
		if(rand()%calat+1==1) ascore+=1,jqmin.push_back(timemanager/60),jqd[timemanager/60].push_back(a);
		if(rand()%calbt+1==1) bscore+=1,jqmin.push_back(timemanager/60),jqd[timemanager/60].push_back(b);
		if(timemanager==2700) cout<<"中场休息"<<endl;
		if(timemanager==2700) Sleep(3000);
		timemanager+=10;
		if(timemanager==2710) continue;
		for(int i=0;i<jqmin.size();i++){
			if(i>0){
				if(jqmin[i]==jqmin[i-1]) continue;
			}
			if(jqd[jqmin[i]].size()==1) cout<<jqmin[i]<<"' "<<jqd[jqmin[i]][0]<<"进球"<<endl;
			else{
				cout<<jqmin[i]<<"' "<<jqd[jqmin[i]][0]<<"进球"<<endl;
				cout<<jqmin[i]<<"' "<<jqd[jqmin[i]][1]<<"进球"<<endl;
			}
		}
	}
	system("cls");
	cout<<a<<"  "<<ascore<<" :"<<bscore<<"  "<<b<<endl;
	for(int i=0;i<jqmin.size();i++){
		if(i>0){
			if(jqmin[i]==jqmin[i-1]) continue;
		}
		if(jqd[jqmin[i]].size()==1) cout<<jqmin[i]<<"' "<<jqd[jqmin[i]][0]<<"进球"<<endl;
		else{
			cout<<jqmin[i]<<"' "<<jqd[jqmin[i]][0]<<"进球"<<endl;
			cout<<jqmin[i]<<"' "<<jqd[jqmin[i]][1]<<"进球"<<endl;
		}
	}
	Sleep(1000);
	if(ascore>bscore) return 1;
	if(ascore==bscore) return 0;
	if(ascore<bscore) return -1;
}
int n(string a,string b,int getin){
	system("cls");
	ascore=bscore=0;
	jqmin.clear();jqd.clear();
	if(getin>16) cout<<getin<<"强赛";
	else if(getin>=4) cout<<getin<<"分之一决赛";
	else if(getin==2) cout<<"半决赛";
	else if(getin==1) cout<<"决赛";
	else cout<<"铜牌争夺赛";
	cout<<endl;
	cout<<a<<" VS "<<b; 
	Sleep(2000);
	int timemanager=0;
	int aabi=abi[ridx[a]],babi=abi[ridx[b]];
	int calat=-80*aabi+9000,calbt=-80*babi+9000;
	calat/=10,calbt/=10;
	while(timemanager<=5400){
		system("cls");
		cout<<timemanager/60<<":"<<timemanager%60<<endl;
		cout<<a<<" "<<ascore<<"-"<<bscore<<" "<<b<<endl;
		if(rand()%calat+1==1) ascore+=1,jqmin.push_back(timemanager/60),jqd[timemanager/60].push_back(a);
		if(rand()%calbt+1==1) bscore+=1,jqmin.push_back(timemanager/60),jqd[timemanager/60].push_back(b);
		if(timemanager==2700) cout<<"中场休息"<<endl;
		if(timemanager==2700) Sleep(3000);
		timemanager+=10;
		if(timemanager==2710) continue;
		for(int i=0;i<jqmin.size();i++){
			if(i>0){
				if(jqmin[i]==jqmin[i-1]) continue;
			}
			if(jqd[jqmin[i]].size()==1) cout<<jqmin[i]<<"' "<<jqd[jqmin[i]][0]<<"进球"<<endl;
			else{
				cout<<jqmin[i]<<"' "<<jqd[jqmin[i]][0]<<"进球"<<endl;
				cout<<jqmin[i]<<"' "<<jqd[jqmin[i]][1]<<"进球"<<endl;
			}
		}
	}
	timemanager-=10;
	system("cls");
	cout<<"90:00"<<endl;
	cout<<a<<"  "<<ascore<<" :"<<bscore<<"  "<<b<<endl;
	if(ascore>bscore){
		Sleep(1000);
		return 1;
	}
	if(ascore<bscore){
		Sleep(1000);
		return -1;
	}
	cout<<"进入加时赛"<<endl;
	for(int i=0;i<jqmin.size();i++){
		if(i>0){
			if(jqmin[i]==jqmin[i-1]) continue;
		}
		if(jqd[jqmin[i]].size()==1) cout<<jqmin[i]<<"' "<<jqd[jqmin[i]][0]<<"进球"<<endl;
		else{
			cout<<jqmin[i]<<"' "<<jqd[jqmin[i]][0]<<"进球"<<endl;
			cout<<jqmin[i]<<"' "<<jqd[jqmin[i]][1]<<"进球"<<endl;
		}
	}
	Sleep(1000);
	while(timemanager<=7200){
		system("cls");
		cout<<timemanager/60<<":"<<timemanager%60<<endl;
		cout<<a<<" "<<ascore<<"-"<<bscore<<" "<<b<<endl;
		if(rand()%calat+1==1) ascore+=1,jqmin.push_back(timemanager/60),jqd[timemanager/60].push_back(a);
		if(rand()%calbt+1==1) bscore+=1,jqmin.push_back(timemanager/60),jqd[timemanager/60].push_back(b);
		if(timemanager==2700) cout<<"中场休息"<<endl;
		if(timemanager==2700) Sleep(3000);
		timemanager+=10;
		if(timemanager==2710) continue;
		for(int i=0;i<jqmin.size();i++){
			if(i>0){
				if(jqmin[i]==jqmin[i-1]) continue;
			}
			if(jqd[jqmin[i]].size()==1) cout<<jqmin[i]<<"' "<<jqd[jqmin[i]][0]<<"进球"<<endl;
			else{
				cout<<jqmin[i]<<"' "<<jqd[jqmin[i]][0]<<"进球"<<endl;
				cout<<jqmin[i]<<"' "<<jqd[jqmin[i]][1]<<"进球"<<endl;
			}
		}
	}
	cout<<"120:00"<<endl;
	cout<<a<<"  "<<ascore<<" :"<<bscore<<"  "<<b<<endl;
	if(ascore>bscore){
		Sleep(1000);
		return 1;
	}
	if(ascore<bscore){
		Sleep(1000);
		return -1;
	}
	cout<<"进入点球大战"<<endl;
	for(int i=0;i<jqmin.size();i++){
		if(i>0){
			if(jqmin[i]==jqmin[i-1]) continue;
		}
		if(jqd[jqmin[i]].size()==1) cout<<jqmin[i]<<"' "<<jqd[jqmin[i]][0]<<"进球"<<endl;
		else{
			cout<<jqmin[i]<<"' "<<jqd[jqmin[i]][0]<<"进球"<<endl;
			cout<<jqmin[i]<<"' "<<jqd[jqmin[i]][1]<<"进球"<<endl;
		}
	}
	Sleep(1000);
	system("cls");
	int adscore=0,bdscore=0,dqround=1;
	while(dqround<=5||(dqround>5&&adscore==bdscore)){
		cout<<"点球大战"<<endl;
		cout<<a<<" "<<adscore<<"-"<<bdscore<<" "<<b<<endl;
		cout<<a<<"第"<<dqround<<"轮点球"<<endl;
		Sleep(1000);
		bool jqyft=false;
		if((rand()%calat+1)>=(calbt/2)) jqyft=true;
		else jqyft=false;
		if(jqyft==true) cout<<"球进了!"<<endl,adscore+=1;
		else cout<<"球没进……"<<endl;
		Sleep(1000); 
		system("cls");
		cout<<"点球大战"<<endl;
		cout<<a<<" "<<adscore<<"-"<<bdscore<<" "<<b<<endl;
		cout<<b<<"第"<<dqround<<"轮点球"<<endl;
		Sleep(1000);
		if(rand()%calbt+1>=calat/2) jqyft=true;
		else jqyft=false;
		if(jqyft==true) cout<<"球进了!"<<endl,bdscore+=1;
		else cout<<"球没进……"<<endl;
		Sleep(1000); 
		system("cls");
		dqround+=1; 
	}
	cout<<a<<"  "<<ascore+adscore<<" :"<<bscore+bdscore<<"  "<<b<<endl;
	Sleep(3000);
	if(ascore+adscore>bscore+bdscore) return 1;
	if(ascore+adscore<bscore+bdscore) return -1;
}
bool cal(){
	int sum=groups*ineach;
	int infinal,pows;
	for(int i=1;;i++){
		if(pow(2,i)>sum){
			infinal=pow(2,i-1);
			pows=i-1;
			break;
		}
	}
	while(pows>=0){
		infinal=pow(2,pows);
		int rests=sum-infinal;
		outline=infinal/groups;
		if(outline>ineach){
			outline=0;
			pows-=1;
			continue;
		}
		int jiashu=1;
		while((outline+jiashu)*groups<infinal) jiashu+=1;
		fujia=jiashu+outline;
		fujias=infinal-outline*groups;
		if(fujia>ineach){
			outline=fujia=fujias=0;
			pows-=1;
			continue;
		}
		infinals=infinal;
		return true;
	}
	return false;
}
void divide(){
	int gp;
	for(int i=1;i<=groups*ineach;i++){
		gp=rand()%groups+1;
		while(gt[gp]==ineach) gp=rand()%groups+1;
		g[gp][++gt[gp]].val=i;
	}
	for(int i=1;i<=groups;i++) sort(g[i]+1,g[i]+gt[i]+1,cmp);
}
void labang(int gr){
	system("cls");
	cout<<char(gr+'A'-1)<<"组积分榜:";
	for(int i=1;i<=gt[gr];i++) xrank[i]=g[gr][i];
	sort(xrank+1,xrank+gt[gr]+1,cmp);
	for(int i=1;i<=gt[gr];i++){
		if(i<=outline) cout<<GREEN;
		else if(i<=fujia&&fujias!=0) cout<<YELLOW;
		else cout<<RED;
		cout<<endl;
		cout<<i<<". "<<idx[xrank[i].val]<<"(abi="<<abi[xrank[i].val]<<")    ";
		cout<<xrank[i].w<<"/"<<xrank[i].p<<"/"<<xrank[i].l<<"   "<<xrank[i].sc<<"   "<<xrank[i].wins<<"/"<<xrank[i].loses<<"   净:"<<xrank[i].jin;
	}
	cout<<RESET;
	cout<<endl;
	cout<<"排行榜说明(示例):";
	cout<<endl<<"排名. 队名   胜/平/负  积分   进球/失球   净:净胜球"<<endl;
	cout<<endl<<"排名规则:"<<endl;
	cout<<"1.积分高者名次列前\n2.积分相同的,净胜球高者名次列前\n3.净胜球相同的,总胜利场次多者名次列前\n";
	cout<<"4.总胜利场次多的,总进球数多者名次列前\n5.总进球数相同的,能力值高者名次列前\n6.以上各项均相同的,按输入顺序决定排名。\n";
	cout<<"颜色意义:\n绿色-晋级;黄色-晋级待定;红色-淘汰。\n";
	cout<<endl<<endl<<"看完";
	system("pause");
}
void lafujiabang(){
	for(int i=1;i<=jinf.size();i++){
		if(i<=fujias) cout<<GREEN;
		else cout<<RED;
		cout<<endl;
		cout<<i<<". "<<idx[fdicide[i].val]<<"(abi="<<abi[fdicide[i].val]<<")    ";
		cout<<fdicide[i].w<<"/"<<fdicide[i].p<<"/"<<fdicide[i].l<<"   "<<fdicide[i].sc<<"   "<<fdicide[i].wins<<"/"<<fdicide[i].loses<<"   净:"<<fdicide[i].jin;		
	}
	cout<<RESET;
	cout<<endl;
	cout<<"排行榜说明(示例):";
	cout<<endl<<"排名. 队名   胜/平/负  积分   进球/失球   净:净胜球"<<endl;
	cout<<endl<<"排名规则:"<<endl;
	cout<<"1.积分高者名次列前\n2.积分相同的,净胜球高者名次列前\n3.净胜球相同的,总胜利场次多者名次列前\n";
	cout<<"4.总胜利场次多的,总进球数多者名次列前\n5.总进球数相同的,能力值高者名次列前\n6.以上各项均相同的,按输入顺序决定排名。\n";
	cout<<"颜色意义:\n绿色-晋级;红色-淘汰。\n";
	cout<<endl<<endl<<"看完";
	system("pause");
}
void lianmatch(){
	for(int agst=1;agst<ineach;agst++){
		for(int i=1;i<=groups;i++){
			for(int j=1;j<=ineach;j++){
				int zhu=j,ke=j+agst;
				if(ke>ineach) ke-=ineach;
				int finally=m(idx[g[i][zhu].val],idx[g[i][ke].val],i,agst,j);
				if(finally==1) g[i][zhu].sc+=3,g[i][zhu].w+=1,g[i][ke].l+=1;
				if(finally==0) g[i][zhu].sc+=1,g[i][ke].sc+=1,g[i][zhu].p+=1,g[i][ke].p+=1;
				if(finally==-1) g[i][ke].sc+=3,g[i][zhu].l+=1,g[i][ke].w+=1;
				g[i][zhu].wins+=ascore,g[i][zhu].loses+=bscore;
				g[i][ke].wins+=bscore,g[i][ke].loses+=ascore;
				g[i][zhu].jin=g[i][zhu].wins-g[i][zhu].loses;
				g[i][ke].jin=g[i][ke].wins-g[i][ke].loses;
			}
			labang(i);
		}
	}
	system("cls");
	cout<<"最终排行榜揭晓——";
	cout<<"\n(绿色晋级淘汰赛,黄色晋级待定,红色淘汰)\n";
	system("pause");
	for(int i=1;i<=groups;i++){
		labang(i);
	}
}
void pttt(){
	int endlt=0;
	for(int i=1;i<=infinals;i++){
		if(ytt[i].alive==1) cout<<RESET;
		else if(ytt[i].alive==0) cout<<RED;
		else cout<<YELLOW;
		cout<<idx[ytt[i].val]<<"(abi="<<abi[ytt[i].val]<<")"<<endl;
		if(i%(infinals/alives*2)==0) cout<<endl;
		if(i==(infinals/2)) cout<<endl;
	}
	cout<<RESET;
}
void finalmatch(){	
	while(alives>1){
		memset(vis,false,sizeof vis);
		for(int i=1;i<=infinals;i++){
			if(ytt[i].alive!=1) continue;
			if(vis[ytt[i].val]) continue;
			int zhu=i,ke;
			for(int j=i+1;j<=infinals;j++){
				if(ytt[j].alive==1){
					vis[ytt[j].val]=true;
					ke=j;
					break;
				}
			}
			int res=n(idx[ytt[zhu].val],idx[ytt[ke].val],alives/2);
			int loser,winnner;//不小心多打了一个n 
			if(res==1) loser=ke,winnner=zhu;
			else loser=zhu,winnner=ke;
			if(alives==4){
				if(tp[1]==0) tp[1]=ytt[loser].val;
				else tp[2]=ytt[loser].val;
				ytt[loser].alive=2;
			}
			else if(alives==2){
				winners[1]=ytt[winnner].val;
				winners[2]=ytt[loser].val;
				ytt[loser].alive=0;
			}
			else ytt[loser].alive=0;
			system("cls");
			pttt();
			Sleep(2000); 
			system("cls"); 
		}
		alives/=2;
		system("cls");
		pttt();
		cout<<endl<<"看完";
		system("pause"); 
	}
}
void tpzds(){
	int res=n(idx[tp[1]],idx[tp[2]],-1);
	if(res==1) winners[3]=tp[1];
	else winners[3]=tp[2];
}
void rmain(){
	cout<<"组数:";cin>>groups;
	cout<<"每组队伍数:";cin>>ineach;
	cout<<"请选择各队伍能力值设定模式(1:随机 2:自定义) :";
	int temporaryval=0;
	cin>>temporaryval;
	if(temporaryval==1){
		cout<<"请指定能力值随机范围的下界和上界(1~100,顺序先下界后上界,用空格隔开):";
		int abimax,abimin;
		cin>>abimin>>abimax;
		cout<<endl;
		system("cls");
		cout<<"请输入"<<groups*ineach<<"支队伍的名字:"<<endl;
		for(int i=1;i<=groups*ineach;i++){
			string hahaha;cin>>hahaha;
			idx[i]=hahaha;
			ridx[hahaha]=i;
		}
		for(int i=1;i<=groups*ineach;i++) abi[i]=rand()%(abimax-abimin+1)+abimin;
	}
	else{
		system("cls");
		cout<<"请输入"<<groups*ineach<<"支队伍的名字及其能力值(1~100),用空格隔开:"<<endl;
		for(int i=1;i<=groups*ineach;i++){
			string hahaha;cin>>hahaha>>temporaryval;
			idx[i]=hahaha;
			ridx[hahaha]=i;
			abi[i]=temporaryval;
		}
	}
	system("cls");
	cout<<"正在规划合理的小组赛方案……";
	Sleep(500);
	bool flag=cal();
	if(flag==false){
		cout<<endl<<"无合理的小组赛方案!";
		return ;
	}
	gt[0]=(fujia-outline)*groups;
	system("cls");
	cout<<endl<<"本次联赛共"<<groups<<"组,每组"<<ineach<<"队";
	cout<<endl<<"淘汰赛共"<<outline*groups+fujias<<"席名额";
	cout<<endl<<"每组前"<<outline<<"名晋级淘汰赛";
	if(fujias){
		cout<<",每组第"<<outline+1<<"名";
		if(fujia-outline>1) cout<<"至第"<<fujia<<"名";
		cout<<"中表现最好的"<<fujias<<"支队伍晋级淘汰赛"; 
	}
	cout<<endl<<endl<<"看完";
	system("pause");//非常巧妙的衔接,简直是鬼斧神工! 
	system("cls");
	cout<<"正在分组……(分组完全随机,组内初始顺序按能力值大小排序)";
	Sleep(1000);
	divide(); 
	for(int i=1;i<=groups;i++){
		system("cls");
		cout<<char(i+'A'-1)<<"组:"<<endl;
		for(int j=1;j<=ineach;j++) cout<<j<<". "<<idx[g[i][j].val]<<"(abi="<<abi[g[i][j].val]<<")"<<endl;
		cout<<endl<<endl<<"看完";
		system("pause");
	}
	//接下来的时间交给比赛程序! 
	lianmatch();
	for(int i=1;i<=groups;i++) sort(g[i]+1,g[i]+ineach+1,cmp);
	for(int gg=1;gg<=groups;gg++){
		for(int i=1;i<=outline;i++){
			int wz=rand()%infinals+1;
			while(tt[wz]>0) wz=rand()%infinals+1;
			tt[wz]=g[gg][i].val;
		} 
		if(fujias==0) continue;
		for(int i=outline+1;i<=fujia;i++) jinf.push_back(g[gg][i]);
	}
	for(int i=0;i<jinf.size();i++) fdicide[i+1]=jinf[i];
	sort(fdicide+1,fdicide+groups*(fujia-outline)+1,cmp);
	if(fujias!=0){
		system("cls");
		cout<<"晋级待定球队表现排行榜:"<<endl;
		lafujiabang();
		cout<<endl<<endl<<"看完";
		system("pause");
		for(int i=1;i<=fujias;i++){
			int wz=rand()%infinals+1;
			while(tt[wz]!=0) wz=rand()%infinals+1;
			tt[wz]=fdicide[i].val;
		} 
	} 
	ttt=infinals;
	for(int i=1;i<=infinals;i++) ytt[i].val=tt[i],ytt[i].alive=1;
	system("cls");
	cout<<"正在抽签决定淘汰赛分区……";
	Sleep(1000);
	system("cls");
	alives=infinals;
	cout<<"淘汰赛名单:"<<endl;
	pttt();
	cout<<endl<<"看完";
	system("pause");
	finalmatch();
	idx[0]="无";
	if(infinals>2) tpzds();
	system("cls");
	cout<<"获奖信息:"<<endl;
	cout<<GOLD<<"冠军:"<<idx[winners[1]]<<endl;
	cout<<RESET<<"亚军:"<<idx[winners[2]]<<endl;
	cout<<"\033[0;33m"<<"季军:"<<idx[winners[3]]<<endl;
	cout<<RESET;
	system("pause");
}
int main(){
	srand(time(NULL));
	rmain();
}

叁 · 善后说明

警告

输入的能力值最好在规定范围内,如果一定要超出范围,那么最高不能超过112,否则会导致rand()函数对负数取模,引发错误。

不能只输入一支球队,否则冠、亚、季将都为空

不建议输入球队数量过少或过多,影响体验;

运行效果(共10张图)

更多推荐