Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySQL - ryhmäjako

Petja [26.02.2012 13:49:05]

#

Olen toteuttamassa online-peliä, joka loisi mahdollisimman tasapuoliset joukkueet.

Tahtoisin siis MySQL:n järjestävän taulun "Pelaajat" kentän "Taso" mukaisesti pienimmästä suurimpaan ja kirjoittavan järjestyksessä joka toiselle riville kenttään "Joukkue" arvon "1" ja joka toiselle "2". Kuinka tämä tulisi toteuttaa mahdollisimman vähillä kyselyillä?

Alkuperäinen taulu:

| Taso | Nimimerkki | Joukkue |
| 4    | Matti      |         |
| 5    | Maija      |         |
| 3    | Petja      |         |
| 1    | Esimerkki  |         |

Muutoksen jälkeen:

| Taso | Nimimerkki | Joukkue |
| 1    | Esimerkki  | 2       |
| 3    | Petja      | 1       |
| 4    | Matti      | 2       |
| 5    | Maija      | 1       |

Huomaa muutokset viestissä!

The Alchemist [26.02.2012 14:02:50]

#

Edit: poistettu semiturha viesti.

Petja [26.02.2012 14:08:39]

#

Kuten aloitusviestissä huomautin, muutin viestiä. En siis olekaan siirtämässä taulun tietoja, kuten ehdotit. Uutta koodia kehiin! Toivoisin, että kirjoittamassasi kyselyssä käyttäisit sanomiani kenttiä esim. `Pelaajat`, ei `players`. Helpottaa koodin lukua huomattavasti kun tietää mitä mikin tekee ja on "tutut" kentän nimet.

Lähtisin toteuttamaan kyselyä kylläkin jotenkin näin:

ALTER TABLE `Pelaajat` ORDER BY `Taso`, `Nimimerkki`

The Alchemist kirjoitti:

Halutaan toki joukkuetietojen pysyvän vaikka pelaajia lisättäisiin kantaan myöhemmin...

Hyvä huomio! Kannattaa myös varautua siihen, että pelaaja voi poistua pelistä, jolloin tämän kenttä poistetaan tästä taulusta. Taulussa "Käyttäjät" säilytän näet kaikkia rekisteröityneitä käyttäjiä, kun taas taulussa "Pelaajat" vain niitä, jotka ovat olleet aktiivisia viimeisten 30 sekunnin aikana.

The Alchemist [26.02.2012 14:41:52]

#

Juu, huomasin muutoksen vasta jälkeenpäin.

Tämmöinen kysely päivittää tiimitietoja uusille pelaajille:

UPDATE players SET team = (SELECT IF((@row := @row + 1) % 2 = 1, 'a', 'b'))
WHERE team IS NULL;

Ongelmana tuossa on se, että tiimien pelaajamäärä ei välttämättä pysy samana.

Jos tästä haluaa idioottivarman tehdä, niin veikkaisin helpointa olevan laskea tiimi koodissa ennen inserttiä.

Petja [26.02.2012 16:51:21]

#

Mutta miten tehdään tuo alkujärjestely, joka tuossa sinun "semiturhassa" viestissäsi oli, mutta vaan samassa taulussa?

The Alchemist kirjoitti:

Ongelmana tuossa on se, että tiimien pelaajamäärä ei välttämättä pysy samana.

Ei tiimien koilla ole väliä. Pelaajat järjestetään heidän tasojensa mukaisesti, kuten aloitusviestissä mainitsin.

Metabolix [26.02.2012 19:43:20]

#

Petja kirjoitti:

Olen toteuttamassa online-peliä, joka loisi mahdollisimman tasapuoliset joukkueet.

Tahtoisin siis MySQL:n järjestävän taulun "Pelaajat" kentän "Taso" mukaisesti pienimmästä suurimpaan ja kirjoittavan järjestyksessä joka toiselle riville kenttään "Joukkue" arvon "1" ja joka toiselle "2".

Näillä kahdella asiallahan ei ole mitään tekemistä keskenään.

Mahdollisimman tasaisia joukkueita ei voi tehdä tuollaisella vuorottelulla: jos tasot ovat vaikka (9, 5, 5, 1), saadaan joukkueet (9, 5) ja (5, 1), vaikka tasaisempi olisi (9, 1) ja (5, 5).

Vähän parempaan tulokseen pääsee ahneella algoritmilla, jossa siis seuraava pelaaja laitetaan aina heikompaan joukkueeseen, mutta tasoilla (5, 5, 4, 3, 3) saadaan tällöin tulos (5, 4) ja (5, 3, 3), vaikka tasaisempi olisi (5, 5) ja (4, 3, 3).

Parhaan ratkaisun saa tiettävästi vain kokeilemalla kaikki vaihtoehdot (20 pelaajalla 219 = 524288, eli tästä tulee pian todella hidas ratkaisu). Lisätietoa: Subset sum problem.

Petja [29.02.2012 14:46:04]

#

Hyvä, että otit asiaan kantaa! Pohdiskelinkin kerran miksei käyttämälläni tavalla saa kovin tasaisia joukkueita.

Nyt tarvitsee aika paljon vaan työtä, kun toteutin jo tämän "huonomman" tavan.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta