Çok oyunculu oyun: internette iki oyunculu 8-ball. Arka uç: JSON ve SQL. Ön uç: JavaScript ES5 + Canvas 2D.
sunucu -dır autorytetem durum server(anti-cheat).
Şekil 1 — Oyun ekranı. Soldan sağa: masanın üstündeki oyuncu çubuğu (avatar + kullanıcı adı + ödül havuzu),
üçgen şeklinde dizilmiş topların ve açılış çizgisindeki beyaz topun bulunduğu masa, sağ panel: nokta UDERZENIA
(falso ayarı için büyük beyaz top), CEBE GİREN TOPLAR (sıralama) ve tur.
Masanın altında “Oyuncular bekleniyor” durum mesajı ve “Masaya otur” düğmesi.
Şekil 2 — Atış motoru testleri (A–H). Motor her atış için şunları bildirir:
cebe girip girmediğini, son konumu ve son hızı ile topun tüm yörüngesini.
Test edilen senaryolar: köşe ve orta cebe soksahiptir: (A, F, G, H), banttan sekme (B),
cebe düşmeden bant boyunca yuvarlansahiptir: (C, D) ve cebin yanından geçen yörünge (E).
==================== 2 ====================
Diziliş: beyaz top açılış çizgisinde (x=260), trójkąt 15 top ile czubkiem üzerinde x=700;
siyah (8) üçgenin ortasında, köşelerde düz ve çizgili birer top bulunur.
Açılış vuruşu: ilk atış beyaz topla üçgene yapılır; açılış oyuncusunu sunucu seçer (mt_rand).
Gruplar: playing durumunda ilk olarak playing bir topu cebe sokan oyuncu o top grubunu alır —
düz (1–7) veya çizgili (9–15); rakip diğer grubu alır.
Sıra: kendi topunu cebe sokmak = atışa devam; ıskalasahiptir: veya faul = sıra geçer
rakibe.
Siyah top (8): yalnızca kendi grubundaki tüm toplar sokulduktan sonra geçerlidir; şu cebe girmelidir
çaprazındaki en son sokulan topun cebine göre (podświetlona złotym
pierścieniem). Siyah topun erken veya yanlış cebe sokulması anında mağlubiyet demektir.
Fauller (sonuç: rakip beyaz topu eline alır)
Beyaz topun ilk olarak rakibin topuna veya (henüz geçerli değilken) siyah topa çarpması
Beyaz top hiçbir topa değmez ve 3 farklı banttan azına çarparsa
Beyaz topun veya rakibin topunun cebe girmesi (rakibin topu onun hanesine sayılır)
Hamle süresinin / atış için ayrılan sürenin aşılması
Oyunun bitişi
Galibiyet: siyah top gerekli cebe girer → kazanan ödül havuzunu alır (bahsin 2 katı)
Hükmen galibiyet: rakip masadan ayrılır veya 30 saniye içinde dönmez → ödül havuzu masada kalan oyuncuya verilir
Rövanş: finished durumundan sonra “Rövanş” düğmesi giriş ücretini yeniden alır
==================== 4 ====================
4. Masa geometrisi ve cepler
Fizik koordinatları her zaman mantıksal koordinat sistemindedir 1000×620 px (sukno -den (53,53) -e kadar (947,547));
ekran ölçeklendirmesi fiziği değiştirmez. 6 cebin her biri bir korytarz-prowadnica ile lejkowatymi
szczękami — nokta değil, yönlendirme kanalıdır. top içinde korytarzu toczy się sonra rynience -e kadar ciemnej dziury (promień ~25 px)
i dopiero tam znika; ścianki kanału odbijają ją -e kadar środka (yok „niewidzialnych band").
Şekil 4 — Masa geometrisi: çuha, numaralandırılmış 6 cep ve siyah top için çapraz cep kuralı.
oś boyunca PAXIS; narożne mają „fartuch" -e kadar t=34
Çapraz cepler
0↔4, 1↔3, 2↔5
gerekli łuza için czarnej
Beyaz top yerleştirme engeli
BilgisayarAP + promień ≈ cueR+15
değil wolno stawiać içinde rejonie łuzy / üzerinde innej topu
==================== 5 ====================
5. Fizik motoru (istemci tarafında, deterministik)
Sabit
Değer
Anlam
SIM_DT
1/240 s
stały krok symulacji — determinizm üzerinde iki klientach
FRICTION
0.997 / krok
Yuvarlansahiptir: sürtünmesi
RAIL_REST
0.8
Bant sekme katsayısı
STOP_V
8 px/s (skal. ile Ø)
Topun dursahiptir: eşiği
MAX_SPEED
1600 px/s (skal. ile Ø)
atış gücü = 1.0
Kolizje top: sprężyste, ile separacją konumların — separacja nigdy değil wypycha topu
ile korytarza łuzy ile powrotem üzerinde bandę.
Etki (spin): boczny (x) zakrzywia tor beyaz topun przed ilk kontaktem;
góra/dół (y) modyfikuje zachowanie sonra kontakcie (follow/draw). Resetowany sonra her strzale.
Skalowanie: güç atışın i eşik zatrzymania skalują się ze średnicą top
(baza Ø28 px) — her boyuttaki toplar doğal hareket eder.
Toczenie top: obrót = droga/promień; numery i pasy przetaczają się aracılığıyla kulę
hareket yönünde döner (tam 360°).
Zdarzenia symulacji:pocketed (top+łuza, içinde sırasıyla),
firstHit (ilk kontakt beyaz topun), rails (zbiór dotkniętych band).
Zdarzenia + konumlar son raportowane -e kadar sunucunun jako sonuç atışın.
==================== 6 ====================
6. Kontroller ve vuruş noktası
İşlem
Bilgisayar
Telefon (dokunmatik)
Nişan alma
myszka ayarlar yön; linia celu + duch topu + tor odbicia
przeciągnięcie ayarlar yön i siłę jednym gestem („proca")
Atış gücü
ıstakayı geriye doğru çekip basılı tutun (öne çekmek gücü azaltır); bırakınca atış yapılır
nişan alsahiptir: ile aynı
Vuruş noktası
paneldeki büyük beyaz top: üst = takip falso, alt = geri falso, yanlar = kavis ve bantta falso
Eldeki beyaz top
klik stawia -den razu
przeciągnięcie ducha i puszczenie palca stawia
Walidacja sunucunun konumların beyaz topun (place_cue): içinde obrębie sukna, değil za blisko łuzy,
değil nachodzi üzerinde inną bilę.
==================== 7 ====================
7. Çok oyunculu — durum makinesi ve zaman
Şekil 5 — Masa durum makinesi.
Sınır
Sabit / yapılandırma
Sonuç
Hamle süresi
turn_time masa başına (5–300 sn, varsayılan 30)
faul: sıra rakibe geçer ve beyaz top rakibin eline verilir
Masaya dönüş
SEAT_TIMEOUT = 30 s
miejsce trzymane 30 s; sonra zwolnione, içinde oyunda = walkower
Atış sonucu
SHOT_TIMEOUT = 150 s
atış süresi dolar → zaman faulü
Kalp atışı
polling get_status co ~1,2 s
odświeża last_activity oyuncunun
Hamle süresi liczony dopiero sonra zatrzymaniu wszystkich top (aşama aim) —
zaman çubuğu simülasyondan sonra görünür. Durum üzerindeki tüm işlemler flock
(withState) — yok wyścigów zapisu.
==================== 8 ====================
8. API — tüm işlemlerin listesi
bilard_api.php?table=<id>&action=<akcja> (oturum gerektirir; POST işlemleri CSRF belirteci gerektirir)
İşlem
Yöntem
Etki
get_status
GET
Tam durum: toplar, koltuklar (+rütbe/bakiye/boşta), sıra, aşama, ödül havuzu, time_left/time_limit, pending_shot, potted_order, moves/round, yapılandırma (felt, ball_r, cue_r, table_w/h), bakiye i rütbe wywołującego
test_session
GET
Diagnostyka: user, userId, balance
sit
POST
Koltuk alsahiptir: (minimum bakiyeyi, masa kilidini ve boş koltuğu kontrol eder)
leave_table
POST
boşaltma miejsca; sırasında oyunun = poddanie (walkower)
start_game
POST
İki oyuncu da oturduğunda başlar; giriş ücretlerini alır, ödül havuzu = bahsin 2 katı olur ve açılış oyuncusu seçilir
place_cue
POST
yerleştirme beyaz topun içinde ręku; walidacja konumların (sukno, łuzy, kolizje)
shoot
POST
kayıt atışın (açı, güç, spin) → pending_shot, aşama moving
shot_result
POST
Simülasyon sonucu (toplar + olaylar) → doğrulasahiptir: → yeni durum; oturan oyunculardan herhangi biri bildirebilir (sonuç deterministiktir)
Anti-cheat — walidacja shot_result sonra stronie sunucunun
16 top; konumlar kumaş sınırları içinde (kumaş dışında yalnızca delik kılavuzlarında)
top değil -ebilir: kaybolmak olmadan zgłoszonego wbicia, ortaya çıkmak się znikąd, nachodzić üzerinde inną
(min. mesafe 12 px)
Deliğe giren toplar: tekrar yok, yalnızca masadaki toplar ve doğru yapı (top 0–15, delik 0–5)
İlk temas kurallara uygun olmalıdır (grup / kurallara göre siyah top)
Odrzucony sonuç: sayaç fails; 2 zgodne błędne zgłoszenia = faul i koniec atışın
Oturmak için min_balance; start_game her iki oyuncudan da alır
blind (giriş ücreti) → ödül havuzu = bahsin 2 katı.
Kazanan tüm ödül havuzunu alır; oyun sırasında masa silinirse havuz yarı yarıya iade edilir.
bakiye içinde baza/<uid>/stankonta.txt; kayıtlar pod LOCK_EX.
==================== 10 ====================
10. Rütbeler ve VIP hesaplayıcı
Rütbe
Verilme şekli
Ayrıcalık
normal
otomatik olarak przy kayıt sırasında
—
silver / gold
yönetici (oyuncu listesi)
kullanıcı adının yanında rozet
VIP
admin
dynamiczny % szansy wbicia przy celowaniu
Kalkulator VIP (klient, yalnızca önizleme): için bilej celowanej hesaplar tor trafionej topu —
bezpośrednio, sonra odbiciu -den bant i içinde kombinacji (top strącana aracılığıyla trafioną). Procent wynika
ile fizycznego przecięcia toru ile gardłem kanału łuzy, kąta wejścia i przeszkód üzerinde trasie. hesaplanır
yalnızca kurallara uygun toplar hesaplanır (grup / grup atanmamışsa herhangi bir top). %50 ve üzeri yeşil, altı kırmızı;
napis yatay także içinde trybie dikey.
==================== 11 ====================
11. Yönetici paneli (admin.php)
masalar
Parametre
Aralık
Notlar
Giriş ücreti (blind)
≥ 1 zł
ödül havuzu = bahsin 2 katı
Minimum bakiye
≥ giriş ücreti
bu eşiğin altında otursahiptir: engellenir
Çuha rengi
HEX
sukno, rynienki i cienie hesaplanır ile tego koloru
Top çapı
18–44 px
fizyka skaluje się proporcjonalnie
Hamle süresi
5–300 s
„X s/hamle"
Masa boyutu
320–1600 × 280–1400 px
yalnızca masa boyutu değişir — toplar yuvarlak, arayüz sabit boyutta (letterbox)
Masa kartları: parametreler, oyuncular 0–2/2, masadaki ödül havuzu ve durum; işlemler:
Durdur/Sürdür, Önizleme (tryb tylko-do-odczytu), Sil.
Oyuncu listesi: kullanıcı adı, bakiye, mevcut masa ve rütbe açılır menüsü.
Świeża instalacja oluşturur 1 masa. Ostrzeżenie przy domyślnym haśle yöneticinin.
Oyun arayüzü
Pasek oyuncular u góry: avatar + kullanıcı adı + grup + miniatury top; etkin oyuncu
sahiptir: altın renkli, yanıp sönen avatar çerçevesi; pośrodku ödül havuzu i düğme ZASADY oyunun.
Panel pod stołem: vuruş noktası, sokulan toplar (sırayla), tur/hamle.
Pasek info: sıra, fauller, eldeki beyaz top, topların hareketi ve oyun durumu.
“Oyunu başlat” — masanın ortasındaki düğme; oyun bitince “Rövanş” olur.
Dikey mod (telefon): gdy ekran wyższy niż szerszy üzerinde urządzeniu mobilnym,
masa renderuje się obrócony o −90°, dopasowany -e kadar ekranu. Cienie/refleksy kompensują obrót
(światło zostaje ekranowe), napisy i % VIP są kontr-obrócone. üzerinde komputerze zawsze yatay.
==================== 12 ====================
12. Güvenlik katmanı
(plik6).php ortak moduł eklenen aracılığıyla her herkese açık dosya PHP:
Alan adı lisansı (hırsızlık önleme): skrypt działa yalnızca üzerinde domenach ile listy
SEC_LICENSED_HOSTS; girdi .domena tüm alt alan adlarını kapsar.
Nielicencjonowana domena → HTTP 403.
Oturum: ciasteczko HttpOnly + SameSite=Lax + secure (HTTPS),
use_strict_mode, regeneracja ID sonra zalogowaniu.
CSRF: token sesji gerekli we wszystkich akcjach zmieniających durum
(formularze, API yöneticinin, API oyunun).
Rate limiting: oturum açma yöneticinin 5/5 min, oturum açma oyuncunun 8/5 min,
kayıt 5/10 min — liczniki per IP içinde baza/_ratelimit/.
Nagłówki: X-Frame-Options, nosniff, Referrer-Policy (także içinde .htaccess).
.htaccess: blokada listingu, plików ukrytych, rozszerzeń danych
(.txt .json .hash .bak .zip …) ve katalogów dosya specyfikacja.html .
Parolalar: oyuncular için — password_hash (bcrypt); yönetici için özet şurada:
.hash (poza kodem).
Kullanıcı adı: whitelist [A-Za-z0-9_-]{2,20} — eliminuje XSS aracılığıyla kullanıcı adı
içinde panelach i komunikatach.
Yetkilendirme: yalnızca kullanıcının kendi bakiyesi, yalnızca yönetici yapılandırmasındaki masalar,
yönetici önizlemesi salt okunurdur.
==================== 13 ====================
13. Teknik notlar
PHP 5.6, JSON/TXT veya SQL jako magazyn; kompatybilność ile prostym hostingiem Apache.
İstemci: saf JS + Canvas 2D, ES5; tek dosya 8.php olmadan zewnętrznych zależności.
Symulacja deterministyczna (SIM_DT = 1/240) — her iki gracze liczą identyczny hamle;
sonuç -ebilir zgłosić herhangi ile nich, sunucu waliduje.
Współrzędne fizyki zawsze içinde układzie 1000×620; TABLE_SCALE to yalnızca skala rysowania.
Tüm durum yazımları flock; json_encode başarısız olursa →
önceki durum korunur (dosya temizlenmez).
-e kadar pełnej ochrony kodu źródłowego przed kradzieżą: ionCube Encoder / SourceGuardian
(blokada domeny to bariera, değil szyfr).