Script de Billar 8-ball script php js ajax - script billiard php5.6 php8.0 download v. 10.10.2026
Juego multijugador de 8-ball para dos jugadores en internet[cite: 5]. Backend: json y sql[cite: 5]. Frontend: JavaScript ES5 + Canvas 2D[cite: 5].
El servidor es la autoridad de estado (anti-cheat)[cite: 5].
Fig. 1 — Pantalla de juego. Desde la izquierda: barra de jugadores sobre la mesa (avatar + usuario + bote),
mesa con el triángulo de bolas colocado y la blanca en la línea de saque, panel derecho: PUNTO DE GOLPEO
(bola blanca grande para ajustar el efecto), BOLAS EMBOCADAS (orden) y RONDA.
Debajo de la mesa, el mensaje de estado "Esperando jugadores" y el botón "Sentarse a la mesa".
Fig. 2 — Pruebas del motor de tiros (A–H). Para cada tiro, el motor informa:
acierto/fallo en tronera, posición final y velocidad final, así como la trayectoria completa de la bola.
Escenarios probados: embocar en tronera esquinera y central (A, F, G, H), rebote en banda (B),
rodar a lo largo de la banda sin caer (C, D) y trayectoria pasando junto a la tronera (E).
Registro, inicio de sesión, vestíbulo (lobby) con lista de mesas, saldo y rango del jugador
(plik1).php
Página de juego: canvas, renderizado, física del cliente, apuntado, paneles de interfaz (UI)
(plik2).php
API de juego: estado de la mesa, sentarse, tiros, validación de resultados, botes, límites de tiempo
(plik3).php
API del vestíbulo: lista de mesas con parámetros, saldo del jugador conectado
admin.php
Panel de administración: mesas (parámetros), jugadores, rangos, vista previa de la mesa
(plik4).php
Capa de seguridad compartida: licencia de dominio, sesión, CSRF, limitación de tasa (rate-limit), cabeceras
stoly
Configuración de mesas (apuesta, saldo mín., color, Ø de bolas, tiempo, dimensiones)
pamiec
Estado activo de la partida en la mesa (bolas, asientos, turno, fase, bote)
bazy
Cuenta de jugador: datos de usuario (usuario + hash de contraseña), estado de cuenta (saldo), rango (vip)
hash
Hash de la contraseña del administrador (bcrypt)
logowanie/_ratelimit/
Contadores de intentos (limitación de inicio de sesión/registro, por IP)
<login>.png
Avatar del jugador (opcional, en el directorio raíz)
bilard2.png / bilard3.png
Imágenes de documentación (pruebas de física / captura de pantalla del juego)
Fig. 3 — Flujo: páginas PHP → API → almacenamiento de archivos (JSON/TXT) → panel de administración.
3. Reglas del juego 8-ball
Colocación: la blanca en la línea de saque (x=260), triángulo de 15 bolas con el vértice en x=700;
la bola negra (8) en el centro del triángulo, en las esquinas una bola lisa y una rayada.
Saque: primer tiro con la blanca hacia el triángulo; el jugador que saca se sortea por el servidor (mt_rand).
Grupos: el jugador que primero emboque una bola en el estado playing obtiene ese grupo —
lisas (1–7) o rayadas (9–15); el oponente recibe el otro grupo.
Turno: embocar una bola propia = continúa el tiro; fallo o falta = el turno pasa
al oponente.
Bola negra (8): legal solo después de haber metido todo el propio grupo; debe entrar en la tronera
en diagonal respecto a la tronera donde se metió la última bola (resaltada con un anillo dorado).
La negra demasiado pronto o en la tronera incorrecta = derrota inmediata.
Faltas (consecuencia: el oponente toma la bola blanca en la mano)
Primer contacto de la blanca con una bola del oponente o con la negra (cuando no es legal)
La blanca no tocó ninguna bola y rebotó en menos de 3 bandas diferentes
Embocar la bola blanca o una bola del oponente (la bola del oponente cuenta para él)
Expiración del tiempo por movimiento / límite de tiempo para ejecutar el tiro
Fin del juego
Victoria: la negra en la tronera requerida → el ganador se lleva el bote (2× la apuesta)
Incomparecencia (Walkover): el oponente abandonó la mesa o no regresó en 30 s → el bote es para el jugador presente
Revancha: después del estado finished, el botón "Revancha" deduce la tarifa de inscripción nuevamente
4. Geometría de la mesa y troneras
Las coordenadas de física están siempre en el sistema lógico de 1000×620 px (paño de (53,53) a (947,547));
el escalado de pantalla no altera la física. Cada una de las 6 troneras es un corredor-guía con mandíbulas
en forma de embudo — no un punto. Una bola en el corredor rueda por un canal hasta el agujero oscuro (radio ~25 px)
y solo allí desaparece; las paredes del canal la rebotan hacia el centro (sin "bandas invisibles").
Fig. 4 — Geometría de la mesa: paño, 6 troneras numeradas y regla de la tronera diagonal para la negra.
eje a lo largo de PAXIS; las esquinas tienen un "faldón" hasta t=34
Diagonales de troneras
0↔4, 1↔3, 2↔5
tronera requerida para la bola negra
Bloqueo de colocación de la blanca
PCAP + radio ≈ cueR+15
prohibido colocar en la zona de la tronera / sobre otra bola
5. Motor de física (cliente, determinista)
Constante
Valor
Significado
SIM_DT
1/240 s
paso de simulación fijo — determinismo en ambos clientes
FRICTION
0.997 / paso
fricción de rodadura
RAIL_REST
0.8
coeficiente de restitución de la banda
STOP_V
8 px/s (escalado con Ø)
umbral de parada de la bola
MAX_SPEED
1600 px/s (escalado con Ø)
fuerza del tiro = 1.0
Colisiones de bolas: elásticas, con separación de posiciones — la separación nunca empuja una bola
fuera del corredor de la tronera de vuelta hacia la banda.
Efecto (spin): lateral (x) curva la trayectoria de la blanca antes del primer contacto;
superior/inferior (y) modifica el comportamiento tras el contacto (follow/draw). Se restablece después de cada tiro.
Escalado: la fuerza del tiro y el umbral de parada se escalan con el diámetro de las bolas
(base Ø28 px) — las bolas de cualquier tamaño se mueven de forma natural.
Rodadura de bolas: rotación = distancia/radio; los números y las rayas ruedan sobre la esfera
según la dirección del movimiento (360° completos).
Eventos de simulación:pocketed (bola+tronera, en orden),
firstHit (primer contacto de la blanca), rails (conjunto de bandas tocadas).
Eventos + posiciones finales reportados al servidor como resultado del tiro.
6. Controles y punto de golpeo
Acción
PC
Teléfono (táctil)
Apuntar
el ratón establece la dirección; línea de objetivo + bola fantasma + trayectoria de rebote
arrastrar establece la dirección y la fuerza en un solo gesto ("tirachinas")
Fuerza del tiro
mantener y tirar a lo largo del taco hacia atrás (hacia adelante disminuye); soltar = tiro
igual que al apuntar
Punto de golpeo
bola blanca grande en el panel: arriba = seguir a la bola (follow), abajo = retroceder (draw), lados = arco y efecto en la banda
Blanca en la mano
un clic coloca inmediatamente
arrastrar el fantasma y soltar el dedo coloca
Validación por el servidor de la posición de la blanca (place_cue): dentro del paño, no muy cerca de la tronera,
no se superpone a otra bola.
7. Multijugador — máquina de estados y tiempo
Fig. 5 — Máquina de estados de la mesa.
Límite
Constante / configuración
Consecuencia
Tiempo por movimiento
turn_time por mesa (5–300 s, pred. 30)
falta: turno + blanca en la mano del oponente
Regreso a la mesa
SEAT_TIMEOUT = 30 s
asiento reservado 30 s; luego liberado, en juego = walkover
Resultado del tiro
SHOT_TIMEOUT = 150 s
el tiro expira → falta de tiempo
Heartbeat
sondeo (polling) de get_status cada ~1.2 s
actualiza la actividad reciente del jugador (last_activity)
El tiempo por movimiento se cuenta solo después de que todas las bolas se hayan detenido (fase aim) —
la barra de tiempo aparece después de la simulación. Todas las operaciones de estado son atómicas bajo flock
(withState) — sin condiciones de carrera en escritura.
8. API — lista completa de acciones
bilard_api.php?table=<id>&action=<acción> (requiere sesión; las acciones POST requieren token CSRF)
Acción
Método
Efecto
get_status
GET
Estado completo: bolas, asientos (+rango/saldo/inactivo), turno, fase, bote, time_left/time_limit, pending_shot, potted_order, moves/round, configuración (felt, ball_r, cue_r, table_w/h), saldo y rango del invocador
test_session
GET
Diagnóstico: user, userId, balance
sit
POST
Ocupar asiento (verifica saldo mín., bloqueo de mesa, asiento libre)
leave_table
POST
Liberar asiento; durante el juego = rendición (walkover)
start_game
POST
Iniciar cuando ambos están sentados; cobra la tarifa de entrada, bote = 2× apuesta, sortea quién rompe
place_cue
POST
Colocación de la blanca en la mano; validación de posición (paño, troneras, colisiones)
shoot
POST
Registro del tiro (ángulo, fuerza, efecto) → pending_shot, fase moving
shot_result
POST
Resultado de la simulación (bolas + eventos) → validación → nuevo estado; reportado por cualquier jugador sentado (resultado determinista)
Anti-cheat — validación de shot_result en el lado del servidor
16 bolas, posiciones dentro de los límites del paño (fuera del paño solo en los corredores de las troneras)
Una bola no puede: desaparecer sin un embocamiento reportado, aparecer de la nada, superponerse a otra
(distancia mín. 12 px)
Embocamientos: sin duplicados, solo bolas presentes en la mesa, estructura correcta (bola 0–15, tronera 0–5)
El primer contacto debe ser legal (grupo / negra según las reglas)
Resultado rechazado: contador de fallos (fails); 2 reportes erróneos coincidentes = falta y fin del tiro
api.php?action=… (requiere sesión)
Acción
Efecto
get_tables
Lista de mesas: asientos, estado, blind, min_balance, color, Ø de bolas, tiempo, dimensiones, stopped
get_balance&user=<md5>
Saldo — exclusivamente el propio (o del admin); validación del formato de userId
admin.php?api=… (requiere sesión de administrador; POST con token CSRF)
Acción
Efecto
state
Panel de control: parámetros de las mesas, jugadores en las mesas, bote, estadísticas (registrados / en línea)
players
Lista de jugadores: usuario, saldo, mesa actual, rango
set_rank
Cambio de rango del jugador (normal/silver/gold/vip)
create
Nueva mesa con parámetros
delete
Eliminación de la mesa; si hay un juego en curso, reembolso del bote a los jugadores sentados (la mitad a cada uno)
toggle_stop
Detener/reanudar la mesa; tras la reanudación, cronómetro de movimiento fresco
Sentarse requiere min_balance; start_game cobra de ambos jugadores
blind (tarifa de entrada) → bote = 2× apuesta.
El ganador se lleva todo el bote; al eliminar la mesa durante el juego, el bote se reembolsa a partes iguales.
Saldo en baza/<uid>/stankonta.txt; escrituras bajo LOCK_EX.
10. Rangos y calculadora VIP
Rango
Asignado
Privilegio
normal
automáticamente al registrarse
—
silver / gold
administrador (lista de jugadores)
insignia junto al usuario
VIP
administrador
% dinámico de probabilidad de embocar al apuntar
Calculadora VIP (cliente, solo vista previa): calcula para la bola objetivo la trayectoria de la bola golpeada —
directamente, tras rebotar en la banda y en combinación (bola empujada por la golpeada). El porcentaje resulta
de la intersección física de la trayectoria con la garganta del canal de la tronera, el ángulo de entrada y los obstáculos en la ruta. Se calculan
solo las bolas legales (grupo / cualquiera cuando los grupos no están asignados). Verde ≥ 50%, rojo por debajo;
texto horizontal también en modo vertical.
11. Panel de administración (admin.php)
Mesas
Parámetro
Rango
Notas
Tarifa de entrada (blind)
≥ 1 moneda
bote = 2× apuesta
Saldo mín.
≥ tarifa de entrada
bloqueo de sentarse por debajo del umbral
Color del paño
HEX
paño, canaletas y sombras calculados a partir de este color
Diámetro de bolas
18–44 px
la física se escala proporcionalmente
Tiempo por movimiento
5–300 s
"X s/movimiento"
Tamaño de mesa
320–1600 × 280–1400 px
solo mesa — bolas redondas, interfaz de tamaño fijo (letterbox)
Tarjetas de mesas: parámetros, jugadores 0–2/2, bote en la mesa, estado; acciones:
Detener/Reanudar, Vista previa (modo de solo lectura), Eliminar.
Estadísticas: jugadores registrados, jugadores en línea (actividad < 120 s), número de mesas.
Lista de jugadores: usuario, saldo, mesa actual, menú desplegable de rangos.
Una instalación nueva crea 1 mesa. Advertencia si se usa la contraseña de administrador predeterminada.
Interfaz de juego
Barra de jugadores arriba: avatar + usuario + grupo + miniaturas de bolas; el jugador activo
tiene un borde de avatar dorado parpadeante; en el centro el bote y el botón REGLAS DEL JUEGO.
Panel debajo de la mesa: punto de golpeo, bolas embocadas en orden, ronda/movimiento.
Barra de información: turno, faltas, blanca en la mano, movimiento de bolas, estado del juego.
"Iniciar juego" — botón en el medio de la mesa; al terminar = "Revancha".
Modo vertical (teléfono): cuando la pantalla es más alta que ancha en un dispositivo móvil,
la mesa se renderiza rotada −90°, adaptada a la pantalla. Las sombras/reflejos compensan la rotación
(la luz permanece orientada a la pantalla), los textos y el % VIP están contrarrotados. En PC siempre en horizontal.
12. Capa de seguridad
(plik6).php módulo compartido incluido por cada archivo PHP público:
Licencia de dominio (anti-robo): el script solo funciona en los dominios de la lista
SEC_LICENSED_HOSTS; la entrada .dominio incluye todos los subdominios.
Dominio no autorizado → HTTP 403.
Sesión: cookie HttpOnly + SameSite=Lax + seguro (HTTPS),
use_strict_mode, regeneración de ID tras el inicio de sesión.
CSRF: token de sesión requerido en todas las acciones que cambian el estado
(formularios, API de admin, API de juego).
Rate limiting: inicio de sesión de admin 5/5 min, inicio de sesión de jugador 8/5 min,
registro 5/10 min — contadores por IP en baza/_ratelimit/.
Cabeceras: X-Frame-Options, nosniff, Referrer-Policy (también en .htaccess).
.htaccess: bloqueo de listados, archivos ocultos, extensiones de datos
(.txt .json .hash .bak .zip …) y directorios de archivos de specyfikacja.html.
Contraseñas: de jugadores — password_hash (bcrypt); de admin — hash en
.hash (fuera del código).
Usuario (Login): lista blanca (whitelist) [A-Za-z0-9_-]{2,20} — elimina XSS mediante el nombre de usuario
en paneles y mensajes.
Autorización: saldo solo propio, mesas solo de la configuración del administrador,
vista previa de administrador de solo lectura.
13. Notas técnicas
PHP 5.6, JSON/TXT o SQL como almacenamiento; compatibilidad con alojamiento Apache simple.
Cliente: JS puro + Canvas 2D, ES5; un solo archivo 8.php sin dependencias externas.
Simulación determinista (SIM_DT = 1/240) — ambos jugadores calculan un movimiento idéntico;
el resultado puede ser reportado por cualquiera de ellos, el servidor lo valida.
Coordenadas de física siempre en el sistema 1000×620; TABLE_SCALE es solo la escala de dibujo.
Todas las escrituras de estado son atómicas bajo flock; si json_encode falla →
se conserva el estado anterior (sin vaciar el archivo).
Para una protección completa del código fuente contra robos: ionCube Encoder / SourceGuardian
(el bloqueo de dominio es una barrera, no un cifrado).