CHaser2009step4

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

CHaser2009
ステップアップヒント４【サンプルプログラム４】mode と step を使ったプログラム
program フォルダの下に「sample2009_04」という名前のフォルダを作り、次のプログラムを入力します。プログラム名は「sample2009_04.java」です。
【動作】・スタート直後に上下左右をサーチし、アイテムのある方向に進むようにします。
・アイテムが上下左右になかった場合、今まで通り上に進みます。
・新たに step という変数を作り、それぞれの mode 内で step の数値に応じた動作ができるようにします。
・ステータス（アイテム数、ターン数、モード番号、ステップ番号）を画面に表示させます。
【sample2009_04.java】
12345678910111213141516171819202122232425262728
2930313233

public class sample2009_04 {public static void main(String[] args) {int[] value;
value = new int[10];int mode = 10,/* 現在のモード */old_mode = 1, /* 前のモード */step = 1,/* ステップ */turn = 0,/* ターン数 */item = 0,/* アイテム数 */i;/* カウンタ変数 *//********** 競技サーバに接続する **********/
edu.procon.Connect2009 target;
target = new edu.procon.Connect2009("全プロ４" );System.out.print("サーバと接続しました。");
while (true) {value = target.getReady( );if (value[0] == 0) break;turn++; /* ターン数＋１ */System.out.print("\nturn=" + turn + "、mode=" + mode + "、step=" + step);/********** 周囲に相手があるかチェック **********/
if(value[2]==1 || value[4]==1 || value[6]==1 || value[8]==1){
old_mode = mode;
mode = 90;}/********** 周囲にアイテムがあるかチェック **********/- 22 -

CHaser2009step4

34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97

if(value[2]==3 || value[4]==3 || value[6]==3 || value[8]==3){
old_mode = mode;
mode = 20;}/********** mode で分岐する **********/
switch (mode){case 1: /* 壁にぶつかるまで上に移動する */if(value[2] == 2){/* 上にブロックがあったら */value = target.walkRight( ); /* 右に移動し */mode = 2;/* mode を 2 に変更する */}else{value = target.walkUp( );/* そうでなければ、上に移動する */}break;
case 2: /* ブロックにぶつかるまで右に移動する */if(value[6] == 2){
value = target.walkDown( );mode = 3;}
else{value = target.walkRight( );}break;
case 3: /* ブロックにぶつかるまで下に移動する */if(value[8] == 2){
value = target.walkLeft( );mode = 4;}
else{value = target.walkDown( );}break;
case 4: /* ブロックにぶつかるまで左に移動する */if(value[4] == 2){
value = target.walkUp( );mode = 1;}
else{
value = target.walkLeft( );}break;
case 10: /* スタート直後、４方向をサーチして移動する方向を決める */switch (step){case 1:value = target.searchUp();/* 上をサーチする */System.out.print("：上サーチ");
for(i=1; i<10; i++){if(value[i] == 3){ /* 上方向にアイテムがあったら */System.out.print("：上方向にアイテムあり。");
mode = 1;/* 上に行くモードにして */break;/* ループを抜ける */}}if(i==10){
step = 2;/* アイテムがなかったら、ステップ 2 へ */}break;
case 2:
value = target.searchRight();/* 右をサーチする */System.out.print("：右サーチ");
for(i=1; i<10; i++){- 23 -CHaser2009step4

98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161

if(value[i] == 3){ /* 右方向にアイテムがあったら */System.out.print("：右方向にアイテムあり。");
mode = 2;/* 右に行くモードにして */step = 1;/* ステップを１に戻し */break;/* ループを抜ける */}}if(i==10){
step = 3;/* アイテムがなかったら、ステップ 3 へ */}break;
case 3:value = target.searchDown();/* 下をサーチする */System.out.print("：下サーチ");
for(i=1; i<10; i++){if(value[i] == 3){ /* 下方向にアイテムがあったら */System.out.print("：下方向にアイテムあり。");mode = 3;/* 下に行くモードにして */step = 1;/* ステップを１に戻し */break;/* ループを抜ける */}}if(i==10){
step = 4;/* アイテムがなかったら、ステップ 3 へ */}break;
case 4:
value = target.searchLeft();/* 左をサーチする */System.out.print("：左サーチ");
for(i=1; i<10; i++){if(value[i] == 3){ /* 左方向にアイテムがあったら */System.out.print("：左方向にアイテムあり。");
mode = 4;/* 左に行くモードにして */step = 1;/* ステップを１に戻し */break;/* ループを抜ける */}}if(i==10){
step = 1;/* アイテムがなかったら、ステップ 1 へ */mode = 1;/* 上に行くモードにする */}break;}
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 if(value[8] == 3) value = target.walkDown();mode = old_mode;
item++; /* アイテム数＋１ */System.out.print("：item=" + item); /* アイテム数の表示 */break;
case 90: /* 周囲に相手がいたら、put する *//* 上に相手がいたら */if(value[2] == 1)
value = target.putUp();/* 左に相手がいたら */else if(value[4] == 1) value = target.putLeft();- 24 -CHaser2009step4

162
163
164
165
166
167
168
169
170
171
172
173
174
175
176

/* 右に相手がいたら */else if(value[6] == 1) value = target.putRight();/* 下に相手がいたら */else if(value[8] == 1) value = target.putDown();mode = old_mode;
break;}/********** 制御情報が 0 だったら終了する **********/
if(value[0] == 0) break;}/********** 競技サーバから切断する **********/
target.exit( );}}

