全国高校生プログラミングコンテスト

CHaser2011
ステップアップヒント４
15 サンプルプログラム４（ステータスを表示したプログラム）①プログラムの保存先
program フォルダの下に「sample2011_04」という名前のフォルダを作り、次のプログラムを入力します。プログラム名は「sample2011_04.java」です。
②プログラムの動作・クール専用のプログラムで、基本の動きは sample2011_03 と同じです。
・ポート番号が 2009 のときはクール、2010 のときはホットで動作するようにモード番号を格納してからプログラムを開始します。
・ステータス（ターン数、モード番号、アイテム数）を画面に表示させます。
③サンプルプログラム４（sample2011_04.java）
12
34
567891011121314151617181920
2122232425262728
2930
3132
33
3435

/****************************************************
sample2011_04.java******************************************************/
public class sample2011_04 {public static void main(String[] args) {int[] value;
value = new int[10];int mode = 1,// 現在のモード
old_mode = 1, // 前のモード
turn = 0,// ターン数
item = 0;// アイテム数/********** 競技サーバに接続する **********/
edu.procon.Connect2010 target;
target = new edu.procon.Connect2010("サンプ４", args[0] ,Integer.parseInt(args[1]));
if(Integer.parseInt(args[1]) == 2009) {mode = 1;
System.out.print("クールで競技サーバに接続しました。");}else{
mode = 3;
System.out.print("ホットで競技サーバに接続しました。");}
while (true) {value = target.getReady( );if (value[0] == 0) break;turn++; // ターン数＋１// ステータス表示
System.out.print("¥nturn=" + turn + "、mode=" + mode + "、item=" + item);/********** 周囲（上下左右）に相手がいるかチェック **********/
if(value[2]==1 || value[4]==1 || value[6]==1 || value[8]==1){

1363738
3940
41
4243
44454647
4849505152535455
5657585960616264656667
68
69
7071
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95

mode = 90;// mode を 90 に変更する}/********** 周囲（上下左右）にアイテムがあるかチェック **********/
if(value[2]==3 || value[4]==3 || value[6]==3 || value[8]==3){
old_mode = mode;// 現在のモードを old_mode に保存する
mode = 20;// mode を 20 に変更する}/********** mode の値で分岐する **********/
switch (mode) {case 1:// ブロック（壁）にぶつかるまで下に移動する
if(value[8] != 2){// 下が壁でなければ、
value = target.walkDown( ); // 下に移動する}else{
value = target.walkRight( ); // 下が壁ならば、右に移動し、mode = 2;// mode を 2 に変更する}
break;
case 2: // ブロック（壁）にぶつかるまで右に移動する
if(value[6] != 2){
value = target.walkRight( );}else{
value = target.walkUp( );mode = 3;}
break;
case 3: // ブロック（壁）にぶつかるまで上に移動する
if(value[2] != 2){
value = target.walkUp( );}else{
value = target.walkLeft( );mode = 4;}
break;
case 4: // ブロック（壁）にぶつかるまで左に移動する
if(value[4] != 2){
value = target.walkLeft( );}else{
value = target.walkDown( );mode = 1;}
break;
case 20: // 周囲にアイテムがあったら、取りに行く// 上にアイテムがあったら、上に移動する
if(value[2] == 3) value = target.walkUp( );// 左にアイテムがあったら、左に移動する
else if(value[4] == 3) value = target.walkLeft( );// 右にアイテムがあったら、右に移動する
else if(value[6] == 3) value = target.walkRight( );// 下にアイテムがあったら、下に移動する
else value = target.walkDown( );mode = old_mode; // モードを元に戻す
item++; // アイテム数＋１
break;
case 90: // 周囲に相手がいたら、ブロックをのせる// 上に相手がいたら、上にブロックをのせる
if(value[2] == 1) value = target.putUp();// 左に相手がいたら、左にブロックをのせる
else if(value[4] == 1) value = target.putLeft();// 右に相手がいたら、右にブロックをのせる

2

96
97
98
99
100
101
102
103
104
105
106
107

else if(value[6] == 1) value = target.putRight();// 下に相手がいたら、下にブロックをのせる
else value = target.putDown();
break;}/********** 制御情報が 0 だったら終了する **********/if(value[0] == 0) break;}}/********** 競技サーバから切断する **********/
target.exit( );}⑤プログラム説明・変数の宣言11
12

turn = 0,item = 0;// ターン数// アイテム数

ターン数とアイテム数を格納する変数を宣言します。
・チーム名
16

target = new edu.procon.Connect2010("サンプ４", args[0] ,Integer.parseInt(args[1]));

edu.procon.Connect2010 クラスを使って競技サーバに接続します。どのプログラムが対戦しているかわかるようにするため、チーム名を「サンプ４」にしました（変更しても構いません）。
・クールとホットのどちらで動作するか
29
30
31
32

if(Integer.parseInt(args[1]) == 2009) {mode = 1;
System.out.print("クールで競技サーバに接続しました。");}else{mode = 3;
System.out.print("ホットで競技サーバに接続しました。");}

クライアントプログラムを起動するときに指定したポート番号は args[1]の中に格納されるので if 文を使い 2009 の時はモード 1（下に移動）、2010 の時はモード 3（上に移動）するようにします。
・ステータス表示
2930
3132

turn++; // ターン数＋１// ステータス表示
System.out.print("¥nturn=" + turn + "、mode=" + mode + "、item=" + item);

ターン数をプラス１した後、ステータスを表示します書式は変更して構いません。

3

・アイテムを取った時
88

item++; // アイテム数＋１獲得したアイテム数は item に格納されているのでプラス１します。
16 サンプルプログラム４を起動するバッチファイルの作成「サンプルプログラム４をクールで起動するバッチファイル」を作ります。
program フォルダの下に、CHaser2011sample04Cool.bat を作り、メモ帳などで画面 29 のように入力します。同様にホットで起動する CHaser2011sample04Hot.bat を作ります。
@echo offecho ---------------------------------------------------------------------echo sample2011_04 起動用バッチファイル（JDK6 Update24） 2011.7.26
echo ---------------------------------------------------------------------set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_24
set PATH=%PATH%;%JAVA_HOME%\bin;set CLASSPATH=.;%JAVA_HOME%\program\edu2010b.jar
C:
cd %JAVA_HOME%\program\sample2011_04
クール(2009)で実行する
javac sample2011_04.java
start /b java sample2011_04 localhost 2009
【CHaser2011sample04Cool.bat】
なお、ホットを起動させる CHaser2011sample04Hot.bat は最後の行の 2009 を 2010 へ変更してください。また、これらのバッチファイルは 1 台のパソコンでサーバと 2 つのクライアントを起動する場合です。サーバがネットワークで接続された別のパソコンである場合は、最後の行 localhost をサーバの IP アドレスへ変更してください。（例：サーバの IP
アドレスが例えば 192.168.0.1 の場合、localhost を 192.168.0.1 へ変更する）
バッチファイルには javac でコンパイルをしていますので、プログラムを変更したときもその都度手動でコンパイルする必要はありませんので、とても便利です。

※ステップアップヒントは以上で終了です。皆さんの参加をお待ちしています！

4