♠ ♥ ♦ ♣

PHP Poker

Texas Hold'em · Specyfikacja gry
PHP 5.6 PHP 8.0 Do 8 graczy / player Baza JSON lub MYSQL Czas rzeczywisty / Multiplayer


Wyniki testów silnika fizyki

O grze

Script Poker Multiplayer to przeglądarkowa gra w Texas Hold'em dla wielu graczy, działająca w czasie rzeczywistym bez konieczności instalacji i WebSocketów — synchronizacja odbywa się przez cykliczne odpytywanie API (polling co 2 s). Wersja 10.10.2026 pisana od podstaw. Texas Holdem Poker PHP

♠ Tryb gry

Texas Hold'em — 2 karty własne + 5 kart wspólnych. Dowolna liczba stołów, do 8 miejsc przy każdym.

♥ Wirtualna waluta

Konto startowe: 1000 zł. Każdy stół ma własną stawkę wejściową (ciemną) i minimalne saldo.

♦ Tempo gry

30 s na ruch, 2 min nieaktywności = usunięcie ze stołu, 10 min = wylogowanie.

Przebieg rozdania

Rozdanie przechodzi przez fazy Pre-Flop → Flop → Turn → River → Showdown. Rozpoczęcie wymaga minimum 2 graczy ze środkami na ciemną.

Oczekiwanie
Gracze zajmują miejsca; start gdy ≥2 graczy pokrywa ciemną
→
Pre-Flop
Każdy płaci ciemną, 2 karty własne, pierwsza licytacja
→
Flop
3 karty wspólne na stole
→
Turn
4. karta wspólna
→
River
5. karta wspólna
→
Showdown
Porównanie układów, wypłata puli, prezentacja 14 s

Ciemna (wpisowe do rozdania)

Model stołu oparty na ciemnej pobieranej od każdego siedzącego gracza przy starcie rozdania (nie klasyczne small/big blind). Wartość ciemnej to jednocześnie początkowy zakład — każdy gracz zaczyna licytację z wpłatą równą ciemnej. Jeśli ciemna zabierze cały stack, gracz jest automatycznie ALL-IN.

Koniec licytacji

Runda licytacji kończy się, gdy każdy niespasowany gracz wykonał ruch i wyrównał bieżący zakład. Gracze all-in liczą się jako rozliczeni. Gdy zostają sami gracze all-in — pozostałe karty wspólne są odkrywane automatycznie aż do showdownu.

Showdown — prezentacja wyników

CzasFazaCo się dzieje
0–3 s1Karty wszystkich graczy zostają odkryte
3–6 s2Podświetlenie zwycięskich kart na złoto
6–9 s3Oznaczenie zwycięskich miejsc + nazwa układu
9–14 s4Animacja przelotu żetonów do zwycięzców
14 s5Reset stołu do stanu „Oczekiwanie"

Side poty (pule boczne)

Gdy gracz z małym stackiem idzie all-in, pula dzieli się na poziomy wg wpłat całorozdaniowych (total_bets). Każdą pulę wygrywa najlepszy układ spośród graczy uprawnionych (wpłacili co najmniej dany poziom i nie spasowali). Resztki z dzielenia remisu trafiają do pierwszego zwycięzcy; wpłaty graczy usuniętych w trakcie rozdania pozostają w głównej puli.

Hierarchia układów

Silnik wybiera najlepszy 5-kartowy układ z 7 kart (2 własne + 5 wspólnych). Złoty obramowanie = karty tworzące układ.

9
Poker Królewski
A K Q J 10 w jednym kolorze
A♠
K♠
Q♠
J♠
10♠
8
Poker (Straight Flush)
Strit w jednym kolorze
9♥
8♥
7♥
6♥
5♥
7
Kareta
4 karty tej samej wartości + kicker
Q♠
Q♥
Q♦
Q♣
7♠
6
Full House
Trójka + para
J♠
J♥
J♦
4♣
4♥
5
Kolor
5 kart w jednym kolorze
A♦
J♦
8♦
5♦
2♦
4
Strit
5 kolejnych wartości (A-2-3-4-5 też się liczy)
9♠
8♥
7♣
6♦
5♠
3
Trójka
3 karty tej samej wartości
8♠
8♥
8♦
K♣
3♠
2
Dwie pary
Dwie pary + kicker
A♠
A♥
6♣
6♦
9♠
1
Para
2 karty tej samej wartości
10♠
10♥
A♣
7♦
2♠
0
Wysoka karta
Brak układu — liczy się najwyższa karta
A♠
J♣
9♦
5♣
3♥

Akcje gracza

Panel akcji pojawia się tylko w Twojej turze (30 s). Podświetlone miejsce = gracz na ruchu.

AkcjaPrzyciskZasada
Czekaj (Check)checkDostępne tylko gdy nic nie trzeba dopłacić (zakład wyrównany lub 0)
Sprawdź (Call)callWyrównanie bieżącego zakładu; przy małym stacku = all-in za resztę
Podbij (Raise)raise„Podbij do X" — min. krok = bieżący zakład + ciemna; max = własna wpłata + saldo
Pasuj (Fold)foldOdpada z rozdania, wpłacone żetony przepadają w puli
Poddaj (Pass)passGdy nic nie wisi = check; gdy wisi dopłata = fold

Limity czasowe

⏱ 30 s na ruch

Po upływie: jeśli wisi dopłata → fold (lub all-in, gdy saldo < dopłata); jeśli nie wisi → pass. Pasek timera zmienia kolor: zielony → pomarańczowy (15 s) → czerwony (5 s).

⏱ 2 min bezczynności

Gracz zostaje usunięty ze stołu. W trakcie rozdania może to wymusić natychmiastowy showdown.

⏱ 10 min bezczynności

