Elikäs näin alkuun ajatuksena olisi luoda turnauksen lohkovaiheeseen sarjataulukko. Tai pikemminkin sarjataulukot, Lohko kohtainen, ja sellainen kokonaisvaltainen, jossa on kaikki joukkueet.
Itselläni ei ole oikein ajatusta, että miten tätä projektia lähtisin purkamaan, joten pyytäisin teiltä hieman vinkkejä tämän projektin aloittamiseen.
Lähtö tiedot ovat alla mainitun kaltaiset. Jokaisessa lohkossa pelataan tiettymäärä pelejä, joista kerätään pisteitä (Voitto 2p, Tasapeli 1p ja Tappio 0p). Tasapiste tilanteessa pelaajan sija ratkaistaan eri ennalta määrätyllä kaavalla.
<?php /* Lohkojärjestyksien määrityksessä vastaavat järjestyksessä seuraavat asiat: 1. pisteet (Pistettä / Ottelu?) 2. keskinäiset ottelut 3. maaliero 4. tehdyt maalit 5. uusintaottelu (Sijoitus suhteessa rankingiin) 6. arpa. */ #### DB #### $players = array( /* 0 = TID (Team ID) 1 = PID (Player ID) * Muunnetaan myöhemmin 2 = TNR (Team number) 3 = ? */ "131101|Player 1|15|", "132102|Player 2|8|", "133103|Player 3|4|", "134104|Player 4|3|", "135105|Player 5|2|", "136106|Player 6|1|", "131207|Player 7|7|", "132208|Player 8|14|", "133209|Player 9|21|", "134210|Player 10|10|", "135211|Player 11|26|", "136212|Player 12|17|", "131313|Player 13|11|", "132314|Player 14|6|", "133315|Player 15|13|", "134316|Player 16|9|", "135317|Player 17|12|", "136318|Player 18|18|", "131419|Player 19|25|", "132420|Player 20|16|", "133421|Player 21|19|", "134422|Player 22|20|", "135423|Player 23|24|", "136424|Player 24|5|" ); $games = array( /* 0 = GID (Game ID) 1 = Home TID (Team ID) * Muunnetaan myöhemmin 2 = Away TID (Team ID) * Muunnetaan myöhemmin 3 = Home score 4 = Away score 5 = OT (Boolean, 0/1) */ # Lohko A "13010011|Player 1|Player 7|12|0|0", "13070012|Player 13|Player 19|3|2|1", "13130013|Player 19|Player 7|2|1|0", "13190014|Player 13|Player 1|0|2|0", "13250015|Player 1|Player 19|12|2|0", "13310016|Player 7|Player 13|3|8|0", # Lohko B "13020021|Player 2|Player 20|10|2|0", "13080022|Player 8|Player 14|3|0|0", "13140023|Player 20|Player 8|0|4|0", "13200024|Player 14|Player 2|0|5|0", "13260025|Player 8|Player 2|3|7|0", "13320026|Player 14|Player 20|0|2|0", # Lohko C "13030031|Player 21|Player 9|7|0|0", "13090032|Player 3|Player 15|0|5|0", "13150033|Player 9|Player 3|2|5|0", "13210034|Player 15|Player 21|5|1|0", "13270035|Player 21|Player 3|9|2|0", "13330036|Player 9|Player 15|0|6|0", # Lohko D "13040041|Player 10|Player 4|0|13|0", "13100042|Player 22|Player 10|1|0|0", "13160043|Player 16|Player 22|3|3|1", "13220044|Player 4|Player 22|5|0|0", "13280045|Player 16|Player 4|2|3|1", "13340046|Player 10|Player 16|4|5|0", # Lohko E "13050051|Player 11|Player 5|3|5|0", "13110052|Player 23|Player 17|1|3|0", "13170053|Player 11||Player 23|1|4|0", "13230054|Player 5|Player 17|3|2|0", "13290055|Player 23|Player 5|2|5|0", "13350056|Player 17|Player 11|5|4|0", # Lohko F "13060061|Player 24|Player 12|3|2|1", "13120062|Player 6|Player 18|9|0|0", "13180063|Player 6|Player 24|10|0|0", "13240064|Player 18|Player 12|2|3|0", "13300065|Player 24|Player 18|2|1|0", "13360066|Player 12|Player 6|0|6|0" ); ?>
Edit.
Varmaankin olis hyvä luoda jokin kaksi ulotteinen taulukko, johon keräisi jokaiselta pelaajalta tietyt statsit:
- Ottelumäärä
- Voitot
- Tasapelit
- Häviöt
- Tehdytmaalit
- Päästetyt maalit
- Pisteet
ehkä jotenkin vertailla tuloksia tuon taulukon avulla, jos se vain onnistuu..
Vai olisiko tähän muunkin laisia ratkaisuja?
Parisen versiota erilaisista sarjataulukoista vääntäneenä tekisin suoraan tietokannan päälle, jolloin sinne saa paljon enemmän dataa sotkematta koko soppaa.
Itsellä tosiaan oli joukkueille oma taulu, jossa oli ihan (yksilöidä id), pelatut ottelut, pisteet, tehdyt maalit, päästetyt yms. yms.
Sama pelaajilla: yksilöivä id, joukkueen id, pelatut ottelut, maalit, syötöt yms. yms.
Sen lisäksi oli ottelutaulu, jossa oli ottelun id, sille kotijoukkue, vierasjoukkue, oliko ottelu jo pelattu, ottelun tulos (kotimaalit, vierasmaalit) sekä ottelun ajankohta (päivämäärä/kello).
Neljäntenä tuli "pistetaulut", jossa oli ottelun id, maalintekijän id, parin syöttäjän id, ja pisteen tekohetki (aika).
Sinulla voisi olla vielä viidentenä tauluna lohko, johon joukkueissa olisi viittaukset.
Kun editorilla lisättiin maalintekijöitä yksitellen ajax-tekniikkaa hienosti hyödyntäen, ja lopuksi julkaistiin itse ottelu, laski järjestelmä tuon pistetaulun perusteella jokaiselle ottelulle ottelutauluun lopputulosten maalit, pistepörssiin pelaajien pisteet ja lisäksi joukkueiden sijoitukset ja pisteet.
Vaikkei tietokanta mahdollistakaan periaatteessa sinun tekeleestäsi verrattuna mitään sen kummempia, niin tietokannalla tuo tosiaan onnistuu pajon yksinkertaisemmin, kun yksinkertaisilla kyselyillä saadaan datasta poimittua vain tarvittavat tiedot, eikä datan tarvitse olla tuollaisena "isona könttinä".
Vaikka projektini saattaakin olla hieman erilainen, eikä lähdekoodeja ole tarjolla, niin toivon, että näistä kuvakaappauksista on jotain hyötyä ja herättävät esim. jotain ideoita.
https://dl.dropboxusercontent.com/u/62178918/
https://dl.dropboxusercontent.com/u/62178918/
https://dl.dropboxusercontent.com/u/62178918/
https://dl.dropboxusercontent.com/u/62178918/
https://dl.dropboxusercontent.com/u/62178918/
https://dl.dropboxusercontent.com/u/62178918/
https://dl.dropboxusercontent.com/u/62178918/
https://dl.dropboxusercontent.com/u/62178918/
https://dl.dropboxusercontent.com/u/62178918/
Itse en ole tietokantoja vielä kauheemmin kokeillut, joten tästä syystä olen pysytelly itselleni tutummassa ratkaisussa..
Tässä tapauksessa Pelaajat ja joukkue on periaatteessa samaa.. Sillä kyse on videopeli turnauksesta. Eli ei liiemmin tarvitse eritellä maalintekijöitä saati syöttäjiä.
Olen ID numeroihin sisällyttänytkin tietoa lohkosta. Otetaan vaikka lohkon B 3. ottelu jonka GID = 13140023. Tässä:
13 = Turnaus "ID" (Vuosi)
14 = Ottelun nro koko turnauksessa
00 = Kertoo että kyseessä on alkusarjan peli
2 = 2. lohko
3 = 3. Ottelu lohkon sisällä
Ei ehkä järkevin tapa, mutta näin sain sisällytettyä tietoa pienempään määrään muuttujia.
Olen kyllä ajatellut että tästä tekisin saman kaltaisen sovelluksen, kuin sinä olet toteuttanut. Olisi erinomainen työkalu seuraavaan turnaukseen. Eiköhän tuolta tule bongattua jotain uusia ideoita ja kannustusta tähän projektiin.
Miksi noi kaikki tiedot pitää olla tungettuna yhteen kenttään? Mikset vain selvyyden vuoksi palastele noi jokaiset omiin "kenttiin", jolloin sinun ei tarvitse uudelleen parsia parsittusta datasta?
Itse myöskin heittäisin nuo tuolta lähdekoodista hittoon, ja käyttäisin vaikka csv-muotoa, jos kerran muoto on noin lähellä sitä. Pystyy valmiilla php:n sisäänrakennetuilla kirjaistoilla palastelemaan dataa ja mikä tärkeintä, kirjoittaa dataa ihan taulukkosovelluksella.
No joo kieltämättä miksi tosiaan parsisin useaan kertaan samaa dataa.. Ja csv-muodossa tuo voisi olla tosiaan muutenkin helpompi käsitellä.
Myös tuo, että tiedot (ottelut, pisteet, jne..) keräisi valmiiksi yhteen tauluun. Mutta mitenkäs näiden järjestäminen? Varsinkin tasapiste tilanteessa?
Pentu kirjoitti:
Mutta mitenkäs näiden järjestäminen? Varsinkin tasapiste tilanteessa?
Sunhan ei tarvitse niitä järjestää sinne csv-tiedostoon, vaan teet sen vasta php:lla näyttäessäsi dataa ruudulla. Järjestämisen voit tehdä joko valmiilla funktioilla, tai tehdä omat, joka ottaa huomioon turnauksesi säännöt ihan silmukoissa.
Eli csv-muoto olisi vain "tallennusmuoto" (tekstitiedosto, jossa välimerkein eroteltuna), data tulee sieltä edelleen ihan php:n omaan taulukkomuuttujaan (array), jota voit käsitellä vapaasti kuten nykyisessäkin tapauksessa.
Ja tasapisteiden sattuessa järjestät sillä mainitsemallasi "ennalta määrätyllä kaavalla". ;)
Pentu kirjoitti:
Tasapiste tilanteessa pelaajan sija ratkaistaan eri ennalta määrätyllä kaavalla.
Noniin, vähän silloin tällöin kerinnyt testailemaan. Nyt olen kuitenkin saanut jonkinlaisen koodin pätkän tähän tarkoitukseen. Itselleni tuli parikin uutta juttua tän projektin mukana, toi .csv ja .csv tiedoston käsittely funktiot. Lisäksi usort() -funktioon voi lisätä oman ulkoisen vertailevan funktion.
<?php /* Document : standings.php Created on : HUH 14 -14 Modified : HUH 16 -14 Version : beta 2.5 Author : Pentu Description : NHL95 projekti, sarjataulukon kokeiluja, ver 2.5 */ define("STANDING_FILE", "standings.csv"); // Tiedosto, jonne on kerätty joukkue kohtaiset tiedot. define("SMARTY_DIR", "../smarty/Smarty-3.1.16/libs/"); // Smarty tiedostot. require_once(SMARTY_DIR ."/Smarty.class.php"); // Smarty $smarty = new Smarty; $smarty->setTemplateDir('../smarty/nhl95/templates'); $smarty->setCompileDir('../smarty/nhl95/templates_c'); $smarty->setCacheDir('../smarty/nhl95/cache'); $smarty->setConfigDir('../smarty/nhl95/configs'); // Other $standings = array(); #### Functions #### function comparePoints($a, $b){ /* Lohkojärjestyksien määrityksessä vastaavat järjestyksessä seuraavat asiat: 1. pisteet 2. keskinäiset ottelut 3. maaliero 4. tehdyt maalit 5. Sijoitus suhteessa rankingiin */ // Verrataan pisteitä if ($a["points"] == $b["points"]){ // TODO Jos samassa lohkossa, katsotaan keskinäinen ottelu // Verrataan tehtyjä maaleja if ($a['goalsdiff'] == $b['goalsdiff']){ // Verrataan maalieroa if ($a['ggoalsfor'] == $b['goalsfor']){ // TODO Verrataan sijoitusta suhteessa ranking listaan. return 0; } return ($a['goalsfor'] < $b['goalsfor']) ? 1 : -1 ; } return ($a['goalsdiff'] < $b['goalsdiff']) ? 1 : -1 ; } return ($a['points'] < $b['points']) ? 1 : -1 ; } #### Functions #### // Luetaan Joukkue tiedot if (($read_s = fopen(STANDING_FILE, "r")) !== FALSE){ while (($s = fgetcsv($read_s, 1000, ",")) !== FALSE) { // Listataan tiedot $standings[] = array ( 'group' => $s[0], 'team' => $s[1], 'matches' => $s[2], 'wins' => $s[3], 'draws' => $s[4], 'losses' => $s[5], 'goalsfor' => $s[6], 'goalsagainst' => $s[7], 'goalsdiff' => $s[8], 'points' => $s[9] ); } fclose($read_s); } // Järjestetään joukkueet paremmuus järjestykseen usort($standings, 'comparePoints'); // Tulostetaan ruudulle $smarty->assign('lines', $standings); $smarty->display("array.tpl");
Jos joku haluaa ehdottaa parannuksia, niin toki otetaan vastaan. Kaikki mielipiteet, risut, ruusut ym.ym. ovat tervetulletia.
Aihe on jo aika vanha, joten et voi enää vastata siihen.