hakoniwaRAの改造
対象プログラム hakoniwaRA ver030314
内容 電車の動く処理を一元化する
説明 電車の動く処理を変えました、配布されているものに比べ大分短くすることが可能です。
また、処理を少し加えるだけで新しい電車も追加できます。
配布されているものでは、電車一つ一つに対して、
動ける方向を決める→移動予定先の地形が線路&地形の値が相応しいか→相応しかったら電車移動
という処理でしたが、ここでは、電車があればとにかく動ける方向を決める→
→移動予定先が線路&移動予定先からも移動元に動けるか判定→動けるようだったら動かす
という処理に変わっています。
この改造は本家、情報交換掲示板、No.5434のnul様の記事を参考にさせて頂きました。
一応、動作は確認しておりますが、なにか不具合があるかも知れませんので、
そのようなことがあれば報告よろしくお願い致します。
日付 2006/3/16
作者 片翼の天使
履歴

hako-turn.cgiの6150〜7430行付近
	    }

	} elsif($landKind == $HlandTrain) {
	    # 電車
	    if(($lv >= 10) && ($lv <= 29)){
		my($Ttype) = int($lv/10); # 列車の種類を判断
		my($Tkind) = $lv % 10;    # 線路の種類を判断
		my(@tdire) = Tmoveline($Tkind); # 動ける方向を洗い出す
		my($mline);
		# 動く方向を決定する
		if($tdire[0] == 0){
		    # 動ける方向は2方向のみ
			if(random(2) == 0){
			    $mline = $tdire[1];
			} else{
			    $mline = $tdire[2];
			}
		} else{
		    # 動ける方向は3方向
			my($pro);
			$pro = random(3);
			if($pro == 1){
			    $mline = $tdire[0];
			} elsif($pro == 2){
			    $mline = $tdire[1];
			} else{
			    $mline = $tdire[2];
			}
		}
		$sx = $x + $ax[$mline];
		$sy = $y + $ay[$mline];
		# 行による位置調整
		if((($sy % 2) == 0) && (($y % 2) == 1)) {
		    $sx--;
		}
		# 範囲外判定
		if(($sx < 0) || ($sx >= $HislandSize) ||
		   ($sy < 0) || ($sy >= $HislandSize)) {
		    next;
		}

		my($sl) = $land->[$sx][$sy];
		my($slv) = $landValue->[$sx][$sy];
		if(($land->[$sx][$sy] == $HlandTrain) && ($slv >= 0) && ($slv <= 9)){
		    my($i);
		    my(@stdire) = Tmoveline($slv);
		    foreach $i (@stdire){
			# 移動予定先から移動元地形に動けるかチェック
			if(($i - $mline == 3)||($i - $mline == -3)){
			    # 動けるようだったら電車を動かす
			    $landValue->[$sx][$sy] += $Ttype*10;
			    $landValue->[$x][$y] -= $Ttype*10;
			    if($Ttype == 1){
				$island->{'money'} += 1000;
				$island->{'trainmoney'} += 1000;
				$island->{'shouhi'} += 100;
			    } elsif($Ttype == 2){
				$island->{'money'} += 500;
				$island->{'trainmoney2'} += 500;
				$island->{'shouhi'} += 10;
			    }

			    if($island->{'sabun'} < 0) {
				$landValue->[$sx][$sy] -= $Ttype*10;
				if($Ttype == 1){
				    logStarve3($id, $name, "普通列車", "($sx, $sy)");
				} elsif($Ttype == 2){
				    logStarve3($id, $name, "貨物列車", "($sx, $sy)");
				}
		             } 
			    last;
			}
		    }
		}
	    }
	} elsif($landKind == $HlandKura) {
	    $seq = int($lv/100);

hako-turn.cgiの16056〜16061行付近
    return $count;
}

sub Tmoveline{
    # (0,なし 1,右上 2,右 3,右下 4,左下 5,左 6,左上)
    my($tkind) = @_;
    my(@dire1) = (0, 0, 0, 0, 0, 0, 1, 2, 0, 0);
    my(@dire2) = (2, 2, 1, 3, 2, 2, 3, 4, 4, 2);
    my(@dire3) = (5, 5, 5, 5, 6, 4, 5, 6, 5, 3);
    return ($dire1[$tkind] , $dire2[$tkind] , $dire3[$tkind]);
}

# 0から(n - 1)までの数字が一回づつ出てくる数列を作る
sub randomArray {
    my($n) = @_;


戻る