Dix jeux, un moteur
L'ajout d'une nouvelle variante solitaire coûte ici un objet de configuration. Tout le reste — glisser, annuler, donner des conseils, marquer, enregistrer — existe déjà.
Dix jeux, c'est neuf jeux de trop.
Klondike, Spider, FreeCell, Yukon, Russe, Pyramid, TriPeaks, Golf, Forty Thieves et Canfield sont, du point de vue d'un joueur, dix jeux différents. Du point de vue du code, ils sont dix variations sur un ensemble remarquablement petit d'idées: des piles de cartes, une règle sur ce qui peut être placé où, une règle sur le moment où le jeu est gagné, et une mise en page.
La façon naïve de construire un site comme celui-ci est d'écrire dix jeux. Cela vous donne dix implémentations distinctes de dragage, dix systèmes de démoulage, dix bugs subtilement différents, et une taxe permanente sur tout changer. Nous avons écrit un moteur à la place.
Ce que possède le moteur
Tout ce qui n'est pas une règle appartient au moteur partagé.
| Les poignées du moteur | Pourquoi il est partagé |
|---|---|
| Mise en page et calibrage | Chaque jeu est un ensemble de positions de pile sur un tableau qui doit s'adapter à n'importe quel écran |
| Faites glisser et déposez, appuyez sur le bouton | Interaction identique dans les dix jeux; les joueurs ne devraient jamais réapprendre |
| Annuler | Snapshot tout l'état, le restaurer. Règles-agnostique par le design |
| Minuterie, score, nombre de mouvements | Même HUD partout, avec des règles de notation par match passées dans |
| Conseils | Le moteur demande au jeu "qu'est-ce qu'un bon mouvement ici?" et anime la réponse |
| Sauvetage et reprise | Un serialiser pour chaque jeu |
| Détection et célébration des victoires | Le jeu fournit le test; le moteur fournit les confettis |
Qu'est-ce qu'un jeu en fait
Un jeu, dans cette base de code, est un objet qui répond à une poignée de questions. Combien de jeux? Où vont les piles? Comment est la transaction initiale? Vu une carte et une pile cible, est-ce légal? Est-ce que le jeu est gagné? Quel est un indice raisonnable?
Yukon et Russe Solitaire sont les illustrations les plus claires. Ils sont le même jeu sauf que Yukon construit en alternance des couleurs et Russe construit en bas dans la même combinaison. Ils partagent un fichier, et la différence entre eux est un booléen unique passé dans la même fonction d'usine.
Pas de cadre, pas de construction
Il n'y a pas de React ici, pas de bundler, pas de transpiler et pas de _modules de nœuds Les pages sont en HTML statique, les styles sont deux feuilles de style, et la logique est simple modules JavaScript chargés directement par le navigateur.
Les pages elles-mêmes sont générées — les pages de jeu, les guides et ce blog viennent tous de petits scripts Node qui lisent un fichier de contenu et d'écrire HTML. Cela nous donne le seul avantage réel d'un système de construction, qui est que les meubles de page partagée ne peuvent pas dériver hors de la synchronisation, sans le coût, qui est que rien ne fonctionne jusqu'à ce que la chaîne d'outils le fasse.
Même les effets sonores évitent le modèle. Chaque flip, place, chime et buzz est synthétisé en direct avec l'API Web Audio plutôt que chargé comme un fichier audio, il n'y a donc rien à télécharger et rien à concéder.
Ce que ça te coûte de charger
Le résultat pratique est une page de jeu qui est quelques dizaines de kilooctets de balisage, styles et script, plus les images de carte, qui sont préchargés sur les pages de jeu de sorte que le premier flip n'apparaît jamais vide, et mis en cache agressivement parce qu'un jeu de cartes ne change pas.
Pas de traqueurs, pas de scripts publicitaires, pas de mur de consentement devant le tableau. C'est en partie une décision de valeurs et en partie une performance: le script tiers le plus rapide est celui qui n'est pas là.
La seule chose assis devant tout cela est Cloudflare, qui cache le site et filtre le trafic malveillant. Il n'ajoute rien aux pages de jeu. politique de confidentialité c'est ce qu'il voit.
Où le moteur s'arrête
Le site a maintenant douze jeux, et dix d'entre eux fonctionnent sur le moteur décrit ci-dessus. Coeurs et Pâtes, ajouté en août 2026, ne pas, et la raison vaut la peine de dire clairement: ce ne sont pas des jeux de patience.
Tout au-dessus suppose un joueur contre un jeu. Piles vous traînez les cartes entre, un état de la planche, un test pour savoir si le jeu est gagné. Les coeurs et les piques sont des jeux à prendre pour quatre. Les mains sont distribuées, les cartes sont passées ou les offres sont faites, quatre sièges jouent à tour de rôle, les tours sont gagnés, et les scores s'accumulent au-dessus de la ronde jusqu'à ce que quelqu'un atteigne une cible. Il n'y a pas de pile pour déposer une carte sur et aucune position gagnante. Forcer que par le biais d'un objet de configuration conçu pour tableaux aurait produit une version pire des deux jeux et un moteur pire.
Ils partagent donc ce qui est réellement partagé: le jeu, l'œuvre de carte, les effets sonores, le feutre, l'en-tête, l'habitude de sauvegarder et de reprendre et le mobilier de page. Sous eux, ils ont leur propre petit module de table, qui connaît les sièges, un ordre de virage, un tour dans le milieu et les adversaires de l'ordinateur qui pensent à quelle carte jouer plutôt que de choisir un légal au hasard. Deux moteurs, douze jeux. La règle est la même qui a produit le premier moteur: partager ce qui est réellement le même, et s'arrêter là.
Foire aux questions
Ce site fonctionne-t-il hors ligne?
Partiellement. Les pages sont statiques et cache bien, et chaque jeu enregistre son état localement, de sorte qu'une connexion floue ne perdra pas votre main. Il n'y a pas d'installation hors ligne complète.
Vous suivez les joueurs?
Les statistiques de l'état du jeu et de la durée de vie sont stockées dans votre propre navigateur en utilisant localStorage. Elles ne sont envoyées nulle part, et la compensation de vos données de navigateur les efface.
Vous ajouterez d'autres jeux?
Oui. Pour les variantes solitaires, le moteur est conçu de sorte qu'un nouveau jeu soit un objet de configuration plutôt qu'une nouvelle base de code, ce qui rend leur ajout réaliste. Des jeux qui ne sont pas du tout la patience, comme les Hearts et les Spades, obtiennent leur propre module au lieu d'être forcés à le traverser.