Script de billard 8-ball php js ajax - script billiard php5.6 php8.0 download v. 10.10.2026
Jeu multijoueur 8-ball à deux joueurs sur Internet[cite: 4]. Backend : json et sql. Frontend : JavaScript ES5 + Canvas 2D[cite: 4].
Le serveur est l'autorité d'état (anti-cheat)[cite: 4].
Fig. 1 — Écran de jeu. De gauche à droite : barre des joueurs au-dessus de la table (avatar + identifiant + cagnotte),
table avec le triangle de billes disposé et la blanche sur la ligne de placement, panneau droit : POINT D'IMPACT
(grande boule blanche pour régler l'effet), BILLES EMPOCHÉES (ordre) et MANCHE.
Sous la table, le message d'état « En attente de joueurs » et le bouton « S'asseoir à la table ».
Fig. 2 — Tests du moteur de tir (A–H). Pour chaque tir, le moteur rapporte :
réussite/échec dans la poche, position finale et vitesse finale ainsi que la trajectoire complète de la bille.
Scénarios testés : empochage dans une poche d'angle et centrale (A, F, G, H), rebond sur la bande (B),
roulement le long de la bande sans tomber (C, D) et trajectoire manquant la poche (E).
Inscription, connexion, lobby avec liste des tables, solde et rang du joueur
(plik1).php
Page de jeu : canvas, rendu, physique client, visée, panneaux UI
(plik2).php
API de jeu : état de la table, assise, tirs, validation du résultat, cagnottes, limites de temps
(plik3).php
API du lobby : liste des tables avec paramètres, solde du joueur connecté
admin.php
Panneau admin : tables (paramètres), joueurs, rangs, aperçu de la table
(plik4).php
Couche de sécurité partagée : licence de domaine, session, CSRF, rate-limit, en-têtes
stoly
Configuration des tables (mise, solde min., couleur, Ø des billes, temps, dimensions)
pamiec
État actif du jeu sur la table (billes, sièges, tour, phase, cagnotte)
bazy
Compte joueur : données utilisateur (identifiant + hachage du mot de passe), état du compte (solde), rang (vip)
hash
Hachage du mot de passe administrateur (bcrypt)
logowanie/_ratelimit/
Compteurs de tentatives (limitation de connexion/inscription, par IP)
<login>.png
Avatar du joueur (optionnel, dans le répertoire racine)
bilard2.png / bilard3.png
Images de documentation (tests de physique / capture d'écran du jeu)
Fig. 3 — Flux : pages PHP → API → stockage de fichiers (JSON/TXT) → panneau d'administration.
3. Règles du jeu 8-ball
Placement : bille blanche sur la ligne de départ (x=260), triangle de 15 billes avec la pointe à x=700 ;
la noire (8) au centre du triangle, aux coins une bille pleine et une rayée.
Casse : premier tir de la blanche dans le triangle ; le joueur qui effectue la casse est tiré au sort par le serveur (mt_rand).
Groupes : le joueur qui, en premier dans l'état playing, empoche une bille se voit attribuer son groupe —
pleines (1–7) ou rayées (9–15) ; l'adversaire reçoit l'autre groupe.
Tour : empocher sa propre bille = nouveau tir ; raté ou faute = le tour passe
à l'adversaire.
Noir (8) : valide uniquement après avoir empoché l'intégralité de son groupe ; doit entrer dans la poche
en diagonale par rapport à la poche où la dernière bille a été empochée (mise en valeur par un anneau
doré). Noir trop tôt ou dans la mauvaise poche = défaite immédiate.
Fautes (conséquence : l'adversaire prend la blanche en main)
Premier contact de la blanche avec une bille de l'adversaire ou la noire (lorsqu'elle n'est pas valide)
La blanche n'a touché aucune bille et n'a rebondi sur aucune des 3 bandes différentes minimum
Empochage de la blanche ou d'une bille de l'adversaire (la bille de l'adversaire compte pour lui)
Dépassement du temps de mouvement / du temps limite pour effectuer le tir
Fin de partie
Victoire : la noire dans la poche requise → le vainqueur remporte la cagnotte (2× la mise)
Forfait : l'adversaire a quitté la table ou n'est pas revenu en 30 s → cagnotte pour le joueur présent
Revanche : après l'état finished, le bouton « Revanche » prélève à nouveau la mise
4. Géométrie de la table et poches
Les coordonnées physiques sont toujours dans le système logique 1000×620 px (tapis de (53,53) à (947,547)) ;
le redimensionnement de l'écran ne modifie pas la physique. Chacune des 6 poches est un couloir-guide avec
des mâchoires en forme d'entonnoir — pas un point. Une bille dans le couloir roule sur une goulotte vers le trou noir (rayon ~25 px)
et n'y disparaît qu'à ce moment-là ; les parois du canal la renvoient vers le centre (pas de « bandes invisibles »).
Fig. 4 — Géométrie de la table : tapis, 6 poches numérotées et règle de la poche diagonale pour la noire.
axe le long de PAXIS ; les coins ont un « tablier » jusqu'à t=34
Diagonales de poches
0↔4, 1↔3, 2↔5
poche requise pour la noire
Verrouillage du placement de la blanche
PCAP + rayon ≈ cueR+15
interdiction de placer dans la zone de la poche / sur une autre bille
5. Moteur physique (client, déterministe)
Constante
Valeur
Signification
SIM_DT
1/240 s
pas de simulation fixe — déterminisme sur les deux clients
FRICTION
0.997 / pas
frottement de roulement
RAIL_REST
0.8
coefficient de restitution de la bande
STOP_V
8 px/s (mis à l'échelle avec Ø)
seuil d'arrêt de la bille
MAX_SPEED
1600 px/s (mis à l'échelle avec Ø)
force du tir = 1.0
Collisions des billes : élastiques, avec séparation des positions — la séparation ne pousse jamais une bille
hors du couloir de poche pour la ramener sur la bande.
Effet (spin) : latéral (x) incurve la trajectoire de la blanche avant le premier contact ;
haut/bas (y) modifie le comportement après le contact (follow/draw). Réinitialisé après chaque tir.
Mise à l'échelle : la force du tir et le seuil d'arrêt s'adaptent au diamètre des billes
(base Ø28 px) — les billes de toute taille se déplacent naturellement.
Roulement des billes : rotation = distance/rayon ; les numéros et les bandes roulent sur la sphère
selon la direction du mouvement (360° complets).
Événements de simulation :pocketed (bille+poche, dans l'ordre),
firstHit (premier contact de la blanche), rails (ensemble des bandes touchées).
Événements + positions finales signalés au serveur comme résultat du tir.
6. Contrôles et point d'impact
Action
PC
Téléphone (tactile)
Visée
la souris définit la direction ; ligne de visée + bille fantôme + trajectoire de rebond
le glissement définit la direction et la force en un seul geste (« fronde »)
Force du tir
maintenir et tirer le long de la queue vers l'arrière (vers l'avant, elle diminue) ; relâcher = tir
comme pour la visée
Point d'impact
grande boule blanche dans le panneau : haut = tirer derrière la bille (follow), bas = ramener (draw), côtés = arc et effet sur la bande
Blanche en main
un clic place immédiatement
glisser le fantôme et relâcher le doigt place
Validation par le serveur de la position de la blanche (place_cue) : dans le tapis, pas trop près de la poche,
ne chevauche pas une autre bille.
7. Multijoueur — machine à états et temps
Fig. 5 — Machine à états de la table.
Limite
Constante / configuration
Conséquence
Temps par coup
turn_time par table (5–300 s, déf. 30)
faute : tour + blanche en main pour l'adversaire
Retour à la table
SEAT_TIMEOUT = 30 s
siège réservé 30 s ; puis libéré, en jeu = forfait
Résultat du tir
SHOT_TIMEOUT = 150 s
le tir expire → faute de temps
Heartbeat
interrogation get_status toutes les ~1,2 s
rafraîchit le paramètre last_activity du joueur
Le temps par coup est compté uniquement après l'arrêt de toutes les billes (phase aim) —
la barre de temps apparaît après la simulation. Toutes les opérations d'état sont atomiques sous flock
(withState) — pas de conflits d'écriture.
8. API — liste complète des actions
bilard_api.php?table=<id>&action=<action> (nécessite une session ; les actions POST nécessitent un jeton CSRF)
Action
Méthode
Effet
get_status
GET
État complet : billes, sièges (+rang/solde/inactivité), tour, phase, cagnotte, time_left/time_limit, pending_shot, potted_order, moves/round, configuration (tapis, ball_r, cue_r, table_w/h), solde et rang de l'appelant
test_session
GET
Diagnostic : user, userId, balance
sit
POST
Prise de siège (vérifie le solde min., le verrouillage de la table, la place libre)
leave_table
POST
Libération du siège ; en cours de partie = abandon (forfait)
start_game
POST
Démarrage lorsque les deux sont assis ; prélève la mise, cagnotte = 2× la mise, tire au sort le joueur qui casse
place_cue
POST
Placement de la blanche en main ; validation de la position (tapis, poches, collisions)
shoot
POST
Enregistrement du tir (angle, force, spin) → pending_shot, phase moving
shot_result
POST
Résultat de la simulation (billes + événements) → validation → nouvel état ; signalé par l'un ou l'autre des joueurs assis (résultat déterministe)
Anti-cheat — validation côté serveur de shot_result
16 billes, positions dans les limites du tapis (hors du tapis uniquement dans les couloirs de poches)
Une bille ne peut pas : disparaître sans empochage déclaré, apparaître de nulle part, chevaucher une autre
(distance min. 12 px)
Empochages : pas de doublons, uniquement des billes présentes sur la table, structure correcte (bille 0–15, poche 0–5)
Le premier contact doit être légal (groupe / noire selon les règles)
Résultat rejeté : compteur fails ; 2 signalements erronés correspondants = faute et fin du tir
api.php?action=… (nécessite une session)
Action
Effet
get_tables
Liste des tables : sièges, statut, blind, min_balance, couleur, Ø des billes, temps, dimensions, arrêté
get_balance&user=<md5>
Solde — uniquement le sien (ou celui de l'admin) ; validation du format userId
admin.php?api=… (nécessite une session admin ; POST avec jeton CSRF)
Action
Effet
state
Tableau de bord : paramètres des tables, joueurs aux tables, cagnotte, statistiques (enregistrés / en ligne)
players
Liste des joueurs : identifiant, solde, table actuelle, rang
set_rank
Modification du rang du joueur (normal/silver/gold/vip)
create
Nouvelle table avec paramètres
delete
Suppression de la table ; en cours de partie, remboursement de la cagnotte aux joueurs assis (moitié-moitié)
toggle_stop
Arrêt/reprise de la table ; à la reprise, temps de coup réinitialisé
S'asseoir nécessite min_balance ; start_game prélève auprès des deux joueurs
blind (la mise) → cagnotte = 2× la mise.
Le vainqueur remporte toute la cagnotte ; en cas de suppression de la table pendant la partie, la cagnotte est remboursée de moitié.
Solde dans baza/<uid>/stankonta.txt ; écritures sous LOCK_EX.
10. Rangs et calculateur VIP
Rang
Attribué
Privilège
normal
automatiquement lors de l'inscription
—
silver / gold
admin (liste des joueurs)
badge à côté de l'identifiant
VIP
admin
% dynamique de chance d'empochage lors de la visée
Calculateur VIP (client, aperçu uniquement) : calcule pour la bille visée la trajectoire de la bille touchée —
directement, après rebond sur la bande et en combinaison (bille propulsée par la bille touchée). Le pourcentage provient
de l'intersection physique de la trajectoire avec la gorge du canal de poche, de l'angle d'entrée et des obstacles sur le parcours. Sont calculées
uniquement les billes légales (groupe / n'importe lesquelles si les groupes ne sont pas attribués). Vert ≥ 50%, rouge en dessous ;
texte horizontal également en mode portrait.
11. Panneau d'administration (admin.php)
Tables
Paramètre
Plage
Remarques
Mise (blind)
≥ 1 monnaie
cagnotte = 2× la mise
Solde min.
≥ mise
verrouillage de l'assise sous le seuil
Couleur du tapis
HEX
le tapis, les goulottes et les ombres sont calculés à partir de cette couleur
Cartes de tables : paramètres, joueurs 0–2/2, cagnotte sur la table, état ; actions :
Arrêter/Reprendre, Aperçu (mode lecture seule), Supprimer.
Statistiques : joueurs enregistrés, joueurs en ligne (activité < 120 s), nombre de tables.
Liste des joueurs : identifiant, solde, table actuelle, menu déroulant des rangs.
Une nouvelle installation crée 1 table. Avertissement en cas de mot de passe admin par défaut.
Interface de jeu
Barre des joueurs en haut : avatar + identifiant + groupe + miniatures des billes ; le joueur actif
a un bord d'avatar doré clignotant ; au centre, la cagnotte et le bouton RÈGLES DU JEU.
Panneau sous la table : point d'impact, billes empochées dans l'ordre, manche/coup.
Barre d'information : tour, fautes, blanche en main, mouvement des billes, état du jeu.
« Démarrer la partie » — bouton au milieu de la table ; après la fin = « Revanche ».
Mode portrait (téléphone) : lorsque l'écran est plus haut que large sur un appareil mobile,
la table s'affiche pivotée de −90°, adaptée à l'écran. Les ombres/reflets compensent la rotation
(la lumière reste orientée vers l'écran), les textes et le % VIP sont contre-pivotés. Toujours horizontal sur PC.
12. Couche de sécurité
(plik6).php module partagé inclus par chaque fichier PHP public :
Licence de domaine (anti-vol) : le script ne fonctionne que sur les domaines de la liste
SEC_LICENSED_HOSTS ; l'entrée .domaine couvre tous les sous-domaines.
Domaine non autorisé → HTTP 403.
Session : cookie HttpOnly + SameSite=Lax + secure (HTTPS),
use_strict_mode, régénération de l'ID après la connexion.
CSRF : jeton de session requis dans toutes les actions modifiant l'état
(formulaires, API admin, API de jeu).
Rate limiting : connexion admin 5/5 min, connexion joueur 8/5 min,
inscription 5/10 min — compteurs par IP dans baza/_ratelimit/.
En-têtes : X-Frame-Options, nosniff, Referrer-Policy (également dans .htaccess).
.htaccess : blocage du listing, des fichiers cachés, des extensions de données
(.txt .json .hash .bak .zip …) et des répertoires de fichiers du fichier specyfikacja.html .
Mots de passe : joueurs — password_hash (bcrypt) ; admin — hachage dans
.hash (en dehors du code).
Identifiant : liste blanche [A-Za-z0-9_-]{2,20} — élimine les failles XSS via l'identifiant
dans les panneaux et les messages.
Autorisation : solde personnel uniquement, tables issues uniquement de la configuration admin,
aperçu admin en lecture seule.
13. Notes techniques
PHP 5.6, JSON/TXT ou SQL comme stockage ; compatibilité avec un hébergement Apache simple.
Client : JS pur + Canvas 2D, ES5 ; un seul fichier 8.php sans dépendances externes.
Simulation déterministe (SIM_DT = 1/240) — les deux joueurs calculent un mouvement identique ;
le résultat peut être signalé par l'un ou l'autre, le serveur valide.
Coordonnées physiques toujours dans le système 1000×620 ; TABLE_SCALE n'est que l'échelle de dessin.
Toutes les écritures d'état sont atomiques sous flock ; échec de json_encode →
état précédent conservé (sans vider le fichier).
Pour une protection complète du code source contre le vol : ionCube Encoder / SourceGuardian
(le verrouillage de domaine est une barrière, pas un chiffrement).