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

Pre
練習競技

CHaser2008 にチャレンジする準備として、練習競技 PreCHaser2008 に取り組みます。
• 対戦型ではありません• ターゲットをプログラミングでコントロールします• フィールドは横 9 マス × 縦 9 マス =81 マス• ターン制限：81 ターン · · · 動作 1 回分が 1 ターン• アイテムは 9 個（重ならずにランダムな位置）• ターゲットのスタート位置はランダム（0∼8 , 0∼8）のどこか

getReady ( ) メソッドで、自分の周囲 9 コマの情報を得た後、競技サーバに次の 3 種類のうちから 1 つのメソッドを選んで送信します（PreCHaser には、ブロックを置く put メソッドはありません）。
それぞれのメソッドは、{Right, Left, Up, Down} の 4 つの方向を指定します。

walkRight ( )1 マス移動した後、周囲 9 マスの情報を得る

lookRight ( )指定した方向の周囲 9 マスの情報を得る

searchRight ( )指定した方向に真っすぐ 9 マスの情報を得る• フィールド上に置かれたアイテムをすべて（9 個）獲得します。
• ブロック（フィールドの周囲）に当たると負けになります。
• 81 ターン目が終ると負けになります。

2準備• Java （バージョン 1.4 以降） の動作するコンピュータ• プロコンのサイトよりダウンロードした edu.jar を ${JAVA HOME}Y
=jreY
=libY
=extY
= に置く
−→ ${JAVA HOME} とは Java をインストールしてあるディレクトリ
例えば "C:Y=j2sdk1.4.2 17Y
=jreY
=libY
=extY=" など• コマンドプロンプトなどの端末を 2 つ起動する· ${JAVA HOME}Y=bin に PATH を通す· 1 つ目の端末で "java edu.procon.PreServer2008" としてサーバを実行· 2 つ目の端末で "java edu.procon.Sample2008 01" としてサンプルクライアントを実行• Java ソフトウェア部品を利用すると簡単です

edu.procon.PreConnect2008（edu.procon.PreConnect2008 クラス）

• 右のクラス図にある機能が利用できます+ getReady ( ) ： void

• 下記のようにして利用できます+ walkRight ( ) ： int[10]+ walkLeft ( ) ： int[10]+ walkUp ( ) ： int[10]+ walkDown ( ) ： int[10]edu.procon.PreConnect2008 target;
int[ ] value;
target = new edu.procon.PreConnect2008 ( );value = new int[10];value = target.getReady ( );value = target.walkRight ( );target.exit ( );+ lookRight ( ) ： int[10]+ lookLeft ( ) ： int[10]+ lookUp ( ) ： int[10]+ lookDown ( ) ： int[10]• "：int[10]" は 戻り値が要素数 10 の int 型の配列

+ searchRight ( ) ： int[10]+ searchLeft ( ) ： int[10]+ searchUp ( ) ： int[10]+ searchDown ( ) ： int[10]• "：void" は 戻り値がありません+ exit ( ) ： void3
サンプルプログラム（Sample2008 01.java）• 次の 4 つの動作を繰返すプログラムです• walkRight ( ) → searchLeft ( ) → walkDown ( ) → lookUp ( ) → · · ·• 動作を行う前に getReady ( ) を行って、周囲の情報を得てください• サーバからの情報は int 型で value[0] ∼ [9] に戻ります• value[0] が「0」のとき、サーバとの接続を exit ( ) で閉じて、プログラム終了してください
1234567891011121314151617181920212223242526272829303132333435

public class Sample2008_01 {public static void main (String args[ ]) {edu.procon.PreConnect2008 target;
int[ ] value;
target = new edu.procon.PreConnect2008 ( );value = new int[10];while (true) {/* STEP 1 */value = target.getReady ( );if (value[0] == 0) break;value = target.walkRight ( );if (value[0] == 0) break;/* STEP 2 */value = target.getReady ( );if (value[0] == 0) break;value = target.searchLeft ( );if (value[0] == 0) break;/* STEP 3 */value = target.getReady ( );if (value[0] == 0) break;value = target.walkDown ( );if (value[0] == 0) break;/* STEP 4 */value = target.getReady ( );if (value[0] == 0) break;value = target.lookUp ( );if (value[0] == 0) break;}target.exit ( );}}• プログラム名は "Sample2008 01.java" とします• コンパイルは "javac Sample2008 01.java" のようにします（エラーのある場合、修正します）• 別の端末で "java edu.procon.PreServer2008" としてサーバを先に実行します• "java Sample2008 01" として、クライアントを実行します4
サーバからの戻り値• 制御情報 1 + 周囲情報 9 = 10 個の整数データが戻ります
制 御周囲 1

周囲 2

周囲 3

周囲 4

周囲 5

周囲 6

周囲 7

周囲 8

周囲 9

• 制御情報0 通信終了
1

通信続行

• 周囲情報0 なし
2

ブロック3

アイテム

• getReady、walk、look については、左下図のように、左上から右下へ向かって、1 → 2 → · · · → 9 の順で得られます• search については、右下図のように、ターゲットの近くから遠くへ向かって、1 → 2 → · · · → 9 の順で得られます

通信の仕様 （上級者向け）• Java 以外のプログラム言語や edu.procon.PreConnect2008 クラスを使わずに取り組む場合• サーバソケットの番号は "2008"• サーバとの接続完了後、サーバより "@" が送信されてくるので、これを受信する• サーバに文字列 "gr" を送信する（getReady）、文字列の末尾は改行文字 "Y=rY=n"• サーバより 情報 10 文字分（例："1000000000"）が送信されてくるので、これを受信する• サーバに文字列 2 文字分、下記より 1 つ選び、送信する
wr、wl、wu、wd、（それぞれ、walkRight、walkLeft、walkUp、walkDown）
lr、ll、lu、ld、（それぞれ、lookRight、lookLeft、lookUp、lookDown）
sr、sl、su、sd、（それぞれ、searchRight、searchLeft、searchUp、searchDown）• サーバより 情報 10 文字分（例："1000000000"）が送信されてくるので、これを受信する• サーバに文字列 "#" を送信する、以降、"@" の受信 ∼ 繰返し