Déplacement des joueurs sur un jeu tel Monopoly
Fermé
Anonyme12345
-
Modifié le 3 janv. 2022 à 13:53
mamiemando Messages postés 33363 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 novembre 2024 - 4 janv. 2022 à 12:16
mamiemando Messages postés 33363 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 novembre 2024 - 4 janv. 2022 à 12:16
A voir également:
- Déplacement des joueurs sur un jeu tel Monopoly
- 94 jeu - Télécharger - Puzzle & Réflexion
- Historique déplacement google - Guide
- Jeu zuma - Télécharger - Jeux vidéo
- Jeu des logos - Télécharger - Jeux vidéo
- Comment déplacer une colonne sur excel - Guide
1 réponse
mamiemando
Messages postés
33363
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
16 novembre 2024
7 801
3 janv. 2022 à 14:31
3 janv. 2022 à 14:31
Bonjour,
Étant données le fait que les pions n'interagissent pas entre eux au Monopoly, il suffit de construire pour chaque joueur une structure qui maintient sa case courante et la liste de ses possessions.
Pour gérer l'ensemble des joueurs et la notion de tour, il peut être intéressant de stocker les joueurs (donc les structures qui leur sont associées) dans une liste sur laquelle tu itéreras à chaque tour (pense à revenir en début de liste quand tu as fini de faire jouer le dernier joueur). Un pointeur sur la structure du joueur courant sera bien pratique.
Concernant le plateau, tu peux le modéliser par une liste de case, où chaque case stocke les informations qui la concerne (le nom, la couleur s'il y en a une, un booléen qui indique si elle est "achetable", un pointeur vers son éventuel possesseur).
Ensuite, il te faudra une fonction pour faire le rendu (qu'il soit en mode texte ou en mode graphique) et qui sera paramétré par ta liste de joueur et ton plateau.
Il faudra enfin prévoir quelques informations additionnelles pour gérer les autres éléments du jeu (parc public, pot d'argent collecté par les impôts et les taxes de luxe, gestion de la prison etc...)
Bonne chance
Étant données le fait que les pions n'interagissent pas entre eux au Monopoly, il suffit de construire pour chaque joueur une structure qui maintient sa case courante et la liste de ses possessions.
Pour gérer l'ensemble des joueurs et la notion de tour, il peut être intéressant de stocker les joueurs (donc les structures qui leur sont associées) dans une liste sur laquelle tu itéreras à chaque tour (pense à revenir en début de liste quand tu as fini de faire jouer le dernier joueur). Un pointeur sur la structure du joueur courant sera bien pratique.
Concernant le plateau, tu peux le modéliser par une liste de case, où chaque case stocke les informations qui la concerne (le nom, la couleur s'il y en a une, un booléen qui indique si elle est "achetable", un pointeur vers son éventuel possesseur).
Ensuite, il te faudra une fonction pour faire le rendu (qu'il soit en mode texte ou en mode graphique) et qui sera paramétré par ta liste de joueur et ton plateau.
Il faudra enfin prévoir quelques informations additionnelles pour gérer les autres éléments du jeu (parc public, pot d'argent collecté par les impôts et les taxes de luxe, gestion de la prison etc...)
Bonne chance
3 janv. 2022 à 17:16
Effectivement je viens de commencer à réaliser les structures pour chaque joueur c’est une très bonne idée.
Cependant tu m’as conseillé de stocker les structures de chaque joueur dans une liste cependant je n’ai pas encore vu les listes chaînées. Y aurait-il par hasard une autre manière de faire ?
Merci
Modifié le 3 janv. 2022 à 18:51
Tu peux aussi allouer dynamiquement la mémoire nécessaire au stockage de nb_joueurs, en utilisant malloc sur un pointeur de type pour un nombre de bytes égal à . Tu pourras itérer sur les avec l'opérateur comme s'il s'agissait d'un tableau.
Cela donne ceci :
Modifié le 4 janv. 2022 à 10:56
nous l'avons déjà utilisé dans le menu car dès le debut de partie nous entrons toutes informations necessaires (nom, prenom...) en lançant une partie.
En revanche, merci pour la suite, j'ai encore du mal avec la fonction strcpy mais je vais essayer de comprendre et de m'inspirer de ce que tu as fait.
Dernière petite question, n'ayant pas vu les listes chainées, je comptais m'occuper du déplacement des joueurs d'une manière simple en utilisant les coordonnées (un int position)
Y aurait-il plus simple ? Car cette méthode demande une longue repetition pour chaque case du plateau.
Modifié le 4 janv. 2022 à 10:47
Mon code était un code d'exemple visant à montrer comment, à partir d'un type struct, tu obtiens un tableau d'une taille fixée par ton programme, ou d'une taille dynamique, dont tu peux parcourir les éléments avec un indice.
strcpy() n'a rien de compliqué :
https://www.cplusplus.com/reference/cstring/strcpy/
La seule difficulté est de s'assurer que la chaîne copiée ne dépasse pas l'espace mémoire disponible à la chaîne de destination, ce dont tu devrais t'assurer en amont dans ta fonction gérant la saisie d'une ligne de texte que tu dis avoir déjà implémentée.
Je comptais m'occuper du déplacement des joueurs d'une manière simple en utilisant les coordonnées (un int position)
Y aurait-il plus simple ? Car cette méthode demande une longue repetition pour chaque case du plateau.
Oui, tu peux rajouter un champ "int position" dans la .
Ce int peut représenter l'indice d'un élément d'un tableau de qui va contenir le nom de la case, son type, et les autres informations utiles au jeu afférentes à la case.
Pourquoi dis tu que "cette méthode demande une longue repetition pour chaque case du plateau" ?
Modifié le 4 janv. 2022 à 12:16
Pour préciser ce qui a été dit plus haut : j'ai dit liste mais effectivement un tableau est plus adapté.
Code
Résultat
Ici j'impose que le nombre de joueurs est au plus 10 car je pars du principe que tu n'as pas peut-être pas encore vu les allocations dynamiques. Si tu les as vu il vaut mieux allouer players à l'aide de ou .
Tu noteras que tu n'as pas besoin de à ce stade. On peut directement écrire dans la structure comme le buffer qui stocke le nom est pré-alloué.
Comment utiliser strcpy
Commençons sans pointeurs.
En toute rigueur il vaudrait mieux passer par un buffer intermédiaire plus grand qui contrôle que le nom ne dépasse pas , et si c'est le cas, copier ce buffer avec vers avec une fonction de ce genre :
Les pointeurs
Cette notion est en général très mal expliquée et très mal comprises par les étudiants. Je t'invite donc à prendre le temps de lire ce qui suit et à demander des précisions si ça n'est pas clair.
Ce qui est fondamental, c'est comprendre qu'un pointeur est une adresse mémoire. Une adresse est donc une valeur numérique. Quelle que soit la nature de la donnée pointée, une adresse fait toujours une taille bien précise (64 bits sur OS 64 bits, 32 bits sur un OS 32 bits, etc...).
Une adresse générique est de type . Pour une adresse générique, les opérateurs sur les pointeurs ne sont pas définis, car la taille du bloc mémoire pointé n'est pas spécifié. Cela signifie que les opérateurs des pointeurs (comme l'opérateur unaire pour accéder à la donnée pointée, l'opérateur et l'opérateur ) ne sont pas définis. Ce type de pointeur est donc peu pratique, il n'est d'ailleurs utilisé que pour des cas bien précis (tout ce qui travaille à l'échelle de la mémoire).
C'est pour ça que la plupart du temps on veut typer un pointeur. Ça sera toujours une adresse mémoire, mais pour le compilateur, le fait de la typer va lui donner un sens qui va débloquer les opérateurs dont je parlais et contrôler qu'on écrit pas n'importe quoi.
Prenons un exemple simple :
L'opérateur retourne l'adresse d'un objet (ici un ). Il est donc légitime de typer ce pointeur en . Si avait été un , il aurait fallu que soit de type .
Bien entendu rien n'oblige de faire des pointeurs de pointeurs, voire imaginer de multiples redirections. C'est cette capacité à naviguer d'adresse en adresse qui leur vaut le nom de pointeur. L'exemple ci dessous est un peu scolaire mais permet de voir le principe :
Quand on manipule un tableau d'objets homogènes (disons des ), par exemple, on sait que chaque case est de type et est de taille . Cela signifie que passer à la case suivant revient à avancer de octets. Un tel pointeur se note ou selon qu'il donne un accès en lecture/écriture ou juste un accès en lecture.
Concernant le typage des pointeurs, qui peut le plus peut le moins (mais pas le contraire) :
Si on revient à notre exemple de , il faut bien comprendre que ça n'est pas parce qu'on fournit une adresse que cet adresse est valide (c'est-à-dire correspond au début d'un bloc suffisamment large pour accueillir la donnée saisie). Il faut donc soit :
Une "bonne" allocation mémoire doit :
Une "bonne" utilisation d'un pointeur impose :
Voici à quoi pourrait ressembler alors une ébauche de ton programme :
Dernier point important. En C, ça n'est pas parce qu'un programme semble marcher une fois qu'il est juste. Parfois la mémoire "se met bien" et le programme ne plante pas "par chance" alors que le code est conceptuellement faux et devrait provoquer une erreur de segmentation. Il est recommandé de contrôler que la mémoire est bien utilisée avec des outils comme .
Bonne chance