Perl, 293 octets
-9 octets grâce à @Dom Hastings
{$==7+rand 30;@r=$"=();@a=((C)x4,(E)x3,("#")x1369,(" ")x1369);for$i(0..7+rand 30){$r[$i][$_]=splice@a,rand@a,1for 0..$=}$r[0][$=]=F;$r[-1][0]=P;$_=$r=join$/,$v="#"x($=+=3),(map"#@$_#",@r),$v;1while$r=~s/F(.{$=})?[^#F]/F$1F/s||$r=~s/[^#F](.{$=})?F/F$1F/s;$r!~/[CEP]/&&/C.*C/s&&/E/?last:redo}say
Ajoutez un -E
indicateur pour l'exécuter:
perl -E '{$==7+rand 30;@r=$"=();@a=((C)x4,(E)x3,("#")x1369,(" ")x1369);for$i(0..7+rand 30){$r[$i][$_]=splice@a,rand@a,1for 0..$=}$r[0][$=]=F;$r[-1][0]=P;$_=$r=join$/,$v="#"x($=+=3),(map"#@$_#",@r),$v;1while$r=~s/F(.{$=})?[^#F]/F$1F/s||$r=~s/[^#F](.{$=})?F/F$1F/s;$r!~/[CEP]/&&/C.*C/s&&/E/?last:redo}say'
Cependant, son exécution prend beaucoup de temps, je recommande donc d'utiliser cette version à la place:
perl -E '{${$_}=8+rand 30for"=","%";@r=$"=();@a=((C)x4,(E)x3,("#")x($v=rand $=*$%),(" ")x($=*$%-$v));for$i(0..$%-1){$r[$i][$_]=splice@a,rand@a,1for 0..$=-1}$r[0][$=-1]=F;$r[$%-1][0]=P;$_=$r=join$/,$v="#"x($=+=2),(map"#@$_#",@r),$v;1while$r=~s/F(.{$=})?[^#F]/F$1F/s||$r=~s/[^#F](.{$=})?F/F$1F/s;$r!~/[CEP]/&&/C.*C/s&&/E/?last:redo}say'
Essayez-le en ligne!
Explication
{ # entrez un bloc (qui est utilisé comme boucle) { $ == 7 + rand 30 ; # sélectionnez aléatoirement la largeur de la carte -2 # (-2 car nous n'incluons pas encore les bordures) @r = $ "= (); # reset @r, et définissez $" sur undef @a = ( # create une liste des personnages qui peuvent être sur le plateau ( C ) x4 , # 4 pièces 'C'
( E ) x3 , # 3 ennemis 'E' ( "#" ) x1369 , # 37 * 37 '#'
("" ) x1369 ); # 37 * 37 espaces pour $ i ( 0..7 + rand 30 ) # créer la carte 2D (7 + rand 30 est la hauteur, qui est générée tout à l'heure) pour $ _ ( 0 .. $ = - 1 ) {
$ r [ $ i ] [ $ _ ] = # index [$ i] [$ _] reçoit ...
splice @ a , rand @ a , 1 # .. un caractère aléatoire de la liste précédemment générée # (le caractère est puis supprimé de la liste grâce à 'splice') } }
$ r [
0 ] [ $ =] = F ; # ajouter la cellule d'arrivée
$ r [- 1 ] [ 0 ] = P ; # ajoutez la cellule de départ
$ _ = $ r = # ici nous générons une représentation sous forme de chaîne de la carte
join $ /, # joignez les éléments suivants avec des nouvelles lignes
$ v = "#" x ( $ = + = 3 ), # a en premier ligne de # uniquement ( carte "# @ $ _ #" , @r ), # ajoutez un # au début et à la fin de chaque ligne
$ v ; # la dernière ligne de #
1 tandis que # l' expression régulière suivante remplacera chaque cellule accessible par une cellule F
$ r = ~ s / F (. { $ =})? [^ # F ] / F $ 1F / s # une cellule à droite ou en bas d'une La cellule F est remplacée || # ou
$ r = ~ s / [^ # F ] (. { $ =})? F
/ F $ 1F / s ; # une cellule à gauche ou en haut d'une cellule F est remplacée
$ r ! ~ / [CEP] / # s'il n'y a pas de C, E ou P sur la carte (ce qui signifie qu'ils étaient tous accessibles) &&
/C.*C/ s # et il y a au moins 2 pièces && / E / ? # et 1 ennemi en dernier : # la carte est valide, on quitte la boucle refaire # else, recommencer }
dire # et imprimer la carte
Cela prend beaucoup de temps, car la liste dans laquelle nous choisissons au hasard les personnages à mettre sur le plateau ( @a
) contient 1369 espaces blancs et #
, et seulement 4 pièces et 3 ennemis. Donc, si la taille de la largeur et de la hauteur sont petites, il y a beaucoup d'espaces et #
par rapport à la pièce et aux ennemis, il est donc très probable qu'une carte aléatoire ne soit pas valide. C'est pourquoi la version "optimisée" est plus rapide: la liste dans laquelle nous choisissons les personnages est juste un peu plus grande que la carte (la liste est @a=((C)x4,(E)x3,("#")x($v=rand $=*$%),($")x($=*$%-$v))
: un nombre aléatoire $v
de #
(inférieur à la taille de la carte), et des size of the map - $v
espaces blancs).