5

プログラムの流れ
競技参加者の皆さんがつくるクライアントプログラムと競技サーバのやりとりは、getReady メソッドを送信して周囲情報を取得した後、動作メソッド（walk 系、look 系、search系）を選んで送信するという動きを繰り返します。
ほとんどの場合、クライアントプログラムは下のフローチャートのようになります。
競技参加者の皆さんは、サーバから得た周囲情報をもとにメソッドを選んで送信する部分を考えてください。
開始

競技サーバに接続

getReady( )でサーバからの戻り値を取得

制御情報は 0 か？

YESNO
周囲情報をもとにメソッドを決定
メソッドを送信しサーバからの戻り値を取得

制御情報は 0 か？

YES

NO

競技サーバから切断

終了

PreCHaser2008 は対戦型ではないので、フィールドに置かれたアイテムを制限ターン内で取ることを目標に考えます。

6

サンプルプログラム（Sample2008_02.java）
・まず、壁にぶつかるまで上に移動します
・次に右に移動し、壁の内側を時計回りに移動します・ターン制限（81 ターン）まで移動し、ゲームオーバーになります・mode という変数を作り、動作の種類を記憶させます・プログラム名は”Sample2008_02.java”とします
12345678910111213141516171819202122232425262728293031323334353637383940414243

public class Sample2008_02{
public static void main(String[ ] args){
int[ ] value;
value = new int[10];int mode = 1;/********** 競技サーバに接続する **********/
edu.procon.PreConnect2008 target;
target = new edu.procon.PreConnect2008( );while(true){/********** まず、getReady でサーバから戻り値を得る **********/
value = target.getReady( );if(value[0] == 0) break;/********** 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{

744454647
4849505152535455
5657
58
5960
61626364
65
66

value = target.walkDown( );}break;
case 4: /* 壁にぶつかるまで左に移動する */if(value[4] == 2){
value = target.walkUp( );mode = 1;}
else{
value = target.walkLeft( );}break;}/********** 制御情報が 0 だったら終了する **********/
if(value[0] == 0) break;}/********** 競技サーバから切断する **********/
target.exit( );}}プログラム説明①変数の宣言45
67

int[ ] value;
value = new int[10];int mode = 1;

value は、サーバからの戻り値（制御情報 1＋周囲情報 9）を格納する配列です。
mode は、動作の種類を記憶させる変数です。mode を使うことで、どの動作をしているのかを管理することができます。サンプルプログラムは下表のように４つのモードを用意しています。この方式ならば、今後プログラムを発展させるときモードを追加するだけで様々な動作ができるようになります。
・モードの種類と動作
mode

動作

1

壁にぶつかるまで上に移動する

2

壁にぶつかるまで右に移動する

3

壁にぶつかるまで下に移動する

4

壁にぶつかるまで左に移動する

8②競技サーバに接続する
9
10
11/********** 競技サーバに接続する **********/
edu.procon.PreConnect2008 target;
target = new edu.procon.PreConnect2008( );edu.procon.PreConnect2008 クラスを使って競技サーバに接続します。
③getReady でサーバからの戻り値を得る
141516/********** まず、getReady でサーバから戻り値を得る **********/
value = target.getReady( );if(value[0] == 0) break;getReady メソッドを送信するとサーバから戻り値が返ってくるので、配列 value で受け取ります。value[0]に制御情報が格納されているので、0 だったら終了します。
・配列 value の内容（サーバからの戻り値）

制御情報

サーバからの戻り値＝value[0]＋周囲情報 1

周囲情報 2

周囲情報 3value[1]value[2]value[3]周囲情報 4

周囲情報 5

周囲情報 6value[4]value[5]value[6]周囲情報 7

周囲情報 8周囲情報 9value[7]value[8]value[9]④mode で分岐する
18
1920
21
2223
2425
26
27
28
29

/********** mode で分岐する **********/
switch (mode){case 1: /* 壁にぶつかるまで上に移動する */if(value[2] == 2){/* 上に壁があったら */value = target.walkRight( ); /* 右に移動し */mode = 2;/* mode を 2 に変更する */}else{value = target.walkUp( );/* そうでなければ、上に移動する */}break;
case 2: /* 壁にぶつかるまで右に移動する */・・・

switch 文を使って mode の値で分岐処理を行います。mode = 1 の場合、壁にぶつかるまで上に移動するので、自分のすぐ上が壁かどうかを if(value[2] == 2)で判断します。
もし、上が壁だった場合は次に右に移動するので walkRight メソッドを送信し、modeを 2 にします。壁でなければ、walkUp メソッドを送信し上に移動します。
同様に mode2 から 4 を作ります。

9⑤制御情報が 0 だったら終了する
58
59/********** 制御情報が 0 だったら終了する **********/
if(value[0] == 0) break;

メソッドを送信するとサーバから戻り値が返ってくるので、終了の判定をします。
⑥競技サーバから切断する6263/********** 競技サーバから切断する **********/
target.exit( );exit でメソッドで競技サーバから切断します。

注意
このプログラムは、スタート位置が右の壁際の場合、上の壁まで移動したあと壁にぶつかってしまいます。
これを回避するにはプログラム中で判断を追加しなければなりません。どこにどのような判断を追加したらよいか考えてみてください。