Une partie de poker
Téléchargez le code du jeu de poker dans le dossier nodejs :
- nodejs
- node_modules
- So-o.js
- OL.js
- Root.js
- ...
- Makefile
- ...
- poker
- poker.js
- Card.js
- Hand.js
- Deck.js
- ...
Créez le dossier nodejs avec le sous-dossier node_modules :
$ mkdir -p ~/nodejs/node_modules
Extrayez les fichiers ZIP dans le dossier nodejs :
$ unzip so-o-js.zip poker-js.zip
Liez tous les fichiers du code de So-o et du jeu de poker dans le dossier node_modules en remplaçant l'extension .js par .mjs :
$ make setup
mkdir node_modules
for f in So-o.js Root.js OL.js Once.js Application.js Responder.js; do \
ln -f $f node_modules/`basename $f .js`.mjs; \
done
if [ -d poker ]; then \
ln -f poker/poker.js `basename poker.js .js`.mjs; \
for f in Deck.js Hand.js Card.js; do \
ln -f poker/$f node_modules/`basename $f .js`.mjs; \
done \
fi
Le script a aussi créé un lien du fichier poker/poker.js vers le fichier poker.mjs dans le répertoire courant.
Exécutez le programme poker.mjs :
$ nodejs --experimental-modules poker
3h,4h,4s,Jd,6c -> ONEPAIR
Keep (1-5...)? 23
Vous avez une paire. Le programme demande quelles cartes vous voulez garder. Entrez 23 pour garder la deuxième et la troisième carte et tirer 3 nouvelles cartes. Le programme affiche le résultat du second tirage :
Js,4h,4s,Ks,4c -> THREEOFKIND
Play or (q)uit?
Vous avez un brelan. Appuyez sur Entrée pour rejouer :
3c,Ah,2s,7d,3d -> ONEPAIR
Keep (1-5...)? 15
3c,5h,3s,5d,3d -> FULLHOUSE
Play or (q)uit? q
Entrez q pour quitter le programme.
CODE
- import * as os from 'os';
- import * as readline from 'readline';
Donne accès aux modules os et readline de Node.js.
- import { sendmsg } from 'So-o';
Importe la fonction sendmsg
de So-o. Le fichier So-o.js inclut automatiquement la classe Root.
- import 'Deck';
Importe la classe Deck.
- (async () => {
- })();
Le programme s'exécute dans une fonction de fermeture asynchrone.
- const deck = sendmsg(sendmsg(Deck, 'new', true), 'shuffle');
Crée un jeu de cartes et le mélange.
- const terminal = readline.createInterface({ input: process.stdin, output: process.stdout });
Crée l'interface avec le terminal.
- const ask = (q) => new Promise((resolve) => terminal.question(`${q}? `, (r) => resolve(r.trim())));
Crée la promesse utilisée pour afficher un message d'invite à l'utilisateur et retourner la réponse.
- let play = true;
- while (play) {
- }
Joue tant que l'utilisateur n'a pas quitté le programme.
- let hand = sendmsg(deck, 'hand');
- terminal.write(sendmsg(hand, 'toString'));
- terminal.write(os.EOL);
Crée une main et l'affiche à l'utilisateur.
- await ask('Keep (1-5...)').then((s) => {
- let m = s.match(/[1-5]/g);
- let keep = m ? m.map((s) => Number.parseInt(s)) : [];
- for (let i = 1; i <= 5; i++) {
- if (keep.indexOf(i) == -1)
- sendmsg(hand, 'setCard', i, sendmsg(deck, 'deal'));
- }
- });
Demande à l'utilisateur de choisir les cartes qui doivent être conservées. Attend la réponse. Tire une nouvelle carte du paquet pour chaque carte qui doit être remplacée.
- terminal.write(sendmsg(hand, 'toString'));
- terminal.write(os.EOL);
Affiche la main finale à l'utilisateur.
- await ask('Play or (q)uit').then((s) => {
- if (s.charAt(0) == 'q' || s.charAt(0) == 'Q')
- play = false;
- });
Demande à l'utilisateur si la partie doit continuer. Sort de la boucle si la réponse commence par un q ou un Q. Sinon, repart pour un tour.
- terminal.close();
Ferme le terminal et quitte le programme.
Commentaires