全国高校生プログラミングコンテスト
CHaserOnline
ステップアップヒント３
13 クライアント起動用シェルスクリプトの作成□
クライアントを起動するには大変多くの引数やオプションが必要です。これらを毎回入力するのは大変なことですし、また間違いのもとにもなります。
それらを解消するシェルスクリプトを作成することで簡単にクライアントを起動できるようになります。テキストエディタを利用し次のように入力してください。
なお、ユーザ名・パスワード・プロキシサーバアドレスおよびプロキシサーバのポート番号は各自のものに差し替えて記入してください。
例１）毎回ルーム番号を入力する例(Client01.sh)#!/bin/sh#./CHaserOnlineClient009-2Proxy.o http://localhost:8080/CHaserOnline003/user/-u cool -p cool#./CHaserOnlineClient009-2Proxy.o http:// www7019ug.sakura.ne.jp:80/
CHaserOnline003/user/ -u cool -p cool./CHaserOnlineClient009-2Proxy.o http:// www7019ug.sakura.ne.jp:80/
CHaserOnline003/user/ -u cool -p cool –x 192.168. ○○○.○○○:8080
１行ずつ説明します。

#!/bin/sh

１行目はこれからシェルスクリプトが始まることを示します。
#./CHaserOnlineClient009-2Proxy.o http://localhost:8080/CHaserOnline003/user/-u cool -p cool
次の行は左はじに「＃」がついています。
「＃」をつけるとコメント行にすることができます。
コメントを外した場合は、サーバを起動しているのと同じパソコンでクライアントを動かす場合のコマンドになっています。
なお、紙面の都合上改行していますが、実際には改行せずに１行で記入してください。

#./CHaserOnlineClient009-2Proxy.o http:// www7019ug.sakura.ne.jp:80/
CHaserOnline003/user/ -u cool -p cool
次の行もコメントになっていますが、自宅などプロキシサーバを経由せずに接続するコマンドです。

./CHaserOnlineClient009-2Proxy.o http:// www7019ug.sakura.ne.jp:80/
CHaserOnline003/user/ -u cool -p cool –x 192.168. ○○○.○○○:8080
次の行は「＃」がついていません。実際に動作させるのはこの行だけとなります。学校などプロキシサー
バ経由でインターネットへ接続している場合のコマンドです。
クライアントを実行する環境に合わせて「＃」を付け替えることで、簡単に接続先を変更することができるようになります。

1

例２）ルーム番号を順番に接続する例(Client02.sh)※ルームがあいているかどうかの確認が別途必要です。
#!/bin/sh
for room in 1 2 4 5 6 7 8 9 10 11 13 14 15 16 17 19 20 21
do#./CHaserOnlineClient009-2Proxy.o http://localhost:8080/CHaserOnline003/user/-u cool -p cool –r $room#./CHaserOnlineClient009-2Proxy.o http:// www7019ug.sakura.ne.jp:80/
CHaserOnline003/user/ -u cool -p cool –r $room./CHaserOnlineClient009-2Proxy.o http:// www7019ug.sakura.ne.jp:80/
CHaserOnline003/user/ -u cool -p cool –x 192.168.30.○○○:8080 –r $room
sleep 3done

このシェルスクリプトは「接続がうまくいく」ことを前提に書かれています。
それでは１行ずつ説明します。
#!/bin/sh
１行目はこれからシェルスクリプトが始まることを示します。
for room in 1 2 4 5 6 7 8 9 10 11 13 14 15 16 17 19 20 21
do．
．
．
done
２行目、３行目および１１行目はセットで使用します。
２行目の「for」コマンドで変数「room」の中に「in」以降に列記した文字を順に代入します。変数「room」への代入をするたびに、３行目から１１行目の「do～done」を繰り返します。
#./CHaserOnlineClient009-2Proxy.o http://localhost:8080/CHaserOnline003/user/-u cool -p cool –r $room
４行目はローカル接続用に準備されたものになります。
「-r $room」とすることで「for コ
マンド」で順次変化する変数「room」をオプションに指定しています。
#./CHaserOnlineClient009-2Proxy.o http:// www7019ug.sakura.ne.jp:80/
CHaserOnline003/user/ -u cool -p cool –r $room./CHaserOnlineClient009-2Proxy.o http:// www7019ug.sakura.ne.jp:80/
CHaserOnline003/user/ -u cool -p cool –x 192.168. ○○○.○○○:8080–r $room
この行はルーム番号を指定している部分以外は例１と同様になります。