Automatyczne wylogowanie z lobby (po stronie klienta).

Sytuacje szczególne

Stoły i konto gracza

Rejestracja i konto

  • Login: 3–20 znaków [A-Za-z0-9_-]
  • Hasło min. 4 znaki → password_hash (bcrypt)
  • Start: +1000 zł
  • Dane: dane — poza zasięgiem WWW

Parametry stołu

  • blind — ciemna / wpisowe do rozdania
  • min_balance — minimalne saldo do usiadania
  • stopped — blokada administracyjna stołu
  • Konfiguracja: .json /sql (panel admina)

Lobby

Lobby odświeża listę stołów co 2 s: liczba graczy (x/8), stan, stawka i flaga „zatrzymany". Wejście do stołu: poker.php?table=N. Stół musi istnieć w konfiguracji lub na dysku — API odrzuca nieistniejące numery.

Panel administratora

admin.php — osobna sesja administracyjna, hasło w konfiguracji pliku, rate-limit logowania (5 prób / 5 min → blokada 15 min).

Zarządzanie stołami

Tworzenie (blind + min. saldo), usuwanie (z zwrotem wpłat z niedokończonej ręki), zatrzymywanie/wznawianie (zamrożenie = stan tylko do odczytu).

Statystyki na żywo

Zarejestrowani gracze, gracze online (aktywność < 120 s), liczba stołów, środki na stole, stan rozdania — odświeżanie co 2 s.

👁 Podgląd stołu

Widzi karty wszystkich graczy, przyszłe karty wspólne oraz szansę wygranej każdego gracza (symulacja Monte Carlo, 300 iteracji). Tryb tylko-do-odczytu.

Architektura techniczna

Lekki stack: PHP 5.6 + czysty JavaScript. Brak bazy SQL — cały stan w plikach JSON/TXT z blokadami flock(). Brak WebSocketów — polling.

Pliki

PlikRola
index.phpLobby: rejestracja, logowanie, lista stołów
(plik1).phpWidok stołu: UI, animacje żetonów, timer, polling co 2 s
(plik2).phpSilnik gry: akcje, evaluator układów, side poty, timeouty, wypłaty
(plik3).phpEndpointy lobby: lista stołów, saldo zalogowanego
admin.phpPanel admina + JSON API zarządzania
securityWspólne zabezpieczenia (sesja, CSRF, rate-limit, licencja)
stolyKonfiguracja stołów (blind, min_balance, stopped)
pamiecPełny stan stołu: miejsca, karty, talia, pula, zakłady
danedane użytkownika (login+hash), stan konta (saldo)

Przepływ danych

Przeglądarka
polling get_status co 2 s + auto_timeout co 5 s
→
API
walidacja sesji, CSRF, whitelist stołów
→
flock(LOCK_EX)
atomowy odczyt+modyfikacja+zapis pamiec.
→
Odpowiedź JSON
bez talii, karty rywali zakryte 🂠

Evaluator układów

Funkcja evaluatePokerHand() sprawdza wszystkie kombinacje 5 z 7 kart (C(7,5)=21) i wybiera najlepszą wg kategorii + tiebreakerów (kickery). Obsługuje strit A-2-3-4-5 (wheel). Wyznacza też listę winning_cards do złotego podświetlenia.

Interfejs API

poker_api.php ?table=N&action=…

AkcjaCSRFOpis
get_status—Pełny stan stołu (bez talii); obsługuje timeouty i progresję showdownu
sit✔&seat=0..7 — zajęcie miejsca (wym. min_balance)
start_game✔Start rozdania (≥2 graczy z środkami)
play_turn✔&act=check|call|raise|fold|pass&val=X
leave_table✔Odejście od stołu
auto_timeout✔Wymuszenie ruchu po 30 s (wywoływane co 5 s z klienta)

api.php

AkcjaOpis
get_tablesLista stołów: gracze, stan, blind, min_balance, stopped
get_balanceSaldo wyłącznie zalogowanego użytkownika (z sesji)

admin.php ?api=…

AkcjaMetodaOpis
stateGETStoły + statystyki (gracze online, środki)
playersGETLista graczy: login, saldo, stół
createPOST+CSRFNowy stół (blind, min_balance)
deletePOST+CSRFUsunięcie stołu + zwrot wpłat z żywej ręki
toggle_stopPOST+CSRFZatrzymanie/wznowienie stołu

Bezpieczeństwo

Ochrona plików (.htaccess)

  • Options -Indexes — brak listowania katalogów
  • Blokada pobierania .json .txt .log .bak .sql itd.
  • baza/ i stol/ — całkowity deny + wyłączenie PHP
  • Blokada plików ukrytych (.ht*, .git, .ratelimit)

Licencja domenowa

  • $GLOBALS['SEC_LICENSED_HOSTS'] w security.php
  • Skrypt na obcej domenie → HTTP 403
  • .domena.pl = domena + subdomeny

Aplikacja

  • CSRF: token sesyjny we wszystkich akcjach zapisu
  • Rate-limit: login 10/5 min, admin 5/5 min → blokada 15 min
  • Sesja: HttpOnly, Secure (HTTPS), strict-mode, regeneracja ID
  • Anti-XSS: walidacja loginu + escapowanie w JS
  • Talia i userId nigdy nie opuszczają serwera w odpowiedzi

Uczciwość gry

  • Wszystkie rozliczenia wyłącznie po stronie serwera
  • Saldo odczytywane na świeżo pod lockiem (anti double-spend)
  • Porównanie haseł: hash_equals / password_verify
  • Błędy do logu — display_errors=0
⚠ Uwaga: pamiętaj o zmianie $ADMIN_PASSWORD w admin.php oraz o włączeniu HTTPS. Poker Texas Holdem script.