Tron, un jeu dans le terminal

Et multi-joueur à distance sans aucun code réseau

Une capture d'écran du jeu. Deux "vélos" sous forme de points se déplacent sur une surface. Ils sont suivis d'un mur de lumière retraçant leurs parcours. A droite, en dehors de l'arène, sont affichées des informations sur l'emplacement des vélos et le temps depuis le début de la partie

Dans le film tron les personnages jouent à un jeu qui consiste à rouler sur des motos qui produisent des murs de lumière derrière elles et tenter de les éviter. Il y a pleins d’implémentations numériques de ce jeu et j’en ajoute une de plus.

Sauf que vu que je suis :

Les motos sont devenues des vélos.

Comment y jouer ?

Vous pouvez y jouer en ligne, vous avez ssh et ne voulez rien modifier ou installer :

$ ssh -t guest@bebou.netlib.re -p1459 tron

Vous voulez y jouer hors-ligne, vous avez un linux, vous me faite confiance et vous n’avez pas de quoi compiler un programme et/ou vous ne voulez rien modifier :

$ curl -Ls http://arthur.bebou.netlib.re/tron > tron
$ chmod +x tron
$ sudo cp tron /usr/local/bin
$ tron

Vous voulez y jouer hors-ligne, vous voulez modifier quelque chose ou vous êtes à cheval sur la sécurité, vous avez un Unix avec un compilateur C, git et make :

$ git clone git://bebou.netlib.re/tron
$ cd tron
$ make
$ sudo make install
$ tron

Avec quoi est-ce que ça a été fait ?

J’utilise une version légèrement modifiée de termbox2 parce qu’au moment où j’ai commencé à m’y intéresser pour faire pipe-game il avait un bug dans sa gestion de l’utf8. Depuis je suis resté avec mon patch. Il est fourni dans le dépôt git.

Sinon c’est moins de 300 lignes de C vraiment nulles. Termbox est pas fait pour faire des jeux vidéos donc ça gère pas bien le temps réel. Par exemple si vous maintenez une direction enfoncée le jeu va avancer d’autant plus vite. Je ne suis pas certain que termbox permette sans hack chelou d’empêcher cela.

Pourquoi ?

Parce que j’aimais beaucoup ce jeu quand j’étais petit sur l’ipod touch d’un camarade, qu’une version multijoueur en ligne a poppé sur hackernews récemment mais que je la trouvais bof et que je voulais voir si c’était difficile à reproduire ou pas.

Et si vous voulez jouer en multi en ligne ?

Vous avez des copaines mais pas directement à côté de vous ? Vous voudriez quand même pouvoir y jouer ensemble ? C’est possible. Sans aucune ligne de code gérant le réseau.

L’astuce est d’installer le jeu sur un serveur auquel vous avez accès, de vous connecter au même compte et de vous logger sur la même session tmux. Vous allez voir la même chose et, surtout, vous allez partager le même clavier. Vous pouvez donc jouer à tron comme si vous étiez en local sur le même ordi avec la latence en plus.

Ça fonctionne pas uuuuuultra bien mais si vous parvenez à avoir un terminal de la même taille c’est franchement pas mal. Tmux est certainement overkill pour ne faire que ça mais puisque c’est un outil déjà très courant sur les serveurs unix pourquoi pas le mettre à profit ?

Cette astuce est en quelque sorte le cloud gaming du pauvre.

Les petites bizarreries

Puisque généralement la hauteur des cases de la grille d’un terminal n’est pas égale à leur largeur les vélos se déplacent plus rapidement verticalement qu’horizontalement. Ça rend le jeu un peu plus difficile à jouer. Soit on vit avec soit on utilise une police de caractère carrée !

Il faut télécharger la font, l’installer sur son système puis lancer un terminal avec la bonne font. Sur ma machine sur debian avec xfce :

$ curl -Ls https://strlen.com/files/square.ttf > square.ttf
$ sudo mv square.ttf /usr/share/fonts/truetype/
$ xfce4-terminal --geometry 80x40 --font=/usr/share/fonts/truetype/square.ttf --command tron

Une capture d'écran très similaire à celle de début mais cette fois-ci la
grille est carrée.

A noter qu’en dessous d’une certaine taille j’ai une erreur obscure de flottants en lançant le jeu dans xfce4-terminal. Je suppose que c’est parce qu’avec une font carrée le terminal et termbox sont confus sur la taille. A creuser. Avec un terminal suffisamment grand ça fonctionne 🤷