Advertisement
Norbi930523

bajnokság-generátor

Apr 18th, 2013
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.61 KB | None | 0 0
  1. #include <iostream>
  2. #include <time.h>
  3. #include <string>
  4. #include <cstdlib>
  5. using namespace std;
  6.  
  7.  
  8. bool check(int csapatindex,int *jatszik){
  9.     bool jatek=0;
  10.     for(int i=0;i<16;i++){
  11.         if(csapatindex == *(jatszik+i)){
  12.             jatek=1;
  13.         }
  14.     }
  15.    
  16.     return jatek;
  17. }
  18.  
  19. bool sorsol(bool kereszt[16][16],int *jatszik,char *argv[],int *lehetseges,int meccs,bool tavaszi){
  20.     int csapat1index,csapat2index,i,j=0,lehet_index;
  21.     bool hazai; int osszeg=0;
  22.     do{
  23.         csapat1index=(rand()%16)+1;         //sorsolunk egy csapatot
  24.     }while(check(csapat1index,jatszik));    //megnézzük, hogy játszik-e az adott csapat
  25.  
  26.     hazai=rand()%2;     //eldöntjük, hogy Csapat 1 hazai pályán játsszon-e
  27.  
  28.     switch(tavaszi){        //őszi-tavaszi szezontól függően változik a csapatválasztás kritériuma
  29.         case 0:{
  30.             for(i=0;i<16;i++){ //megvizsgáljuk az összes csapatot, ősszel a kereszttáblában hazai + idegenbeli meccsnél is 1-1-nek kell lenni
  31.                 if((kereszt[csapat1index-1][i]==1)&&(kereszt[i][csapat1index-1]==1)&&!(check(i+1,jatszik))){
  32.                     *(lehetseges+j)=i+1; //ha megfelel a kritériumoknak, lehetséges ellenfél
  33.                     j++;
  34.                 }
  35.             }break;
  36.         }
  37.         case 1:{
  38.             for(i=0;i<16;i++){                      //ősszel már játszott valahogy a két csapat, így kereszt: 1-0 v. 0-1
  39.                 if(((kereszt[csapat1index-1][i]==1)&&(kereszt[i][csapat1index-1]==0)||(kereszt[csapat1index-1][i]==0)&&
  40.                     (kereszt[i][csapat1index-1]==1))&&!(check(i+1,jatszik))){
  41.                     *(lehetseges+j)=i+1;
  42.                         j++;
  43.                 }
  44.             }break;
  45.         }
  46.     }
  47.  
  48.  
  49.     for(i=0;i<16;i++){
  50.         osszeg+=*(lehetseges+i); //ha nincs lehetséges ellenfél, az összeg 0 lesz
  51.     }
  52.     if(osszeg==0) return 1; //ekkor újrasorsoljuk a fordulót
  53.    
  54.  
  55.     do{
  56.         lehet_index=rand()%j;
  57.         csapat2index=*(lehetseges+lehet_index); //a lehetséges csapatok közül választunk egyet
  58.     }while(check(csapat2index,jatszik));
  59.  
  60.     if(tavaszi){    //tavasszal visszavágókat játszanak, negáljuk a hazai 'státuszt'
  61.         if(hazai && (kereszt[csapat1index-1][csapat2index-1]==0)) hazai=0;
  62.         else if(!hazai && (kereszt[csapat2index-1][csapat1index-1]==0)) hazai=1;
  63.     }
  64.  
  65.     if(hazai){
  66.         *(jatszik+meccs)=csapat1index;
  67.         *(jatszik+meccs+1)=csapat2index;
  68.     }                                       //a csapatok sorrendje buffernél, és ezzel a kiíratásnál számít
  69.     else{
  70.         *(jatszik+meccs)=csapat2index;
  71.         *(jatszik+meccs+1)=csapat1index;
  72.     }
  73.  
  74.  
  75.     for(i=0;i<16;i++)
  76.         *(lehetseges+i)=0;
  77.  
  78.     return 0;
  79. }
  80.  
  81.  
  82. void init(bool kereszt[16][16]){
  83.     int i,j;
  84.     for(i=0;i<16;i++)
  85.         for(j=0;j<16;j++)
  86.             kereszt[i][j]=1;
  87.  
  88.     for(i=0,j=0;i<16;i++,j++)
  89.         kereszt[i][j]=0;
  90.  
  91. }
  92.  
  93. void init2(int *jatszik,int *lehetseges){
  94.     for(int i=0;i<16;i++){
  95.         *(jatszik+i)=0;
  96.         *(lehetseges+i)=0;
  97.     }
  98.    
  99. }
  100.  
  101. void edit_kereszt(bool kereszt[16][16],int *jatszik){
  102.     for(int i=1;i<=16;){
  103.         kereszt[*(jatszik+i-1)-1][*(jatszik+i)-1]=0;
  104.         i+=2;
  105.     }
  106.  
  107. }
  108.  
  109. void bufferel(int *buffer,int *jatszik,int start,int max){
  110.     for(int i=0;start<max;start++,i++){
  111.         *(buffer+start)=*(jatszik+i);
  112.     }
  113. }
  114.  
  115. void kiirat(int *buffer,char *argv[]){
  116.     int j=0;
  117.     int i;
  118.     for(i=1;i<=30;i++){
  119.         cout << i << ". forduló\n";
  120.         for(;j<i*16;){
  121.             cout << argv[*(buffer+j)] << " - " << argv[*(buffer+j+1)] << endl;
  122.             j+=2;
  123.         }
  124.         cout << endl;
  125.     }
  126. }
  127.  
  128. int main(int argc,char *argv[]){
  129.     srand(time(NULL));
  130.    
  131.     megszakit:
  132.     int i,j,k,meccs=0;
  133.     int *lehetseges=new int [16];   //egy csapat lehetséges ellenfelei
  134.     int *jatszik=new int [16];      //itt tároljuk azokat a csapatokat, melyek már játszanak az adott fordulóban
  135.     int *buffer=new int[480];
  136.     bool kereszt[16][16],tavaszi=0;
  137.  
  138.     init(kereszt); //kereszttáblázat inicializálása
  139.  
  140.     init2(jatszik,lehetseges);
  141.  
  142.     int counter=0;
  143.  
  144.     for(i=1;i<=30;i++){
  145.    
  146.         counter=0;
  147.         if(i>15) tavaszi=1; //a 16. fordulótól tavaszi szezon
  148.  
  149.         for(j=0;j<8;){
  150.            
  151.             if(sorsol(kereszt,jatszik,argv,lehetseges,meccs,tavaszi)){
  152.                 init2(jatszik,lehetseges);
  153.                 j=0; meccs=0;
  154.                 counter++;
  155.                 if(counter==1000){              //tetszőleges küszöb, ha 1000x nem talált lehetséges ellenfelet a prog., akkor valószínűleg
  156.                     delete[] buffer;            //úgy jött ki a sorsolás, hogy nincs is
  157.                     delete[] lehetseges;
  158.                     delete[] jatszik;
  159.                     goto megszakit;
  160.                 }
  161.  
  162.                 continue;
  163.             }
  164.  
  165.             j++;
  166.  
  167.             meccs+=2;
  168.  
  169.         }
  170.  
  171.         edit_kereszt(kereszt,jatszik);              //a kereszttáblázatba beírjuk a 0-kat, azaz, hogy kivel nem játszhat már egy csapat
  172.         bufferel(buffer,jatszik,(i-1)*16,i*16);    
  173.  
  174.         for(k=0;k<16;k++){
  175.             *(jatszik+k)=0;
  176.         }
  177.  
  178.         meccs=0;
  179.  
  180.     }
  181.  
  182.     kiirat(buffer,argv);
  183.  
  184.     /*Kereszttáblázat mátrix:
  185.     for(i=0;i<16;i++){
  186.         for(j=0;j<16;j++){
  187.             cout << kereszt[i][j] << " ";
  188.         }
  189.         cout << endl;
  190.     }*/
  191.  
  192.     delete[] buffer;
  193.     delete[] lehetseges;
  194.     delete[] jatszik;
  195.     return 0;
  196. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement