1

Bonjour,

je voulais definir un type qui représente une matrice de cases

est-ce que je peux écrire :

type m=Case of case*case ;;

si j'ai un type case={couleurr:string;Mur:string};; ??

puis,

est-ce que qqn peut m'expliquer la ligne suivante:
vertical: bool array array

??

merci bcp en avance

2

Oui tu peux écrire ça mais je ne pense pas que ça fasse ce que tu veux (ton type va représenter seulement un couple de cases, deux cases quoi, pas une matrice).

bool array array est un type. En fait array est le type paramétrique des tableaux, c'est-à-dire que "t array" est le type d'un tableau dont les éléments ont le type t. "bool array" est donc le type d'un tableau dont les éléments sont des booléens, et "bool array array" est le type d'un tableau dont les éléments sont eux-mêmes des tableaux contenant des booléens.
Concrètement cela peut justement représenter une matrice : chaque ligne de la matrice est représentée par un tableau de booléens et a le type bool array, la matrice elle-même est un tableau de lignes et a le type bool array array.

Ici ce que cette ligne te dit est donc que la variable vertical est une matrice de booléens. Donc si tu écris par exemple vertical.(3).(2) ça va te renvoyer un booléen, celui situé en troisième ligne, deuxième colonne dans cette matrice (si la matrice est assez grande, sinon ça va provoquer une erreur).

Quant à ta matrice de cases, elle peut (par exemple) être définie de la même façon : type m = case array array.
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

3

merci
ca explique un peu les choses

alors si je veux définir une matrice de cases qui contiennnent des couleurs de type case

pourquoi ca me donne une erreure de syntaxe quand j'écris

type m=
{
largeur:int;
longeur:int;
horzontal:case.couleur array array;
vertical:case.couleur array array
};;

4

Ah c'est parce que case.couleur n'est pas un type, seul case en est un. La couleur d'une case a le type string, d'après ce que tu avais dit.

D'après ce que tu as posté, une case est composée d'une couleur et d'un mur, les deux ayant le type string (c'est-à-dire que ce sont des chaînes de caractères). Les deux ne sont pas séparables (tu ne peux pas mettre la couleur d'une case dans une matrice et son mur dans une autre matrice). Si cette situation ne te convient pas, c'est sans doute que tu n'utilises pas la bonne représentation pour les cases.

Je ne comprends pas ce que signifie « je veux définir une matrice de cases qui contiennnent des couleurs de type case ».

Sinon, ta déclaration est un peu bizarre. Ton type m contient DEUX matrices (qui vont avoir chacune des lignes et des colonnes), une qui s'appelle horizontal et une qui s'appelle vertical. Je ne pense pas que c'est ce que tu veux. Il y a là encore un problème de séparation : si tu utilises array array, tout est ensemble, tu n'as pas d'un côté les lignes et de l'autre les colonnes. Je ne sais pas exactement ce que tu veux faire, mais à mon avis il faut que tu remplaces horizontal et vertical par un seul élément "matrice" qui aura le type case array array.
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

5

oui
en effet
je suis un peu perdue
depuis qqs jours j'essaye de defnir ma matrice

j'ai une matrice de cases, dont les cases ont des couleurs, et j'ai besoin de definir le type matrice
pour pouvoir accéder aux cases et aux murs des cases

mais alors si j'écris
type m={
largeur:int;
hauter:int;
horizontal:case array array
};;

comment accéder au morceau de mur horizonal et puis au morceau de mur vertical?



et en plus, ca ne veiu

6

Est-ce que chaque case a un seul mur ? parce que le type que tu as défini pour les cases ne lui permet d'avoir qu'un seul mur. Elle a même toujours exactement un mur. C'est bien ce que tu veux ?

Par ailleurs, ce mur est représenté par une chaîne de caractères, c'est-à-dire un texte. Qu'est-ce que tu as l'intention de mettre dans ce texte ? Je pose la question parce que souvent c'est utile de représenter les choses par des types plus structurés que juste un texte. En effet un texte est compliqué à analyser pour l'ordinateur.

Je pourrai sans doute te conseiller plus facilement si je comprends exactement ce que tu veux faire ^^

Avec le type décrit au ./5 pour ta matrice, je peux te dire comment accéder à la case qui se trouve à une ligne donnée et une colonne donnée. Je peux ensuite te dire comment accéder à l'élément "mur" de cette case. Après tout ce que je sais c'est que d'après tes définitions cet élément contient un texte, mais je ne sais pas ce que raconte ce texte, comme je le disais ; donc je ne sais pas comment savoir si le mur a un morceau horizontal ou un morceau vertical ou quoi que ce soit.
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

7

oh désolée ...je vais vous expliquer ce que j'essaye de faire
en fait, j'essaye de créer un labyrinthe, dont les cases sont colorées
il faut donc créer un type case qui se caractérise par sa couleur et le nombre de portes déja ouvertes: ce que j'ai appelé MUR

mais le problème est que je n'ai pas réussi à représenter "la liste des portes ouvertes"

et puis j'ai décidé de donner le type string à la couleur des cases et à cette liste de portes ouvertes parce que j'ai pensé
aux couleurs en termes de mots c-à-dire "bleu, jaune ...etc" et pour cela, ca me semblait être un string...

apparament, il y a encore pas mal de manipulations que je ne comprends pas - en ce qui concerne les types et les matrices !

pouvez-vous m'expliquez un peu comment procéder dans mes définitions de types?


merci bcp en avance

8

Pour les couleurs : c'est possible d'utiliser des strings effectivement. Mais ça dépend combien il y a de couleurs différentes.
utiliser un type spécial qui n'aura le droit d'avoir que ces valeurs, et cela peut être plus pratique après, donc en général on fait ça. Comme ceci :type couleur = Noir | Blanc | Rouge | Bleu | Jaune | Vert;;S'il n'y a que trois ou quatre couleurs différentes tu peuxSi tu définis ce type, ensuite quand tu taperas Bleu ou Blanc le compilateur reconnaîtra automatiquement qu'il s'agit d'une couleur. (Et il faudra le mettre sans guillemets, car il ne s'agit plus d'une chaîne de caractères mais d'une constante définie dans le programme.)

chaque case a quatre portes ? si oui, tu peux peut-être utiliser de nouveau un enregistrement :type mur = {haut : bool; bas : bool; gauche : bool; droite : bool};;Mais bon ton problème principal c'est les murs. Si je comprends bienLe type booléen peut prendre deux valeurs, vrai ou faux (enfin true et false), tu peux utiliser true pour représenter une porte ouverte et false pour une porte fermée.
Note : ceci n'est qu'un exemple, si une case n'a que deux portes tu peux bien sûr remplacer cette définition par autre chose qui correspond mieux. L'inconvénient de ce que j'ai écrit là est que la porte de droite de la case 3,2 est probablement la même que la porte de gauche de la case 3,3 , et je les représente séparément ce qui n'est pas forcément malin (je pourrais me retrouver avec une qui est fermée et pas l'autre, alors que c'est la même, ce qui provoquerait sans doute un bug). À toi de voir ce qui est le mieux.

ase = {couleur : couleur; mur : mur};;Avec ces définitions tu aurais alors :type c(cela fait référence aux types couleur et mur'où la répétition ^^) ettype m = { largeur : int; hauteur : int; matrice : case array array; };; que j'ai définis plus haut, et j'appelle aussi les champs couleur et mur, dEnsuite, si labyrinthe est une variable de type mcase située en ligne 3 colonne 2 tu utilises :labyrinthe.matrice.(3).(2).couleur, pour accéder à la couleur de la cette même case est ouverte tu utilises :labyrinthe.matrice.(3).(2).mur.droitepour savoir si la porte de droite de atrice.(3).(2).mur.baspour la porte du bas :labyrinthe.metc.

voilà smile
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

9

N.B. :Si jamais tu veux pouvoir modifier ton labyrinthe, par exemple en ouvrant des portes, il faut l'indiquer dans la déclaration de type. La déclaration que j'ai indiquée pour une case permet d'indiquer quelles portes sont ouvertes et fermées, mais pas de le changer après. Pour pouvoir modifier un champ d'un enregistrement (« enregistrement » est le nom d'un type comme ceci {champ1 : type1; champ2 : type2}), il faut spécifier le mot-clef mutable.

La déclaration du type mur mutable bool};; devient alors :type mur = {haut : mutable bool; bas : mutable bool; gauche : mutable bool; droite :Et ensuite tu peux modifier les valeurs en utilisant l'opérateur <-.
de droite de la case 3,2 tu pourras faire comme ceci :labyrinthe.matrice.(3).(2).mur.droite <- trueAinsi par exemple si tu veux ouvrir la porte
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

10

merci bcp pour tes explications Sally
ca m'a vraiment aidé à comprendre comment manipuler les types en Ocaml