Jak zaprojektowac gre losowa

0

Witam. Potrzebuje do gry zaprojektować coś takiego co działa w tle (cron) ale może da się tego uniknąć. A zasada ma być taka że gracz wchodzi do tawerny i tam barman co 5 minut rzuca kostką i losuje jakieś 3 liczby. Użytkownik może obstawić jakie liczby wypadną ale tylko na dany rzut może obstawić raz.

Opcja 1. Moje wyobrażenie że wchodze do tawerny widze ze za 4 minuty barman rzuca koscmi, wiec obstawiam swoje wyniki i wychodze. Wracam za 3 godziny a system przy logowaniu czy przy wejsciu do tawerny sprawdza jaki byl wtedy moj wynik i mowi czy wygralem czy nie.

Opcja 2. Wchodze do tawerny za minute rzut wiec obstawiam i czekam, zegar odliczy sie do konca i wtedy strona sie autoamtycznie odswiezy i pokaze mi wyniki i pozwoli na ponowne nowe obstawienie

Opcja 3. Otwieram dwie przegladarki w jednej wchodze na gre minute przed losowaniem ale wylaczam JS, a w drugiej na innego gracza wchodze i czekam az dojdzie do losowania. Wtedy patrze jakies sa wyniki w wpierwszej przegladarce wpisuje te same wyniki zeby oszukac. Nie powinno mi sie to udac bo ten drugi gracz juz doczekal do konca zegara i widzial wyniki wiec w bazie dany numer losowania sie juz zmienil na wyzszy i obecne wpisane wyniki powinny automatycznie wskoczyc do nowego losowania

tabelea : KOLEJKA

ID OPIS czy otwarta
144 kolejna gra FALSE
155 kolejna kolejka aktywna TRUE

tabela : typy

ID ID_KOLEJKI typy
788 144 1,3,2
899 155 3,3,4

O już wiem jakie pytanie mi łazi po głowie
Generalnie chodzi mi o to jak sprawić że jeśli wejde do tawerny i wyłącze JS a okazuje sie ze byla teraz gra nr:150 to jesli poczekam 30 MINUT to powinna byc gra nr 156 bo co 5 minut nowa gra. to teraz jak dodam numery kostek to zeby mi wskoczylo pod gre o ID = 156. ALe zakladam ze w tym czasie nikt sie nie logowal nikt nie wykonal akcji. Czy to wtedy powinien jednak dzialac cron? czy jakis mechanizm obliczajacy czas od uruchomiania gry i automatycznie dodawac aktualna gre ?

No nie wiem jak to rozegrac :(

0

Nie rozumiem problemu, a szczególnie części na temat js.
Przecież to wszystko musi się dziać po stronie serwera! Tam musi chodzić wątek który losuje. U klienta najwyżej ajaxem sobie ściągasz wyniki.

1

Wrzucasz do crona jakiegoś skrypta, co Ci np. za pomocą trzech shuf -i1-6 -n1 (albo jednokrotnie -n3, zależy jak to chcesz implementować) losuje rzuty i wrzuca razem z datą do bazy. Reszta to tylko odpowiednie oprogramowanie typowania (klient typuje rzuty i je zapisujesz z aktualną datą do bazy, by móc odfiltrować to, co było typowane po losowaniu) a potem wyświetlenie tego na stronie.
Chyba, że coś źle zrozumiałem... a pewnie tak było :)

0

Rozpisałem sobie to zadanie na etapy ale musi jak mowicie byc cos w tle od strony crona.

  1. startuje skrypt crona
  2. sprawdzam czas obecny i dodaje 5:00 min do pola end_game czas zakonczenia gry
  3. insert do bazy by miec ID z nowa gra oraz wstawic czas konca gry
  4. flaga actve ustawiona na true
  5. Po stronie klienta kazdy nowo dodany wpis typy kosci beda dodane do aktywnej gry (czyli przed dodaniem wybieram id z gry gdzie flaga = true, nawet jak wylaczy ktos JS i za 30 minut doda typy to zrobi to do aktualnej gry)
    **6. skrypt sprawdza [i tu wlasnie nie wiem co ile ma sprawdzac ? jezeli dam co 5 min a nie wstzeli sie w przedzial i np okaze sie ze obecny czas jest mniejszy o sekunde od czasu konca gry to gra dopiero zakonczy sie za kolejne 5 min. czyli w sumie 10 minut a tak nie moze byc. Jak sie przed tym zabezpieczyc?] **
  6. losuje liczby sortuje od min do max i wstawiam do wyniku
  7. sprawdzam z wytypowanymi posortowanymi wynikami od min do max (tablica typow i tablica wynikow)
  8. przyznaje punkty za zwycięztwo
  9. skrypt powaraca do punktu 2

@fourfour masz racje, co 5 minut cron wrzuci pod aktualnie otwarta gre wyniki zmieni flage przeliczy wyniki kto ile trafil i doda im punkty na zakonczona otworzy nowa gre i ustawi czas do zakonczenia gry danej gry tak zeby mniej wiecej bylo wiadomo za ile losowanie. i tak bedzie najlepiej. Dzieki za pomoc

1

Na upartego nie potrzebujesz cron'a, ale znacznie to zadanie ułatwi. Bez crona zrobił bym to tak:

funkcja UaktualnijStanLosowan tzn.
Sprawdzenie czasu, na jego podstawie sprawdzasz czy jakaś gra się już nie zakończyła jeśli tak otwierasz nową grę a zamykasz starą.
Przy zamknięciu starej rozstrzygasz zwycięzców i przydzielasz im punkty. Jeśli żadna gra się nie zakończyła wychodzisz bez zmian z funkcji.
Tutaj można skorzystać z transakcji pomiędzy otwarciem nowej a zamknięciem starej gry, ale to raczej nie warte świeczki. Można też zrobić tak, że obstawiać można przez 4 min. a 1 min. przed losowaniem jest niemożliwe przyjęcie zakładu.

Użytkownik (każdy) odświeżając stronę wyników najpierw wywoływał by tą funkcję a później sprawdzał swoją tabelkę z typami i wynikami. Czy pobierzesz tą grę przy pomocy ajax'a czy html to bez różnicy. User dostanie informacje o ID rozgrywki, czasie rozpoczęcia, zakończenia, jego typach i czy wygrał czy nie.

Oczywiście może zdarzyć się tak, że np. w nocy przez 2h nikt się nie logował i nie wchodził do tawerny. Wtedy uzbiera się kilka losowań, na których nikt nie był ani skrypt sprawdzający nie był uruchamiany. Gdy jednak wejdzie możesz wykonać zaległe losowania przy jednym przeładowaniu strony, lub pominąć je.

Przy wysyłaniu zgłoszenia zależy od ciebie jak to zrobisz albo dodasz ID, pod który robisz podbicie a w przypadku gdy rozgrywka jest już nieaktywna komunikat o tym, że losowanie jest już nieaktualne lub zapisać "typ" pod aktualnie prowadzoną rozgrywkę. Oczywiście przed zaakceptowaniem musiała by być również wywołana funkcja UaktualnijStanLosowan.

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