Forums Développement Multimédia

Aller au contenu

Jeu Risk - savoir si un territoire est connecté ou non.

CODE

7 réponses à ce sujet

#1 Djan59

    Ceinture Blanche

  • Members
  • Pip
  • 7 messages

Posté 23 September 2015 - 10:23 AM

Bonjour,

J'aimerais coder en AS3 le jeu RISK, le célèbre jeu de stratégie :roi: . Mais avant de m'attaquer au code à proprement parler, je réfléchis aux différentes techniques que je pourrais employer pour programmer les règles du jeu et une d'entre elles me posent problème.

A la fin de son tour, on peut transférer des troupes d'un territoire à un autre mais uniquement si ceux-ci sont connectés.

Je poste cette image pour être le plus clair possible. ^_^

Image IPB
Ici, les bleus ne peuvent pas transférer de troupes. En revanche, les rouges oui.

Et la question est : Comment savoir si les territoires sont reliés ? Quelle est l'approche pour coder cette règle ? J'ai entendu parler de "Flood Fill", est-ce de ce côté là que je devrais chercher ?

Si quelqu'un avait la gentillesse de me répondre. Parce que là j'ai beau chercher... :mellow:

Merci d'avance :Hola:

#2 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 23 September 2015 - 11:00 AM

Le Flood fil, ça me semble être une bien grosse artillerie pour si peu… et même pas efficace.
En plus, ça va te servir à quoi ? Juste à lister les zones en contact de façon automatique pour les stocker ensuite en tableau dans une propriété de chaque territoir…
Si tes dessins de territoires sont générés de façon aléatoire, ça peut se comprendre mais sinon, un peu d'huile de coude doigts et tu saisis ta liste à la main.

#3 Djan59

    Ceinture Blanche

  • Members
  • Pip
  • 7 messages

Posté 23 September 2015 - 12:03 PM

Merci beaucoup d'avoir pris le temps de répondre. Mais pour être sûr d'avoir bien compris, il faut donc que je fasse une tableau avec les territoires frontaliers de tous les pays et, à partir de celui-ci, faire une boucle de conditions pour vérifier si le joueurs peut bien transférer ses troupes ?

Et juste par curiosité, pourquoi dis-tu que le flood fil est une grosse artillerie pour si peu et pourquoi est-il inefficace ?

#4 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 653 messages

Posté 23 September 2015 - 14:31 PM

Coucou,

Si ca peut t'aider, je pense que je partirais sur un systeme plus simple, avec deux classes du type :

"Country"
  • Id (Unique Id du pays, String)
  • Name (Nom du pays, String)
  • Adjascent_Countries (Ids des pays limitrophes, Array)
  • Owner (Id du joueur qui le controle actuellement, String)
  • Skin (IdIdu sprite a utiliser pour le pays, Image)
