珍走記を改造しよう

第二回:都道府県を追加しよう

都道府県を追加しよう

前回マップの変更ができるようになったので、今回は都道府県の変更をしてみましょう。

まず、main.jsを見てみましょう。前回の通り、県のデータは2行目です。 prfname=[47,'東京都','北海道','青森県','秋田県','岩手県','山形県','宮城県','福島県','新潟県','茨城県','栃木県','群馬県','埼玉県','千葉県','神奈川県','長野県','山梨県','静岡県','富山県','石川県','福井県','岐阜県','愛知県','三重県','滋賀県','奈良県','和歌山県','京都府','大阪府','兵庫県','鳥取県','島根県','岡山県','広島県','山口県','香川県','徳島県','愛媛県','高知県','福岡県','大分県','佐賀県','長崎県','宮崎県','熊本県','鹿児島県','沖縄県','太平洋(南)','太平洋(北)','日本海','']; 2行目はこんな感じになっていると思います。地名データと同じように、都道府県名が「'」の間に書いてあり、それを「,」で区切っています。

最初の「47」は、都道府県の数を表しています。これは目的地を決定するときに使われますが、今回は最終的に目的地の決定方法を変更するので、意味がなくなります。しかし、消すと県の番号がずれるので、残しておくようにしましょう。

都道府県の追加の方法は簡単です。「''」の後ろに県を追加するだけです。そして、地形を追加するときには県の番号を指定すればいいだけです。

これだけで県の追加は終了です。

しかし、これだとその県は絶対に目的地にはなりませんし、領地にすることができません。そこで、新しく追加した都道府県も領地にできるようにしてみましょう。

追加した都道府県が領地になるようにしよう

実は珍走記の目的地は都道府県単位でなく、場所単位で決まっています。つまり、たとえば「カーショップ」や「フェリー」を目的地にすることもできるというわけです。

では、珍走記ではどのように目的地を決めているのかですが、基本的に都道府県の都道府県庁所在地が目的地になっていますが、これは「○○県の県庁所在地は××」などと設定しているのではなく、単に都道府県庁所在地が地名データの先頭に来ているだけです。地名データを見ると、「ナシ」「東京」「札幌」「青森」・・・と続いています。何故東京が最初からかというと、東京は目的地に選ばれない(=東京都は目的地に選ばれない)からです。

では、最後の「那覇」の後ろに目的地となる場所を追加すればいいように思うかもしれませんが、そうすると地名データの番号がずれてしまいます。つまり、普通の地名と同じように目的地となる場所も追加する必要があります。

しかし、それだとやはり目的地にはなりません。そこで、目的地の決定部分を少しいじります。

lib.cgiを開き、 $bet=100; #車券一口の値段(万円) の上あたりに @canbegoal=(2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47); #目的地になる可能性のある場所 と追加して下さい。

これが、目的地になる可能性のある場所のリストです。地名データと対応していて、2が札幌、3が青森、・・・と都道府県庁所在地のリストになっています。

ここに追加することで、目的地を設定できます。

次に、main.cgi ###ゴール処理 if($user{"${num}_position"}==$user{'*goal'}){ $user{'*history'}.="+$prf+"; @history=split(/\+/,$user{'*history'}); $rnd=int(rand($lib'prfnum-($history+3)/2))+2; $newgoal=1; $j=1; while($j<$rnd && $newgoal<=$lib'prfnum){ $newgoal++; if($user{'*history'}!~/\+$newgoal\+/){ $j++; } } $ret=0; if($newgoal>$lib'prfnum){ $newgoal=int(rand($lib'prfnum-2))+2; $newgoal++ if $newgoal>=$user{'*goal'}; $ret=1; } ###ゴール処理 if($user{"${num}_position"}==$user{'*goal'}){ $user{'*history'}.="+$prf+"; my(@my_canbegoal)=@lib'canbegoal; #シャッフル for(my($aaa)=0;$aaa<300;$aaa++){ my($a,$b); $a=int(rand(@my_canbegoal)); $b=int(rand(@my_canbegoal)); my($c)=$my_canbegoal[$a]; $my_canbegoal[$a]=$my_canbegoal[$b]; $my_canbegoal[$b]=$c; } $ret=1; #目的地選択 for($aaa=0;$aaa<@my_canbegoal;$aaa++){ my(@rel1)=&lib'getgraph($my_canbegoal[$aaa]); next if((&lib'getowner($rel1[3]) != 0)||($user{'*goal'} == $my_canbegoal[$aaa])); $newgoal=$my_canbegoal[$aaa]; $ret=0; last; } if($ret==1){ #見つからない場合 $newgoal=$my_canbegoal[int(rand(@my_canbegoal))]; } my($was_goal)=$user{'*goal'}; とします。これは、ゴールを、上で追加した情報を使って決定する処理です。

さらに、item.cgiを開き、 }elsif($item=~/I/){ @history=split(/\+/,$user{'*history'}); $rnd=int(rand($lib'prfnum-($history+3)/2))+2; $newgoal=1; $j=1; while($j<$rnd && $newgoal<=$lib'prfnum){ $newgoal++; if($user{'*history'}!~/\+$newgoal\+/){ $j++; } } if($newgoal<=$lib'prfnum && $newgoal!=$user{'*goal'}){ }elsif($item=~/I/){ my(@my_canbegoal)=@lib'canbegoal; #シャッフル for(my($aaa)=0;$aaa<300;$aaa++){ my($a,$b); $a=int(rand(@my_canbegoal)); $b=int(rand(@my_canbegoal)); my($c)=$my_canbegoal[$a]; $my_canbegoal[$a]=$my_canbegoal[$b]; $my_canbegoal[$b]=$c; } $ret=1; #目的地選択 for($aaa=0;$aaa<@my_canbegoal;$aaa++){ my(@rel1)=&lib'getgraph($my_canbegoal[$aaa]); next if((&lib'getowner($rel1[3]) != 0)||($user{'*goal'} == $my_canbegoal[$aaa])); $newgoal=$my_canbegoal[$aaa]; $ret=0; last; } if($ret==0 && $newgoal!=$user{'*goal'}){ として下さい。これは革命権の処理を変更するものです。

これで、新しい都道府県を追加したりすることも可能になりました。また、今までは目的地は都道府県庁所在地だけでしたが、例えばカーショップを目的地にしたり、フェリーを目的地にしたりいろいろなことができるはずです。いろいろ試してみましょう。