2sleep 3
この行は次のコマンドまでの待ち時間を設定します。数字は秒数を表すので３秒待ってループに戻ります。
Client02.sh はクライアントがある程度出来上がったときに、複数のルームで動作検証をするときになどに実行すると良いでしょう。
次にシェルスクリプトを実行可能な属性に変更します。
端末のコマンドラインにて次のコマンドを実行します。
chmod 700
および
chmod 700

Client01.sh
Client02.sh

シェルスクリプトを実行するには端末のコマンドラインで以下のように実行します。
./Client01.sh
または./Client02.sh
Client01.sh や Client02.sh などファイル名の前に「./」を入れるのを忘れないようにしてください。
なお、作品を第二次予戦に提出するときには、シェルスクリプトからの実行は必須になります。
（Windows 環境ではバッチファイルで代用してください）3

14 サンプルプログラム３（アイテム回収と相手への処理を行うプログラム）□① プログラム動作のモードについてフィールド例
0

1

23

C

5

678

※「C」の位置が現在位置です。
mode1357313335
37

動作
上に移動する
左に移動する
右に移動する
下に移動する上にプットする
左にプットする
右にプットする
下にプットする② サンプルプログラム３抜粋(CHaserOnlineClient009-4Item_Put_Release.c)/*----------------------Action を発行する-------------------------*/do{for(i=0; i<4; i++){if(returnNumber[way[i]]==3){mode = way[i];break;}}
for(i=0; i<4; i++){if(returnNumber[way[i]]>=1000){mode = 30+way[i];break;}}4

③ プログラム説明
for(i=0; i<4; i++){if(returnNumber[way[i]]==3){mode = way[i];break;}}
周囲にアイテムがあるがどうかを検査しています。検査方法は事前に準備しておいた way配列を使い上、左、右、下と順番に調べていきます。アイテム(3)を発見するとその時点でmode を設定しループから抜けます。
for(i=0; i<4; i++){if(returnNumber[way[i]]>=1000){mode = 30+way[i];break;}}
こちらも上記と同じ方法で周囲の敵を検査しています。敵 (1000 以上)を発見するとその時点で mode を設定しループから抜けます。
クライアントキャラクタは C から順に 1000、2000、3000～となります。自分が必ずしも Cool になるとは限りませんので 1000 からチェックします。

15 発展□
今回追加したプログラムは上下左右のみの対応です。斜め方向にも対応させなければなりません。斜め方向は Put＆Walk を使うと良いので、新にモードを追加すると良いでしょう。ただし Put&Walk はかならずプットした方向とは逆に Walk する点に注意しなくてはなりません。しかも、このままのプログラムではフィールド端まで行くと自分自身を敵と勘違いし Put し続けてしまいます。サンプルプログラム２を参考にフィールド端の処理を考えてみてください。
ステップアップヒントでは「look」や「serch」については扱いません。うまく使うことでクライアントをさらに強くすることが可能になります。ぜひ取り組んでみてください。

5

16 対戦案内□
第一次予戦が次の要領で行われます。
日 時：２０１４年８月１８日（月） １０：００ごろ から８月２９日（金） ２３：５９：５９まで
ルーム：一人用ルームと二人用のルームが準備されます。
使用するルーム番号が決定しましたら、全情研ホームページで公開させていただ
きます。
二人用ルームでは必ず自動巡回ユーザを先攻として対戦してください。
自動巡回ユーザがどのルームにいるかは、トップページの「待ち合わせ」「ログイン中のユーザ」で確認してください。
集 計：各クライアントが指定のルームで初めて取り組んだときの得点を集計します。
ユーザ ID：予戦期間中は練習用ＩＤはすべて利用できなくなります。
予戦では選手用ＩＤを使って接続してください。
※事前に選手用 ID にて動作確認をしておいてください。
注 意：ゲーム途中でクライアントが停止するなどのトラブルがあった場合は残りターン数に応じて減点されます。
CHaserOnline のステップアップヒントは以上で終了となります。皆さんの参加をお待ちしています。

6