Tâche Créative - Multisnake

Gagnant

Nikola Djokic a gagné le concours Multisnake.

Introduction

Stofl la souris et ses amis aiment jouer à Multisnake. Multisnake est une extension du jeu classique Snake. Multisnake propose des un mode Multiplayer pour jusqu’à 8 joueurs. Malheureusement, Stofl est le pire joueur de Snake. Il perd chaque partie et c’est très frustrant pour lui.

Un jour, il a eu l’idée de créer un programme d’ordinateur qui puisse jouer à sa place et gagner le jeu. Il a entendu que tu es un programmeur très doué, c’est pourquoi Stofl demande ton aide.

Multisnake

Multisnake se joue sur une carte rectangulaire de taille WxH et il y a 2, 4 ou 8 joueurs qui jouent l’un contre l’autre. Chaque joueur contrôle un serpent qui occupe plusieurs cases adjacentes. La carte est répétitive : les joueurs qui sortent de la carte entrent de l’autre côté.

Une partie est jouée en plusieurs tours. A chaque tour, tous les joueurs bougent simultanément selon les règles suivantes :

  1. Les serpents bougent en avancent leur tête et leur queue d’une case par tour. Si un serpent tente d’aller sur une case occupée, il ne bouge pas lors de ce tour et meurt. Si plusieurs serpents tentent d’aller sur la même case, ils meurent après avoir bougé. Les serpents morts restent sur la carte. Comme tous les serpents avancent en même temps, un serpent peut aller sur une case qui est quittée par la queue d’un serpent lors du même tour.
  2. Les seules serpents qui peuvent changer le direction comme opposite sont lesquelles dont le longuer est 1.
  3. Certaines cases contiennent les signes + ou -. Quand un serpent va sur une telle case, il mange le signe et grandit (+) ou rétrécit (-) d’une case. En grandissant, la queue du serpent reste à la même place et en rétrécissant, la queue bouge de deux cases à la place d’une. Si un serpent rétrécit jusqu’à avoir une longueur de zéro, il meurt.
  4. Pour que le jeu ne dure pas éternellement, tous les serpents grandissent de 1 tous les T tours, où T est un petit entier positif. Un serpent peut grandir d’au plus une case par tour. Par conséquent, les + ou – mangés lors de ces tours sont ignorés.
  5. Le dernier joueur dont le serpent est en vie gagne le jeu. Si tous les serpents qui restent meurent en même temps, il y a égalité.

Interactions avec le serveur

Les interactions seront basées sur un mode texte. C’est une tâche interactive, c’est pourquoi il est crucial que tu n’oublies pas de flusher la sortie standard.

Au début du jeu, le serveur envoie des informations sur la partie à ton programme. Lis de l’entrée standard cinq entiers W, H, N (nombre de joueurs), M(ton numéro) et T.

Au début de chaque mouvement, lis la carte de l’entrée standard. Elle consiste de H lignes, chacune contenant W caractères. La signification de chaque caractère est expliquée dans la table ci-dessous :

Caractère Valeur ASCII Signification
A,B,C… 65, 66, 67… Les têtes des serpents. La valeur ASCII de ta têt est donnée par 64+M.
@ 64 Têtes des serpents morts
# 35 Case impénétrable
v 118 Partie du corps d’un serpent ; lorsque la tête du serpent était ici, il a bougé vers le bas
< 60 Partie du corps d’un serpent ; lorsque la tête du serpent était ici, il a bougé vers la gauche
> 62 Partie du corps d’un serpent ; lorsque la tête du serpent était ici, il a bougé vers la droite
^ 94 Partie du corps d’un serpent ; lorsque la tête du serpent était ici, il a bougé vers le haut
. 46 Case libre
+ 43 Signe +, augmente de 1 la taille du serpent
- 45 Signe -, diminue de 1 la taille du serpent

Il n’y a pas d’autres caractères dans la carte.

Après avoir lu l’entrée, tu dois renvoyer exactement une ligne contenant un char ('^', '>', 'v' ou '<') qui indique dans quelle direction ton serpent doit bouger. Ton programme se termine automatiquement si ton serpent meurt, si le jeu est fini ou si tu a renvoyé une ligne invalide.

Contraintes

  • 5 ≤ W,H ≤ 150
  • N = 2 OU N = 4 OU N = 8
  • 1 ≤ M ≤ N
  • 1 ≤ T ≤ 25

Exemple de carte

C’est un carte lors d’un tour arbitraire dans le format qui sera envoyé à ton programme.

##########.^.....^##########
#....>>>>>>^.....^<...>>>v.#
#.......-..........-.....v.#
>>>>>>>>>>>>>>>B...+.....>>>
#...................v......#
#...+..A<.########..v..+...#
##......^<<<.....>>>@.....##
###....-...^.....^..-....###

La carte contient quatre serpents, dont deux sont allés sur la même case lors du même tour et sont morts. Observe que le serpent qui est a quitté la carte est entré de l’autre côté.

Remarques

  1. Tu peux utiliser le serveur test pour évaluer localement tes programmes. Le joueur avançant au hasard est implémenté dans plusieurs langages de programmation pour te donner un point de départ.