【プログラム説明】①変数の宣言78910
1112

int mode = 10,/* 現在のモード */old_mode = 1, /* 前のモード */step = 1,/* ステップ */turn = 0,/* ターン数 */item = 0,/* アイテム数 */i;/* カウンタ変数 */スタート直後に上下左右をサーチしアイテムのある方向を探索する新しいモード（モード 10）を実行させるので、mode の初期値は 10 となります。
step の初期値は 1 とします。turn は現在のターン数、item は取得したアイテム数、i は for 文のカウンタ変数です。
②チーム名
16

target = new edu.procon.Connect2009("全プロ４" );edu.procon.Connect2009 クラスを使って競技サーバに接続します。「サンプルプログラム４」なので、チーム名を「全プロ４」にしました（変更しても構いません）。
③接続成功のメッセージを表示
18

System.out.print("競技サーバに接続しました。");

競技サーバに接続したことを知らせるメッセージをコマンドプロンプトの画面に表示させます。
④ステータスの表示
2425

turn++; /* ターン数＋１ */System.out.print("\nturn=" + turn + "、mode=" + mode + "、step=" + step);

ターン数をインクリメントし、ステータス（ターン数、モード番号、ステップ番号）を表示させます（画面 21）。print メソッドや println メソッドを使って様々なステータス（状態）を表示することでプログラムの動きを把握することができます。また、プログラムが正常に動かないときその原因を知ることもできます。

- 25 -CHaser2009step4【画面 21】ステータス表示⑤mode=10 の処理
787980818283
8485
86878889
9091
9293

case 10: /* スタート直後、４方向をサーチして移動する方向を決める */switch (step){case 1:value = target.searchUp();/* 上をサーチする */System.out.print("：上サーチ");
for(i=1; i<10; i++){if(value[i] == 3){ /* 上方向にアイテムがあったら */System.out.print("：上方向にアイテムあり。");
mode = 1;/* 上に行くモードにして */break;/* ループを抜ける */}}if(i==10){
step = 2;/* アイテムがなかったら、ステップ 2 へ */}break;

モード 10 は、上下左右をサーチして移動する方向を決めるので、表 5 のように 4 つの手順（step）に分かれます。
まず上をサーチします。次に for 文で周囲情報 value[1]から value[9]にアイテム（3）があるか探索します。もし、アイテムが見つかったら「上方向にアイテムあり」とメッセージを出力した後、mode に上に移動する番号 1 をセットし、break 文で for 文を終了します。このとき、i の値はアイテムが見つかった番号になっています。
もし、アイテムが見つからなかった場合は、for 文が最後まで進んでいるので i は 10になっています。これを使い if 文で i=10 ならばアイテムがないと判断し次のステップ（step=2）に進みます。
step2 から step4 も同様に行います。

- 26 -

CHaser2009step4【表 5】モードとステップの種類と動作
mode動作

1

ブロックにぶつかるまで上に移動する

2

ブロックにぶつかるまで右に移動する

3

ブロックにぶつかるまで下に移動する

4

ブロックにぶつかるまで左に移動する
上下左右をサーチしアイテムのある方向を探索する

10（新規）

step=1

上をサーチし、アイテムがあれば mode=1 にする

step=2

右をサーチし、アイテムがあれば mode=2 にする

step=3下をサーチし、アイテムがあれば mode=3 にする

step=4

左をサーチし、アイテムがあれば mode=4 にする

20

周囲（上下左右）のアイテムを回収する

90

周囲（上下左右）の相手に put する【ブロックの外側について】
画面 22 は上にサーチしたときの画面です。serchUp メソッド実行後、サーバからは9 マス分の周囲情報が送信されますが、ブロックの外側は全てブロック（2）となります。従って、サーバからの戻り値は、「030022222」となります。
2：ブロック
2：ブロック
2：ブロック
2：ブロック
2：ブロック
0：なし
0：なし
3：アイテム0：なし【画面 22】サーチがブロックを突き抜けた場合【発展】
現在のプログラムは、上→右→下→左の順にサーチして 1 つでもアイテムがあったらその方向に進みますが、4 方向をサーチして 1 番アイテムが多い方向に進むなど変更してみましょう。
- 27 -