Perl, 293 bayt
@Dom Hastings sayesinde -9 bayt
{$==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
-E
Çalıştırmak için bayrak ekleyin :
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'
Ancak, çalışması uzun zaman alıyor, bu yüzden bunun yerine bu sürümü kullanmanızı öneririz:
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'
Çevrimiçi deneyin!
açıklama
{ # bir blok girin (döngü olarak kullanılır) { $ == 7 + rand 30 ; # haritanın genişliğini rastgele seçin -2 # (-2 çünkü sınırları henüz eklemiyoruz ) @r = $ "= (); # reset @r ve $" değerini undef @a = ( # create olarak ayarlayın tahtada olabilecek karakterin bir listesi ( C ) x4 , # 4 jeton 'C' ( E ) x3 , # 3 düşman 'E' ( "#" ) x1369 , # 37 * 37 '#' "
( ) x1369 }
$ r [); # 37 * 37 boşluklar için $ i ( 0..7 + rand 30 ) # 2B haritası oluşturmak (7 Rand 30 şimdi oluşturulur yüksekliği ise +) için $ _ ( 0. . $ = - 1 ) {
$ r [ $ i ] [ $ _ ] = # dizin [$ i] [$ _] ...
eki @ a , rand @ a , 1 # .. daha önce oluşturulan # listesinden rastgele bir karakter alıyor (karakter daha sonra 'ekleme' sayesinde listeden çıkarıldı) } 0 $ =] = F ;
] [ # bitiş hücresini ekleyin
$ r [- 1 ] [ 0 ] = P ; # Eklemek başlangıç hücre
$ _ = $ r = # burada haritanın bir dize temsilini oluşturmak
katılmak $ /, # yeni satırlar ile aşağıdaki unsurları katılmak
$ v = "#" x ( $ = + = 3 ), # birinci # hattı sadece ( map "# @ $ _ #" , @r ), # başında ve her satırın sonuna bir # eklemek
$ v ; # # satırının son satırı
1 # aşağıdaki regex, erişilebilir her hücreyi F
$ r = ~ s / F (. { $ =}) İle değiştirir ? [^ # F ] / F $ 1F / s # bir F hücresi değiştirilir || # veya
$ r = ~ s / [^ # F ] (. { $ =})? F / F $ 1F / s ; # F hücresinin solundaki veya üstündeki bir hücre değiştirilir
$ r ! ~ / [CEP] / # Haritada C, E veya P yoksa (hepsinin erişilebilir olduğu anlamına gelir)
&& /C.*C/ s # ve en az 2 jeton var && / E / ? # Ve 1 düşman son : haritası geçerlidir #, biz döngü çıkmak kokan başka # baştan başlamak }
söylemek # ve tahta baskı
Çalıştırmak uzun zaman alıyor, çünkü tahtaya koymak için rastgele karakterler seçtiğimiz liste ( @a
) 1369 boşluk #
ve sadece 4 sikke ve 3 düşman içeriyor . Genişlik ve yüksekliğin boyutu küçükse, #
madeni para ve düşmanlarla karşılaştırıldığında çok fazla alan vardır , bu yüzden rastgele bir haritanın geçerli olmayacağı muhtemeldir. "Optimize" sürüm daha hızlı olmasının nedeni budur: Biz karakterleri almak hangi liste haritadan daha sadece biraz daha büyük (listesidir @a=((C)x4,(E)x3,("#")x($v=rand $=*$%),($")x($=*$%-$v))
: rastgele bir sayı $v
ait #
haritanın büyüklüğüne aşağı () ve size of the map - $v
boşlukların).