Hogyan hozzam létre a következő képletet?
Egy nem annyira ismert nyelvben a pawno-ban próbálok írni egy multiplayer játékhoz egy privát üzenet küldő rendszert.
A játékban minden játékosnak van egy azonosító száma. A legkisebb 0 a legnagyobb pedig a max férőhej-1.
Úgy szeretném megoldani a szövegek tárolását hogy az azonosítókból párokat alkotok és a pároknak lennének karakterláncjai. És ezeket a karakterláncokat ellátnám egy egy azonosítószámmal ami a 2 azonosítóból következik.
Tehát például
0,1 = 0
0,2 = 1
0,3 = 2
hogy elkerüljem, hogy egy egy párhoz több karakterlánc is tartozzon Ezzel a képlettel kiszámoltam mennyi lehet egy n férőhejjel rendelkező játékszerveren a karakterláncok száma.
n*(n-1)/2
A gondot az okozza, hogy nem tudok rájönni, milyen műveletsorozatot kéne elvégezni ahhoz, hogy két játékosazonosítóból megkapjuk a karakterlánc azonosítóját.
Fontos, hogy a karakterláncok azonosítója 0-tól a maximumig minden azonosító fel legyen használva. Köszönöm előre is a segítséget.
Ha pedig az a baj, hogy az (a, b) és a (b, a) párokhoz ugyanaz tartozzon, akkor:
max(a, b) * (max(a, b) - 1)/2 + min(a, b)
Ez segít megérteni:
|01234
-+-----
0|.....
1|0....
2|12...
3|345..
4|6789.
(copy-zd be monospaced karakterkészletes szerkesztőbe)
"a" és "b" ugye a játékosok sorszáma.
A sorok az "a" szerint mennek, az oszlopok a "b" szerint. A mátrixba beírtam a stringek azonosítóját. Ahol "." van, ott nem értelmezett az érték, mert vagy magával beszélne a játékos, vagy a fordított párról van szó (ab helyett ba).
Ez már C++-ban is így néz ki, a max/min függvényeket értelemszerűen valami math könyvtárból veheted. Magyarázat újra:
Ha jól értem, a feladat az, hogy vannak játékosok, n darab. A játékosok azonosítója 0..n-1. A feladat az, hogy a játékospárokhoz rendeljünk azonosítókat úgy, hogy az is egy szám legyen és 0..(n*(n-1)/2) tartományban legyen, vagyis ne legyen fel nem használt azonosító és mindegyik a párokkal kölcsönösen egyértelműen legyen összerendelve, úgy, hogy a párokban a játékosok sorrendje nem számít (vagyis a (3, 7) párhoz ugyanaz az azonosító tartozzon, mint a (7, 3)-hoz). Az egyértelmű összerendelés azt jelenti, hogy nincs két string azonosító, amely ugyanahoz a két játékoshoz tartozna és nincs két játékospár, amelyekhez ugyanaz a string azonosító tartozna.
Na, ekkor a sorrendproblémát megoldhatjuk úgy, hogy a párokat mindig úgy írjuk föl, hogy a nagyobb sorszámú játékos legyen a pár első, a kisebbik a második tagja. Tehát ekkor az alábbi párok vannak pl. 4 játékos esetén: (1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2) - látható, hogy az első szám mindig nagyobb, mint a második.
Ezekhez kellene akkor azonosítót rendelni a feladatnak megfelelő módon. Kézenfekvő is az alábbi:
(1, 0) : 0
(2, 0) : 1
(2, 1) : 2
(3, 0) : 3
(3, 1) : 4
(3, 2) : 5
Ehhez kellene képlet. Ha az előbbi sorozatot a másik hozzászólásomban látható táblázatos elrendezésben írod föl, vagyis nem egymás alá, akkor látható, hogy a sor elején lévő string azonosító érték csak az első pár azonosítójától függ, mégpedig a*(a-1)/2. Ehhez hozzáadva b-t, megvan a string azonosító.
Ha a táblázatot nem érted: a táblázat a játékospárokhoz tartozó string azonosítókat adja. A sorok fejlécében a nagyobbik sorszámú, az oszlopokéban a kisebbik sorszámú játákos sorszáma látható. Így, ha a (3, 1) pár azonosítóját akarod kiolvasni, akkor a 4. sor (3. számú) 2. oszlopa (1. számú) értéke adja a string azonosítót. A táblázat átlójában nem értelmezett string azonosító, mert a játékosok saját magukkal nem beszélnek. Hasonlóan a jobb-felső háromszög-része sem, mert a fentiekben alapján a párok tagjait rendeztük: nagyobb elöl, kisebb hátul.
Így már értem.
Nagyon köszönöm.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!