Map aléatoire

Puisqu’on en est à " apprenez moi Inform les amis " , quelqu’un sait-il comment créer une map aléatoire ?

Du genre, on définit l’existence d’une vingtaine de rooms, et when play begins, on les répartir les unes envers les autres, de manière totalement aléatoire ?

ça me servirait bien, ça aussi :blush:

J’avais bricolé un truc comme ça a l’époque en inform 6, c’était basé sur un générateur de code en visual basic je crois. Mais ce n’était pas généré en live dans le code…

:blush: c’est du chinois pour moi, mon ami

En gros j’avais un premier programme en visual basic qui génère un labyrinthe (j’aime bien les labyrinthes) puis qui en fonction du résultat genère du code inform 6 que je n’avais plus qu’à compiler ! Pour chaque salle il regardait si la salle à l’est était accessible, si oui il remplissait le champ « e_to salle », etc…

Si j’ai bien compris, tu veux qu’à chaque nouvelle partie, on ait un labyrinthe différent ?
Dans ce cas, je viens de bidouiller ça en 20 minutes:

[code][Définit une kind of room particulière : le labyrinthe]
A maze is a kind of room. The description of a maze is usually « Je me suis perdu dans ce labyrinthe. Les directions possibles sont : [exits] »

Couloir jaune, Couloir rouge, Couloir vert, Couloir bleu, Couloir blanc, Couloir noir, Couloir orange, Couloir violet, Couloir rose, and Couloir gris are mazes.

[Définit l’entrée et la sortie]
Entrée is a room. « Le labyrinthe commence ici. Les directions possibles sont : [exits] ». The player is in entrée.
Arrivée is a room. « Oui ! J’ai réussi ! ».
The trésor is a thing in Arrivée. The description is « Le prendre me ferait gagner la partie. ». After taking the trésor, end the story saying « Vous avez gagné ! ».

[permet de lister les sorties possibles]
To say exits:
repeat with D running through directions:
if the room D from the location is a room, say « [line break]• [D] ; ».

[Au début du jeu, arrange les pièces dans un ordre aléatoires]
When play begins:
repeat with R1 running through mazes:
let R2 be a random maze that is not R1;
let D1 be a random direction;
let D2 be the opposite of D1;
change the D1 exit of R1 to R2;
change the D2 exit of R2 to R1;
let R be a random maze;
let D1 be a random direction;
let D2 be the opposite of D1;
change the D1 exit of Arrivée to R;
change the D2 exit of R to Arrivée;
let R be a random maze;
let D1 be a random direction;
let D2 be the opposite of D1;
change the D1 exit of Entrée to R;
change the D2 exit of R to Entrée.[/code]
J’ai essayé, et ça donne des labyrinthes hyper tordus (et pas très réalistes).

En fait, on définit un type de salle qui constituera notre labyrinthe, puis on fait un petit repeat pour toutes les prendre (tu connais bien ça maintenant, hein ?)
On choisit une autre pièce aléatoirement, ainsi qu’une direction, on on met la pièce du repeat dans cette direction de la pièce aléatoire, et vice-versa (pour qu’on puisse revenir sur nos pas).
Enfin, on ajoute le début et la fin du labyrinthe. Je ne les met pas dans la boucle, comme ça on est sûr qu’il n’y a qu’une direction qui permet de les atteindre.

Sinon, il ne faut pas oublier de dire où le joueur peut aller, car comme c’est aléatoire, on ne peut pas savoir d’avance.

(Oui, j’aime bien tout expliquer en détail, il faudra t’y faire :stuck_out_tongue: )

Le code n’est pas parfait, et si tu veux des labyrinthes plus réalistes, faudrait le modifier un peu.

De rien !

Sinon, la technique de Yoruk est bien pour les paresseux (comme moi), mais ça génère un labyrinthe aléatoirement une fois, puis on le garde de manière définitive ; ce n’est pas ce que tu veux, me semble-t-il.

C’est plus pour faire un monde extérieur, en fait (générer une map avec des connexion aléatoires, et ensuite, déterminer - ça je sais le faire - si chaque room sera de la plaine, une forêt, des marécages, etc)…

Je vais essayer ta technique, en attendant. Merci !

Je vois juste un petit " défaut " à tes labyrinthes : il est possible qu’une des directions dès le début du jeu , soit " dehors " … un peu étrange non ? sauf à supposer que le joueur se retrouve téléporté d’emblée au coeur du labyrinthe, dans une salle au hasard.

Ah, et une autre chose : dans tous les labyrinthes générés, il y a une room qui est atteignable par deux directions. J’ai fait plusieurs fois le test.

Du genre : le couloir noir est au sud de Entrée, et"outside".

Ca c’est un peu ennuyeux … mais sinon c’est assez génial !

Oui, c’est ce que je disais, ce sont des labyrinthes très tordus et pas réalistes du tout.
Pour pas avoir dehors et dedans, en haut et en bas, on peut par exemple mettre :

[code]A direction can be flat. A direction is usually flat. Outside is not flat. Inside is not flat. Up is not flat. Down is not flat.

[…]
let D be a random flat direction;
[…][/code]
Mais maintenant que j’ai compris ce que tu voulais, il pourrait y avoir une autre solution.

[code]The Plaine is a room.

A biome is a kind of room.
Marais, Forêt décidue tempérée, Forêt tropicale humide, Toundra, Taïga, Savane, Désert and Chaparral are biomes.

Before going a direction (called D) when a biome is not visited:
let destination be the room D from the location;
if destination is a room, continue the action;
let B be a random biome that is not visited;
change the D exit of the location to B;
let D2 be the opposite of D;
change the D2 exit of B to the location.[/code]
Celui-là ne place pas tous les endroits dès le début du jeu, mais au fur et à mesure que le joueur avance.

D’abord, quand le joueur va dans une direction et qu’il y bien un endroit au bout, ça ne fait rien.
Mais si il va nulle part et qu’un biome (dans mon exemple) n’est pas visité, il en prend un au hasard et le place dans la direction, pour que le joueur puisse y aller.

Le défaut, c’est que si le joueur ne fait que d’aller au nord par exemple, t’aura une carte tout en longueur.
Aussi, comme la carte se construit au fur et à mesure, il n’y a pas moyen de savoir quelle pièce il y aura dans quelle direction la première fois, il faut donc dire au joueur qu’il doit explorer.
Ensuite, il faut améliorer un peu le code pour pas placer un désert juste à coté de la toundra, mais la base est là.

Je tiens à dire que pour les codes que je montre, je m’inspire très fortement du recipe book d’inform. Tu devrais essayer de jeter un coup d’œil, si ce n’est pas déjà fait.
Ah oui, et puis c’était Yoruk qui avait parlé de labyrinthe en premier, ça ma influencé pour mon premier post. :wink:

Voilà, je pense que t’as des éléments pour faire une map aléatoire. Mais j’anticipe : si tu veux une carte en grille, et que chaque lieu est connecté à huit autres lieux, ben je suis en train de réfléchir.

Une grille comme ça abcde 1 OOOOO 2 OOOOO 3 OOOOO Où chaque lieu est relié aux autres par toutes les directions, et où, au début du jeu, on met un endroit au hasard dans chaque coordonnées.

Tu peux aussi t’inspirer de ça si nécessaire :
github.com/i7/kerkerkruip/blob/ … ration.i7x

Ce n’est pas normal, je me fatigue à trouver une solution et tu en donnes une déjà toute faite…

J’ai regardé un peu, la partie qui intéresserait Azathoth est Part - Main Routines.
Je vais voir ça de plus près, il se peut que j’en ai aussi besoin un jour…

Après si effectivement tu recherches un vrai labyrinthe, la solution est de coder l’algorithme de création de labyrinthe directement en inform… Ou plus simple, tu pars d’une grille dans laquelle tu rajoutes des « murs » aléatoirement disposés. Mais tu risques de « fermer » des salles…

Merci à tous, je vais potasser vos propositions, ne serait-ce que pour m’améliorer un peu en syntaxe.

Voici ce que j’ai bricolé en attendant :

[code]« map » by Pieyre Wittmann

Include French by Eric Forgeot.
Use French Language.
Include Basic Screen Effects by Emily Short.
Include boussole by Benjamin Roux.

A maproom is a kind of room.

A room can be plaine, forêt, marais or désert. A room is usually plaine.

Before printing the locale description when player is in a plaine room, say « [line break]Vous êtes dans une plaine. ».

Before printing the locale description when player is in a forêt room, say « [line break]Vous êtes dans une forêt. ».

Before printing the locale description when player is in a marais room, say « [line break]Vous êtes dans des marais. ».

Before printing the locale description when player is in a désert room, say « [line break]Vous êtes dans un désert. ».

After printing the locale description when player is in a maproom, say « [line break]Il est : [bold type][time of day][roman type]. Les directions possibles sont :[line break][exits] ».

A room can be faite. A room is usually not faite.

A direction can be flat. A direction is usually flat. Outside is not flat. Inside is not flat. Up is not flat. Down is not flat.

Before going somewhere :
clear the screen.

Before going somewhere when player is in a plaine room:
repeat with x running from 1 to a random number between 5 and 15
begin;
follow the turn sequence rules;
end repeat.

Before going somewhere when player is in a forêt room:
repeat with x running from 1 to a random number between 15 and 45
begin;
follow the turn sequence rules;
end repeat.