"Unit"
  • Id (Unique Id de l'unitée militaire, String)
  • Name (Nom de l'unitée, String)
  • Power (Puissance de frappe, uint)
  • Life_Points (Points de vie, uint)
  • Owner (Unique Id du joueur, String)
  • Current_Country (Unique Id du pays dans lequel l'unité se trouve)
La classe Country est utilisée en jeu, et étends la classe Sprite. Lorsqu'un joueur en fait la conquête, on change la propriétée Owner. Lorsqu'un joueur veut y déplacer des troupes, on regarde dans le tableau Adjascent_Countries si le pays d'où viennent les troupes est :
  • limitrophe et allié -> les unitées peuvent se dépacer
  • limitrophe et ennemi -> les unitées attaquent
  • pas limitrophe -> message d'erreur au joueur


En plus, l'approche objet te permettrait d'ajouter des éléments de gameplay que tu ne pourrais pas avoir avec du Flood-Fill, par exemple, imaginons que tu veuille faire un systeme portuaire qui permettrais d'envahir l'Angletterre depuis la France, comme il y à la manche entre les deux pays, le flood fill ne considererais pas ces deux pays comme limitrophes, mais pour des raisons de gameplay, il vaudrait mieu qu'ils le soient. Enfin, d'un point de vue optimisation des calculs je suis tout a fait de l'avis de Didier, c'est sortir la grosse artillerie pour pas grand chose.

#5 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 23 September 2015 - 14:33 PM

Le FloodFill est une technique de propagation qui permet de 'visiter' tous les pixels voisins d'un pixel de départ. C'est la technique de base dans Paint pour colorer une zone avec le pot de peinture. Donc, l'idée compliquée serait :
- dessiner la carte en bitmap avec une couleur différente pour chaque pays.
- pour chaque pays : faire un FlooFIll qui ne remplit mais mais se propage tant que la couleur est la même, puis stocke dans un tableau les couleurs qui le stoppent. Avec la liste des couleurs, tu retrouves les territoires concernés, si tu as pris soin de faire un tableau de correspondance, bien sûr. C'est trop complexe, crois moi.

Pour l'autre idée : je ferais ça beaucoup plus 'Objet' et pas simplement un tableau.
Une classe Territoire, avec des propriétés : nom, continent/couleur(?), joueur possédant le territoire, nombre de fantassins et bien sûr… frontaliers.
Tu crées tes territoires en début de partie et tu injectes les frontaliers.
En résumé :
var tt = new Object();
tt.france] = new Territoire('France', 'Europe', null, 0);
tt.espagne = new Territoire('Espagne', 'Europe', null, 0);
tt.italie = new Territoire('Italie', 'Europe', null, 0);

tt.allemagne = new Territoire('Allemagne', 'Europe', null, 0);
// etc

// puis :
tt.france.frontaliers = [tt.allemagne, tt.espagne, tt.italie];
tt.espagne.frontaliers = [tt.france];
// etc

Laborieux mais fiable et définitif.

#6 Djan59

    Ceinture Blanche

  • Members
  • Pip
  • 7 messages

Posté 23 September 2015 - 16:08 PM

Merci à tous les deux. En particulier pour les explications concernants le flood Fill et les exemples de codes. Effectivement, j'ai dis tableau mais je pensais bien à une programmation orientée objet. Pour les données, même si c'est laborieux, ce n'est pas très grave, j'imaginais un système automatique et flexible et bien ce sera manuel et fixe :P . Ce sera un peu plus compliqué parce que les renforts peuvent venir d'un pays éloigné (donc non frontalier) mais connecté quand même au pays visé. Mais bon, avec des if{} partout, ça devrait aller. Merci encore ;)

#7 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 24 September 2015 - 08:15 AM

Ajoute dans ce cas une propriété 'connectes', ça sera bien mieux que des 'if'

Pour le côté laborieux, tu peux te simplifier (un peu) la tache en gérant les territoires par id numériques…
Tu imprimes ta carte, tu numérotes les territoires sans même chercher de logique, et tu crées une fonction getFrontaliers qui prend les 'id' en paramètre et va chercher les territoires dans ton tableau principal.
tt[0] = new Frontalier("France", etc)
tt[0].getFrontaliers([1,2,5,8]);
En regardant ta carte. Ça devrait aller assez vite.

Autre petit truc :
je ferais sans doute une liste de constantes numériques pour chaque territoire. Ça me permettrait d'avoir un code plus lisible dans certains cas…

const FRANCE:int = 0;
const ESPAGNE:int = 1;
const ITALIE:int = 2;

tt[FRANCE] = new Territoire("France", etc);
// Qui n'empêcherait pas :
tt[FRANCE].getFrontaliers([1,2,5,9]);


#8 Djan59

    Ceinture Blanche

  • Members
  • Pip
  • 7 messages

Posté 24 September 2015 - 12:34 PM

Effectivement pour les constantes, ce sera plus lisible et plus logique puisque les noms des pays sont définitifs. Et pour la fonction getFrontaliers, c'est pas bête du tout et ça me fera gagner du temps. Merci pour ces astuces ;)



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP