Program generujący terminarz piłkarski na podstawie podanych drużyn

0

Witam,
mam za zadanie zrobić generator w javascript. Na podstawie podanych drużyn w tabeli, ma wygenerować terminarz rozgrywek. Wiadomo drużyny nie mogą się powtarzać podczas kolejki oraz jedna drużyna może rozegrać tylko jeden mecz z każdą. Skrypt działa przy 4 drużynach, natomiast jeżeli dodamy do tego chociaż dwie to zawiesza całą strone.

HTML:

<!DOCTYPE html>
<html lang="pl">
<head>
    <meta charset="utf-8">
    <link href='http://fonts.googleapis.com/css?family=Open+Sans' rel='stylesheet' type='text/css'>
    <meta name="viewport" content="width=device-width">
    <script src="js/jquery.js"></script>
    <script src="js/jquery.min.js"></script>
    <link rel="stylesheet" href="main.css">
</head>
<body>
<div class="main">
    <div class="team-list">
    </div>
    <div class="shuffle-team">
        <div class="stage">
        </div>
    </div>
    <div class="testy"></div>
</div>
<script src="js/main.js"></script>
</body>
</html>

CSS:

html, body {
    margin: 0;
    padding: 0;
}

body {
    width: 100%;
}

.main {
    width: 100%;
    margin: auto;
    text-align: center;
}

.main .team-list {
    padding: 10px;
    box-sizing: border-box;
    background: #CCFFFF;
    display: flex;
    justify-content: space-around;
    flex-wrap: nowrap;
}

.main .team-list p {
    padding: 10px;
    background: #336666;
    color: white;
    font-weight: bold;
}

.main .shuffle-team {
    background: #CCFFFF;
    padding: 10px;
}

.main .shuffle-team .number-of-stage {
    font-size: 18px;
    font-weight: bold;
    border-bottom: 2px solid black;
}

.main .shuffle-team .stage-team {
    background: #336666;
    padding: 10px;
    color: white;

}

JS:

$(document).ready(function() { 
   var team = Array('a', 'b', 'c', 'd'),
       block_shuffle_team = $('.main .shuffle-team .stage'),
       block_team_list = $('.main .team-list'),
       count_team = team.length,
       count_stage = count_team - 1,
       count_match_in_stage = count_team / 2,
       id_team = 0,
       id_home = 0,
       alert_ok = 0,
       teams = [],
       stage = [];

      function losowanie(max, min) {
         return Math.floor( Math.random() * ( max - min + 1 ) + min );
     }
     
    function shuffle_team() {
        for(var i=0; i<count_team; i++) {
            block_team_list.append('<p>' + team[i] + '</p>');  // wypisanie nazw drużyn
            teams[i] = [i]; 
        }
    
        for(var j=1; j<=count_stage; j++) {
            stage[j] = [j];   
        }
        for(var k=1; k<=count_stage; k++) {
            for(var i=0; i<count_team; i++) {
                alert_ok = 0;
                if((i % 2) == 0) { // sprawdzenie czy losujemy id gospodarza czy gościa
                      do {
                        id_team = losowanie(count_team - 1, 0);  // losowanie
                            if(stage[k].indexOf(team[id_team]) === -1) { // sprawdzenie czy w danej kolejce znajduje się drużyna
                                stage[k][i] = team[id_team];   // przypisanie do danej kolejki drużyny   
                                alert_ok = 1;
                                id_home = id_team;
                            } else {
                                alert_ok = 0;
                            }
                     } while (alert_ok == 0);
                } else { // losowanie gościa
                alert_ok = 0;
                    do {
                        id_team = losowanie(count_team - 1, 0); // losowanie
                            if((stage[k].indexOf(team[id_team]) === -1) && (teams[id_home].indexOf(team[id_team]) === -1) ) { // sprawdzenie czy dany zespół został wylosowany w tej kolejce i czy grał już wcześniej z gospodarzem
                                    stage[k][i] = team[id_team];
                                    teams[id_team][k] = team[id_home]; // przypisujemy do gosci przeciwnika
                                    teams[id_home][k] = team[id_team]; // przypisujemy do gospodarzy przeciwnika
                                    alert_ok = 1;
                            } else {
                                alert_ok = 0;
                            }
                    } while (alert_ok == 0);
                } // if 
            } // for
        } // for
        
          for(var i=1; i<=count_stage; i++) {
            block_shuffle_team.append('<p class="number-of-stage">' + i + '</p>');
            var id = 0;
                for(var j=0; j<count_match_in_stage; j++) {
                    block_shuffle_team.append('<p class="stage-team">' + stage[i][id] + ' : ' + stage[i][id + 1] + '</p>');
                     id = id + 2;
                }
        }
    } // end function
    
    shuffle_team();
});

Skrypt polega na tym, że losuje cyfrę z podanego przedziału i jest ona numerem id drużyny. Następnie sprawdza czy w danej kolejce (tabeli stage) już nie występuje nazwa wylosowanej drużyny, jeżeli nie to przypisuje do niej daną wartość. Następnie losuje gościa. Najpierw sprawdza tak samo jak poprzednio tabele stage i później sprawdza tabele teams czy nie występuje w niej wartość przeciwnika. Czyli tabele po przejściu skryptu wyglądają tak:
tabela stage:
stage[0]: c,d,a,b
stage[1]: d,b,c,a
stage[2]: b,c,d,a
tabela teams:
teams[0]: 0,c,b,d
teams[1]: 1,d,a,c
teams[2]: 2,a,d,b
teams[3]: 3,b,c,a

Przy większej ilości drużyn tak jak pisałem zwiesza się strona. Prawdopodobnie tutaj się coś nie zgadza, ale nie mogę tego naprawić.

 if((stage[k].indexOf(team[id_team]) === -1) && (teams[id_home].indexOf(team[id_team]) === -1) ) { // sprawdzenie czy dany zespół został wylosowany w tej kolejce i czy grał już wcześniej z gospodarzem
                                    stage[k][i] = team[id_team];
                                    teams[id_team][k] = team[id_home]; // przypisujemy do gosci przeciwnika
                                    teams[id_home][k] = team[id_team]; // przypisujemy do gospodarzy przeciwnika
                                    alert_ok = 1;
                            } else {
                                alert_ok = 0;
                            }

Jak macie pomysł jak to naprawić to byłbym wdzięczny, ewentualnie może podsuniecie zupełnie inne podejście do skryptu.
Dopiero się ucze js, więc prosiłbym o wyrozumiałość :)

0

Wstaw to na plunkera albo codepen.

0

Lokalnie mi ten skrypt działa tak jak mówiłem przy wpisaniu maksymalnie 4 drużyn, natomiast tutaj nie działa on w ogóle.
https://codepen.io/anon/pen/brvbYb

1

Tu jest przeklejony twój program na codepen https://codepen.io/anon/pen/prLEZB I po prostu zapętla ci się program na tym do while.
A tu jest rozwiązanie: [PHP]Losowanie pary liczb bez powtorzen wystarczy przeklepać na js.

0

Dziękuje Ci bardzo za pomoc :)
Tak, zauważyłem, że zacina się na drugiej pętli do while. Po wprowadzeniu limitu wykonań pętli, raz przejdzie bez błędów, a raz z błędami, czyli nie wykona się skrypt. Kod, który podałeś działa poprawnie, ale chciałbym się dowiedzieć, dlaczego mój zawiesza się na tej pętli, gdy dodam więcej niż 4 elementy tablicy. Miał ktoś kiedyś taką sytuacje?

1 użytkowników online, w tym zalogowanych: 0, gości: 1