Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Losowe dobieranie graczy
blady101
post
Post #1





Grupa: Zarejestrowani
Postów: 41
Pomógł: 0
Dołączył: 26.12.2011

Ostrzeżenie: (0%)
-----


Witam

Od jakiegoś czasu zastanawia mnie algorytm losowego dobierania graczy. Załóżmy, że mamy w bazie danych zalogowanych użytkowników i każdy z nich rozpoczął szukanie.
Teraz na początku każdego szukania:
1.User sprawdza czy nie został odnaleziony już przez kogoś, jeśli tak idź do punktu 3, jeśli nie idź do punktu 2.
2.Wyślij zapytanie do bazy danych które zwróci wszystkich użytkowników ze stanem wolny i wybierz jednego z nich ustawiając mu - drugim zapytaniem - stan na "zajęty". Jeśli nie znajdzie żadnego użytkownika powtórz ten punkt do skutku. Jeśli znajdzie, punkt 3.
3.Rozpocznij grę.

Teraz, to zadziała jeśli zapytania MySQL są wykonywane sekwencyjnie, niezależnie od tego czy są wykonywane dla różnych połączeń ze stroną. Moje pytanie jest takie, czy są wykonywane sekwencyjnie? Raczej wątpię. Myślę, że dla każdego połączenia jest osobny wątek, a wtedy możliwe są kolizje w wyszukiwaniu użytkowników.

Ten post edytował blady101 7.05.2012, 11:54:36
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Fifi209
post
Post #2





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Bo czegoś takiego nie robi się w PHP a np. piszesz serwer w C++ (przykład oczywiście) i z nim komunikujesz się za pomocą np. socketów.
Go to the top of the page
+Quote Post
blady101
post
Post #3





Grupa: Zarejestrowani
Postów: 41
Pomógł: 0
Dołączył: 26.12.2011

Ostrzeżenie: (0%)
-----


Nie da się tego jakoś zakodzić bez osobnego serwera? Mam dostęp do jednego wirtualnego na stronkę i do tego muszę sie ograniczyć.

Ten post edytował blady101 7.05.2012, 12:39:20
Go to the top of the page
+Quote Post
radziopoke
post
Post #4





Grupa: Zarejestrowani
Postów: 125
Pomógł: 14
Dołączył: 2.06.2010

Ostrzeżenie: (0%)
-----


ja bym to zrobił tak:
1. Pobierasz bazę danych z użytkownikami, którzy mają status wolny
2. Losujesz jednego z użytkowników
3. Robisz update na tym użytkowniku na zajęty, ale z warunkiem czy jest wolny gdyż między wybraniem a updatem chwila może minąć (IMG:style_emoticons/default/smile.gif) ->wg mnie 2 zapytania update w 1 czasie na jednym elemencie nie mogą się wykonać więc na logikę, jeżeli zostanie wykonany jeden update drugi zostanie przyblokowany gdyż warunek się nie będzie zgadzał i w takim wypadku należy wrócić się do punktu 1
a dalej tak jak wolisz (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
blady101
post
Post #5





Grupa: Zarejestrowani
Postów: 41
Pomógł: 0
Dołączył: 26.12.2011

Ostrzeżenie: (0%)
-----


Czy to o czym napisał radziopoke, ma szansę zadziałać? Tzn czy faktycznie dla jednego rekordu może być tylko jeden update wykonywany w tym samym czasie?

Algorytm mógłby wyglądać tak:

Najpierw znajdujemy wolnego użytkownika, na razie powiedzmy nielosowo:

mysql_query('SELECT id FROM users WHERE state="0" LIMIT 1');

A potem sprawdzając czy nadal jest wolny, zabieramy go dla siebie

$result = mysql_query('UPDATE INTO users SET state="1" WHERE (id=$znalezione_id OR id=$moje_id) AND state="0"');

jeżeli $result == false, to może oznaczać że albo ten użytkownik jest już zajęty, albo ktoś znalazł mnie i ja jestem zajęty. Odpowiednio to sprawdzam i albo szukam dalej kolejnego wolnego, albo jeśli to mnie znaleziono, przechodzę do rozmowy.

Ten post edytował blady101 11.05.2012, 12:59:54
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 21:58