怒敲520行代码!只为模拟一场“家里的世界杯”(C++编程模拟足球比赛)
·
壹 · 解释说明
创作声明
本代码纯手搓,没有借助任何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张图)










更多推荐
所有评论(0)