#! @PERL_SHEBANG@ #====================================================================== # perl.robot -- Copyright(c) 1999 Shinsuke Noguchi #====================================================================== # ・RealTimeBattleのロボット記述用のスケルトンです. # ・基礎的な通信部分が実装されています. # ・メッセージハンドラを変更すれば,簡単にロボットを記述できます. # ・月島美夏氏のスクリプトを参考にさせて頂きました. #====================================================================== #====================================================================== # グローバル変数 #====================================================================== $PI = 3.14159265359; ### レーダーで発見された対象のタイプ %OBJ = ( NOOBJECT, -1, ROBOT, 0, SHOT, 1, WALL, 2, COOKIE, 3, MINE, 4 ); ### ゲームオプション @OPTNUM = ( 'ROBOT_MAX_ROTATE', 'ROBOT_CANNON_MAX_ROTATE', 'ROBOT_RADAR_MAX_ROTATE', 'ROBOT_MAX_ACCELERATION', 'ROBOT_MIN_ACCELERATION', 'ROBOT_START_ENERGY', 'ROBOT_MAX_ENERGY', 'ROBOT_ENERGY_LEVELS', 'SHOT_SPEED', 'SHOT_MIN_ENERGY', 'SHOT_MAX_ENERGY', 'SHOT_ENERGY_INCREASE_SPEED', 'TIMEOUT', 'DEBUG_LEVEL', ); #====================================================================== # メッセージハンドラ #====================================================================== #====================================================================== # Message: Initialize [first?(int)] #====================================================================== # 一番最初にロボットに送られるメッセージ. # ロボットのNameとColourをサーバーに送信しましょう. #====================================================================== sub INITIALIZE { my($first) = @_; if ($first) { print "Name Skeleton\n"; print "Colour 22FF55 22FF55\n"; } } #====================================================================== # Message: GameOption [optionnr(int)] [val(double)] #====================================================================== # 自機の最大回転速など,ゲームごとの設定が送られてきます. # このスクリプト中では$OPTION{ROBOT_MAX_ROTATE}などとすることでこの値を # 参照できるようになっています. #====================================================================== sub GAMEOPTION { my( $opt, $val ) = @_; $OPTION{$OPTNUM[$opt]} = $val; } #====================================================================== # Message: GameStarts #====================================================================== # ゲーム開始時に送られてくるメッセージです. # ロボットの初期動作の記述や,変数の初期化を行うと良いでしょう. #====================================================================== sub GAMESTARTS { printf "Accelerate %f\n", 0.1; printf "Rotate 1 %f\n", 0.3; } #====================================================================== # Message: Rader[distance(double)] [observed object type(int)] # [rader angle(double)] #====================================================================== # 毎ターン送られてくるレーダーからの情報です.ここに動作を記述する # ことで,反射的な動作をするロボットをつくることができます. #====================================================================== sub RADAR { ($DIST, $TYPE, $RANGLE) = @_; if( $TYPE == $OBJ{ROBOT} ) { printf "Shoot %f\n", $OPTION{SHOT_MAX_ENERGY}; } else { printf "Rotate 6 %f\n", 1.0; } } #====================================================================== # Message: ExitRobot #====================================================================== # このメッセージが送られてきた場合,直ちにプログラムを終了する必要が # あります. #====================================================================== sub EXITROBOT { exit; } #====================================================================== # メッセージ処理ルーチン #====================================================================== sub in { my( $str, @args, $msg, $callstr ) = @_; chop($str); @args = split(/\s/,$str); $msg = shift(@args); $msg =~ tr/[a-z]/[A-Z]/; $callstr = sprintf "do $msg('%s')", join("','",@args); eval($callstr); } sub idol { ### ロボットのアイドル時間に何か処理をしたい場合は ### ここに記述してください. } sub wait_message { my($rbit,$ebit,$str); while(1) { $ebit = $rbit = ''; vec($rbit,fileno(STDIN),1) = 1; select($rbit,undef,$ebit,1); if ( vec($rbit,fileno(STDIN),1) ) { if ($str = ) { do in($str); next; } } do idol(); } } #====================================================================== # メイン #====================================================================== $|=1; print "RobotOption 3 0\n"; &wait_message; exit; #====================================================================== # 角度の正規化 #====================================================================== sub nrad { my($rad,$deg) = @_; $deg = $rad * 180 / $PI; $deg = (($deg + 180) % 360) - 180; return $deg * $PI / 180.0; }