Before going somewhere when player is in a marais room:
repeat with x running from 1 to a random number between 45 and 120
begin;
follow the turn sequence rules;
end repeat.

Room1 is a maproom.
Room2 is a maproom.
Room3 is a maproom.
Room4 is a maproom.
Room5 is a maproom.
Room6 is a maproom.
Room7 is a maproom.
Room8 is a maproom.
Room9 is a maproom.
Room10 is a maproom.
Room11 is a maproom.
Room12 is a maproom.
Room13 is a maproom.
Room14 is a maproom.
Room15 is a maproom.
Room16 is a maproom.
Room17 is a maproom.
Room18 is a maproom.
Room19 is a maproom.
Room20 is a maproom.

To say exits:
repeat with D running through directions:
if the room D from the location is a room, say « [line break]• [D][line break] ».

An arbre is a kind of thing.

A sapin is a kind of arbre. There are 100 sapin.
A chêne is a kind of arbre. There are 100 chêne.
A hêtre is a kind of arbre. There are 100 hêtre.

When play begins:
[ ROOM 1 —> R ]
let R be a random not faite maproom which is not Room1;
let D1 be a random flat direction;
let D2 be the opposite of D1;
change the D1 exit of Room1 to R;
change the D2 exit of R to Room1;
now Room1 is faite;
now R is faite;
[ TYPE DE ROOM ]
if a random chance of 1 in 5 succeeds
begin;
now R is forêt;
let ARB be a random number between 5 and 15;
repeat with x running from 1 to ARB
begin;
move a random arbre to R;
end repeat;
otherwise if a random chance of 1 in 15 succeeds;
now R is marais;
otherwise if a random chance of 1 in 50 succeeds;
now R is désert;
end if;
[ R —> R2 ]
let R2 be a random not faite maproom which is not Room1;
let D1 be a random flat direction;
let D2 be the opposite of D1;
change the D1 exit of R to R2;
change the D2 exit of R2 to R;
now R2 is faite;
[ TYPE DE ROOM ]
if a random chance of 1 in 5 succeeds
begin;
now R2 is forêt;
let ARB be a random number between 5 and 15;
repeat with x running from 1 to ARB
begin;
move a random arbre to R2;
end repeat;
otherwise if a random chance of 1 in 15 succeeds;
now R2 is marais;
otherwise if a random chance of 1 in 50 succeeds;
now R2 is désert;
end if;
[ R —> R3 ]
let R3 be a random not faite maproom which is not Room1;
let D1 be a random flat direction;
let D2 be the opposite of D1;
change the D1 exit of R to R3;
change the D2 exit of R3 to R;
now R3 is faite;
[ TYPE DE ROOM ]
if a random chance of 1 in 5 succeeds
begin;
now R3 is forêt;
let ARB be a random number between 5 and 15;
repeat with x running from 1 to ARB
begin;
move a random arbre to R3;
end repeat;
otherwise if a random chance of 1 in 15 succeeds;
now R3 is marais;
otherwise if a random chance of 1 in 50 succeeds;
now R3 is désert;
end if;
[ R2 —> R4 ]
let R4 be a random not faite maproom which is not Room1;
let D1 be a random flat direction;
let D2 be the opposite of D1;
change the D1 exit of R2 to R4;
change the D2 exit of R4 to R2;
now R4 is faite;
[ TYPE DE ROOM ]
if a random chance of 1 in 5 succeeds
begin;
now R4 is forêt;
let ARB be a random number between 5 and 15;
repeat with x running from 1 to ARB
begin;
move a random arbre to R4;
end repeat;
otherwise if a random chance of 1 in 15 succeeds;
now R4 is marais;
otherwise if a random chance of 1 in 50 succeeds;
now R4 is désert;
end if.

Player is in Room1[/code]

La map est générée aléatoirement - sa taille est variable. Et j’ai mis un petit système qui détermine aléatoirement, aussi, le type de terrain. C’est très brouillon mais à partir de là tout est possible.

J’ai corrigé ce qui me semblait buguer - le problème étant qu’en allant au nord, puis au sud, par exemple, on ne revenait pas forcément au point de départ.

Si quelqu’un se sent de faire x essais pour vérifier … j’en fais moi aussi de mon côté.

Après x tests :

truc amusant, si j’essaie d’ajouter une room à ma map aléatoire, du genre :

[ R2 ---> R5 ] let R5 be a random not faite maproom which is not Room1; let D1 be a random flat direction; let D2 be the opposite of D1; change the D1 exit of R2 to R5; change the D2 exit of R5 to R2; now R5 is faite;

Là ça se met à débloquer (ex : je vais au nord, puis au sud, et je ne suis pas à mon point de départ…)