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

CHaserOnline

ステップアップヒント①

1 はじめに□HP に掲載していくステップアップヒントや参考動画は、プログラムの作り方やサンプルをわかりやすく紹介していきます。ぜひ参考にしてください。
今回は、「初めてプログラムを動かすまで」の一連の流れを解説していきます。
サンプルとして HP に掲載しているプログラムはほとんど C 言語で書かれています。よくわからない状態でも、まずは何も変更せずに動かすことができます。また、学校等で培った知識を元にサンプルを改造して参加することもできます。
ステップアップヒントは、①②③の３つを予定しています。

★ヒント動画や解説動画を youtube にて配信中です！
全プロちゃんねる：https://www.youtube.com/channel/UCk2sH6eYa-iPSlgKv22hX5Q

1

2 CHaserOnline とは□CHaserOnline はクライアントプログラムで競技サーバへ接続することから始まります。
１〜８つのクライアントがネットを経由して接続し、クライアントとサーバの間で通信を行い、クライアント同士が対戦するという競技です。

端末サー対バ戦

端末

つまり、CHaserOnline に参加するには、クライアントプログラムを用意する必要があります。プログラムの中でもサーバとのやりとりを行う部分はサンプル等から代用できます。この競技の重要な部分は、「行動アルゴリズムをどう作るか。
」です。C 言語の if 文やwhile 文を組み合わせ、プログラムが自分でマップを解析し、高得点を取るにはどうすればよいかを考え、探索していく。というアルゴリズムを製作していきます。
対戦相手よりも多くの得点を得たプログラムが勝者となります。高得点を取るには、「周囲の分析」、「移動する方向」、「アイテムを拾う」、「他クライアントからアイテムを奪う」などの行動をどう組み合わせるかが大事になります。
★ 参考動画 ★
ルールや行動コマンドについて：https://youtu.be/6CGbNTj8hkc

複数人で対戦を行うこともできます。その場合は、プログラムがルームに入った順に C、H、a、s、e、r、O、ｎというキャラクタ名が割振られます。
最初は、１人だけのルームや、巡回ユーザ（NPC）がいるルームでプログラムの制作・調整をしていくことになると思います。
23 C 言語開発環境の準備 （導入例として Live 起動の Linux を紹介します）□

C 言語の実行環境があれば、省略可能です。 →４へ
簡単に C 言語の実行環境を整える方法として、LiveCD Linux を紹介します。
Linux という無料公開されている OS を DVD 等に書き込み、それを起動する方法です。
※VirtualBox を利用しても OK です。
（https://youtu.be/YssbZyBbS08）① Linux のイメージファイルのダウンロードリンクは全情研 HP に掲載してあります。
http://www.zenjouken.com/?page_id=588

バージョンが更新されることがあります。
現在：PuppLinux800② Linux の iso イメージファイルのダウンロード
Linux の種類の中でも、PuppyLinux での実行を説明します。
クリックするとファイルのダウンロードをすることができます。
デスクトップなどの任意の場所に保存をしてください。
※保存場所は自由ですが、容量が 730MB 程度あるので十分な空き容量がある場所に保存してください。
③イメージファイルの書き込みライティングソフト等でＤＶＤ－Ｒに書き込みをしてください。その時、イメージファイルの書き込みを行うように設定してください。普通のファイルとして書き込んでしまうと起動することができませんのでご注意ください。

3

④作成した DVD から Linux を起動作成した DVD を PC に予め入れた状態で PC を起動し、「F12」を押す等でブートメディアを選択して、起動する。
※UEFI や BIOS の設定で DVD からブートできるようにする必要があるかもしれません。
⑤ ネットワークの設定

右クリックし Setup networking を選ぶ「Puppy Network Wizard」が起動する。
「eth」から始まるのが有線ＬＡＮの設定なので、「eth」から始まるボタンをクリックする。

★参考動画
https://www.youtube.com/watch?v=f4oIGemdvIE

4

「ネットワークを設定」が開く。
ネットワーク内に DHCP サーバが稼動している場合は「自動 DHCP」をクリックします。

※DHCP サーバが起動していない場合の説明を以下にまとめます。
（学校内の PC は、ほとんど固定 IP を利用しています。設定が必要です。
）「固定 IP」をクリックすると、設定画面が表示されます。
「IP アドレス」「ネットマスク」「ゲートウェイ」「DNS パラメータ(プライマリ)」「DNS パラメータ(セカンダリ)」を入力します。詳細な数値が不明な場合は適当な値を入れずに、まずはネットワーク管理者に確認をしてください。
IP 等は元々の OS の設定を参考にしてください。
また、プロキシサーバを利用している場合（学校内の場合）は、「ツール→インターネットオプション→接続→LAN の設定→プロキシサーバー」のアドレスとポート番号も記録しておいてください。

設定が正しければ「～を通してセットしました。
」とメッセージが表示されます。

「eth○ネットワークの設定に成功!」と出ればネットワークの設定は成功です。
「Yes」を押します。

5

⑥ブラウザを起動する。
⑦プロキシの設定。
（学内 PC など、プロキシが必要な場合のみ設定してください）
編集→設定→ネットワーク→接続設定→詳細→手動でプロキシを設定する、と進み、予め記録しておいたプロキシのアドレスとポートを設定します。
※「すべてのプロトコルでこのプロキシを使用する」にチェックを入れてください。
⑧ブラウザで WEB ページを表示できたら、無事インターネット接続は完了です。

6

4 サンプルプログラムのダウンロード□★参考動画：https://youtu.be/bvzfpJNu3fg?t=11① 全情研のページを開く。
http://www.zenjouken.com/② プログラミングコンテスト→CHaserOnline202X とアクセスする。
③ ページ左にある「サンプルプログラム」をクリックし、ダウンロードする。

④ 「sample01.zip を開く」がウィンドウで「ファイルを保存」を選び OK をクリックする。
「保存ファイル名を入力してください」と表示されたら、そのまま保存をクリックします。
⑤ 画面左上の「ファイル」から my-documents とたどります。

⑥ 圧縮ファイルの解凍「sample01.zip」をクリックすると解凍ソフトが起動します。
解凍したいファイルをクリックし、「E 解凍」
をクリックする。
「展開先ディレクトリ名」が開きます。
ディレクトリはそのままで良いので「OK(O)」をクリックする。

「my-documents」にプログラムファイルが解凍されます。

7

5 サンプルプログラムの確認・編集・実行□
サンプルプログラムやサンプル対戦動画が多く提供されていますので色々試してみましょう。今回は、とあるサンプル①について説明します。
★参考動画「zenprocon サンプル」で検索するといっぱい出てきます
https://www.youtube.com/results?search_query=%E3%82%B5%E3%83%B3%E3%83%9
7%E3%83%AB%E3%80%80zenprocon⓪ターミナル（端末）の起動
ここからの Linux はコマンドを実行して指示を出していくことになります。
まずは、ターミナル（端末）を起動します。

表示されたウィンドウにコマンドを入力し、Enter キーで実行していくことになります。

①サンプルプログラムがどこにあるかの確認「pwd」コマンドで保存先を確認します。ここでは/root となっていることを確認します。
「cd my-documents」で、今いるディレクトリを my-documents に変更します。
②ファイルの確認「ls *.c」とすることでソースファイルを確認します。

8

③プログラムのコンパイル「cc」コマンドでプログラムのコンパイルができます。
「-o」オプションを追加で指定することで出力される実行ファイルの名前を指定できます。
「cc CHaserOnlineClient○○○○public001.c -o CHaserOnlineClient○○○○public001.o」

出力する実行ファイルの拡張子は、「.o」としてください。.exe は windows のみです。
★参考動画
サンプルプログラムのコンパイル： https://youtu.be/sfG6iU5ZBf09

④エディタの設定※PuppyLinux 標準エディタを使う初回は設定が必要です。
★参考動画
PuppyLinux_Geeny エディタの調整、ファイルの開き方：
https://youtu.be/eZNcga62Ous⑤プログラムファイルの編集プログラムファイルを右クリックし、「テキストの編集」を選択する。
「Action を発行する」部分をどのように編集するかが勝負の分かれ目です。
それ以外の部分は特に編集しなくて大丈夫です。

10

⑥「Action を発行する」部分の説明
次の文によって、設定されたコマンドが正常に実行されるまで繰り返すことになっている。
（通信待ち時間などの調整も兼ねている）
do{ ～}while(○○○!=0);

次の文によって、サーバに送るデータを生成している。
strcpy(param, "command2=");
CHaserOnline サーバに送るパラメータを作成しています。
★メインディッシュ
「//Action の作戦を記入する」の部分に、どのように行動をさせたいかを記述する。
この例だと、mode = 5 のみを繰り返すようになっている。（右に動き続けるだけ）

if 文や switch 文などを活用すると、より効率的に動けるようになるぞ！
例）
if( returnNumber[5] == 2){ mode = 5; }else{ mode = 7; }036147258

サーバからの戻り値の６番目(returnNumber[5](自機の右側))が２（土）だったら右（mode = 5）に進むようにし、そうでなければ下（mode = 7）へ進む
プログラム。
この例だと、自機の下の状況を判断することなく動いてしまう。どうすればよいか？

11

★参考動画
サンプルプログラム 1 の動作例： https://youtu.be/UarWs1cFcrg★参考動画
サンプルプログラム 1 の編集方法： https://youtu.be/_VY2jKdVDSI

12

※プログラムの詳細について
switch(mode){ case 1:
case 3:case 5:case 7:

strcat(param, "wu");
strcat(param, "wl");
strcat(param, "wr");
strcat(param, "wd");
・・・

break;
break;break;break;

設定されている mode を実際に発行されるコマンドに変換しています。ここでは walk 系、Put2 系、Put0 系のコマンドが指定されています。
他のコマンドも登録したい場合はここに記述してください。
send_cmd("CommandCheck", param, ReturnCode);
コマンドを CHaserOnline サーバへ送信しています。
/*----------------------Action を発行する-------------------------*/
do{strcpy(param, "command2=");//Action の作戦を記入する
mode = 5;
switch(mode){case 1:strcat(param, "wu");break;
case 3:strcat(param, "wl");
break;
case 5:strcat(param, "wr");
break;
case 7:
strcat(param, "wd");
break;
・・}
send_cmd("CommandCheck", param, ReturnCode);}while(strchr(ReturnCode, ',')==NULL&&strcmp(ReturnCode, "user=")!=0);//Action が受け付けられるまでループ

13

⑤マップ上のキャラクタ（アイテム）について
番号

キャラクタ名

アイコン

得点

備考

場外

－５００

場外にいる間は減点となります

０

穴

－２０

１

ターゲット

５０

２

土－５

３

アイテム

３０

５

化石１

１２５

６

化石２

１５０

７

化石３

１７５

８

化石４

２００

２０～２３

ワープ

５９

三葉虫

１００

6 マス
４０〜４３
15 マス
５０〜５３

岩盤

－１０

１２

ホワイト

－３００

６０～６３

ブラックスター１０

ブラックスター間でワープします

１０００~
８０００

クライアント０

ルームの接続順で指定される
1000,2000 のように順番です

右・左・上・下へ
１０マスワープします

初心者用マス目
通れないので場外に出づらくなります※5 マスのワープ（３０～３３）については１０マスワープと同様です。
14

6 サーバに接続してプログラムを動かす□⓪ リンク集を入手する
全プロ公式ページからリンク集を入手するとページ移動がとてもわかりやすくなる。
http://www.zenjouken.com/?action=cabinet_action_main_download&block_id=1109&roo
m_id=1&cabinet_id=26&file_id=426&upload_id=1790

リンク集（html ファイル）15

① 公開ルームを調べる
CHaserOnline の待ち合わせページに入る。（リンク集を使うのが便利）
すると、ルーム番号・最大接続人数、マップ表示の可否、公開日、巡回ユーザ、備考の確認ができる。最大接続人数は、そのルームで対戦できるユーザの人数を表します。４と書いてあるのは４人用ルームということです。
★参考動画
待ち合わせ確認： https://youtu.be/525diL4GfYY?t=29※動画を最初から再生すると、プロキシ設定もやっています（学校内向け）② ログインする
上の画像のような認証画面が出るので、ユーザ名とパスワードを入力して Go ボタン。
認証が完了すると、今現在 CHaserOnline に接続中のユーザ名と利用ルーム番号が分かります。自分が参加予定のルームが既に満員になっていないかどうかを確認してください。
★ゾンビ状態
まだクライアントプログラムを動作させていないのに、自分のユーザ名が表示されている
場合、ユーザが正しく通信できていない「ゾンビ状態」です。クライアントプログラムが処理を何かしら失敗してしまい、通常の処理完了していない時にゾンビ状態となってしまいます。３分程度経ったら自動で「ゾンビ状態」が解消されるはずなので、それ以降に再度「クライアントプログラムを実行」をしてください。
サーバでの「ゾンビ状態」の解除作業はクライアントのユーザ認証処理をきっかけに動作します。３分以上経っても「ゾンビ状態」が続いている場合は、クライアントプログラムを実行してみてください。
※サーバへ同時接続できる人数に制限をもうけています。サーバの負荷により人数制限をしますので、接続できなかった場合はしばらく待ってから試してみてください。

16

③ クライアントプログラムの実行
ターミナル（端末）を起動し、クライアントプログラムを起動するコマンドを実行する。
./CHaserOnlineClient○○○○public001.o ⊔http://www7019ug.sakura.ne.jp:80/
CHaserOnline003/user/⊔-u⊔ユーザ名⊔–p⊔パスワード⊔-r⊔ルーム番号※改行せずに１行で入力する。※「⊔」は半角の空白（スペース）を表している。
-u はユーザ名の指定、-p はパスワードの指定、-r はルーム番号の指定をしている。
シェルスクリプトに登録しておけば、簡単なコマンドで実行することもできます。

★参考動画
シェルの調整（プロキシなし）：https://www.youtube.com/watch?v=aRDCYW5iFCE

サンプルユーザ「hot」でルーム 999 にプロキシサーバ経由で接続する場合のコマンド例./CHaserOnlineClient○○○○public001.o ⊔http://www7019ug.sakura.ne.jp:80/
CHaserOnline003/user/⊔-u⊔hot⊔–p⊔hot⊔-r⊔999⊔-x⊔192.168.30.251:8080※プロキシ指定は-x オプションを使います。アドレスとポートは「：」でつないで記入します。
※プロキシサーバのアドレスとポート番号は利用環境によって違いますので、PC のブラウザ設定を参考にすると良いでしょう。
★参考動画
シェルの調整（プロキシ有りの場合）： https://www.youtube.com/watch?v=oeieo6t3SP4

17

※確認事項クライアントプログラムが正常動作すると「端末」内に「param=command1=～」というメッセージが現れます。
ひとつのユーザ ID で複数のルームに同時にログインすることはできません。
ひとつのユーザ ID 同士で対戦させることはできません。
対戦ルームを利用して動作確認をしたい場合は手動クライアントと対戦しても良いでしょう。その場合は以下の公開（サンプル）ユーザを利用してください。

テストユーザ cool
テストユーザ hot
テストユーザ hand

ユーザＩＤ
cool01 ~ cool99
hot01 ~ hot99
hand01 ~ hand99★参考動画
オンラインクライアント実行_サーバ画面表示：
https://www.youtube.com/watch?v=ii7GOvnrnco

18

パスワードcoolhothand⑤巡回ユーザ（ＣＰＵ）との対戦
巡回ユーザは常にどこかのルームを巡回し、対戦相手を待っています。ユーザが接続すると、ユーザ先攻、巡回ユーザ後攻で対戦が始まります。ルームによってＭＡＰも異なるので、色々なルームで対戦してみましょう。
⑥対戦中のＭＡＰ確認
リンク集のマップ→ユーザ認証と進む。
対戦中だけ、サーバのＭＡＰ画面を見ることが出来ます。クライアントプログラムが動作していない場合はエラー表示になってしまいます。対戦画面は自動的に更新されます。

※自分が対戦中の画面のみ表示可能です。
※対戦中の動作ログ表示は自分のログだけが表示されます。対戦相手のログは表示されません。
※ルーム毎にサーバ画面表示の可否に違いがあります。表示されないルームは予戦の練習に利用してください。
※予戦や本戦になるとサーバ画面は表示されなくなります。

⑦競技が終了すると「GameSet」と表示されます。
また、場外に完全に出てしまうと「Outside」と表示され、クライアントは停止しゾンビ化します。
その他にもクライアントプログラムの誤動作などによって「GameSet」と表示されることがありますので、⑨の対戦結果表示で確認をしてください。
⑧再度、競技を始めるには②から⑥の操作を繰り返します。
MAP の例は公開されています。
19

ルーム情報の Excel ファイル使ってマップの様子を確認し、具体的な配置にどう対応していくか、考えながらプログラムを作っていくと良いでしょう。

「初心者、初級～上級対応ルーム情報.xlsx」
http://www.zenjouken.com/?page_id=583#_1083
参考動画
054_初心者、初級～上級対応ルーム情報 001

https://www.youtube.com/watch?v=xFFOt6TwhI8

20

⑨対戦結果の表示
リンク集から「結果」をクリックし、ログインします。
標準ではその日の対戦結果が表示されるようになっています。過去の対戦を見たい場合は、日付やルーム番号などを変更してください。
得点のマイナスが多い場合、表示されないことがありますが、得点の最小値をさらに小さくすることで表示できます。
★参考動画
結果の表示： https://www.youtube.com/watch?v=qQvrpMtUrzE⑩合計得点ランキング
リンク集から、「合計得点ランキング」をクリックし、ログインします。
最近の結果の中からルームに関係なく合計点でのランキングが表示されます。クライアン
ト作成の目標にすると良いでしょう。
★参考動画
合計得点ランキング： https://www.youtube.com/watch?v=jz68Rw3Eq_I21

⑪Puppy の終了（個人ファイル保存用の USB メモリを準備してください)・シャットダウンを選びます。

初回だけ「PupSaveConfig」が表示されます。一度設定すれば次回からは表示されなくなります。
個人ファイルを保存する USB メモ
リを接続し、「ＯＫ」を選びます。

「sd○○」のような USB メモリアイコンが画面左下に表示されます。この「sd○○」が USB メモリの名前になります。

・先ほどの USB メモリの名前を選び「OK」を押します。

22

保存ファイル
サイズやスワップファイルの設定をして、「ＯＫ」を押します。

・「SFS ファイルをコピーする」かどうかを尋ねられるので「OK」を選びます。

「OK」を押します。
しばらくしてファイルの保存が終わるとコンピュータがシャットダウンします。
これ以降、起動する場合は USB メモリをさしたまま DVD から起動してください。

23

7 対戦ボーナスについて（要確認）□
練習用ルームの結果によって以下のボーナス点を第一次予戦得点に加算します。
※全国プロコンのＩＤ毎に集計します。(該当年度の zenpro で始まるユーザ)
接続ボーナス
練習用ルームに最大ターン数まで取り組むことが出来た回数をカウントします。
接続回数×１０点を接続ボーナスとし、２００回（２０００点）を上限とします。
練習得点ボーナス
練習用ルーム毎の最大得点を合計します。５０００点を上限とします。
初参加ボーナス
CHaserOnline に初参加または、CHaserOnline の第一次予戦を突破したことがない高校には初参加ボーナス７０００点をＩＤごとに加算します。
接続ボーナス及び 練習得点ボーナスについては初参加ボーナスとは別に計算し最大１４０００点が加算されます。
集計期間ＨＰに公開される予定です。確認してください。
対象ルーム
３６５２～３９９５24

8 通信の仕様（上級者向け）□C 言語以外のプログラミング言語で取り組む場合、次の手順で通信します。すべてのクライ
アントのソケット番号は 80 番です。
① サーバの URL にユーザ名、パスワードを送信します。ユーザ名、パスワードは登録済みのものを送信してください。cool と hot については、練習用 ID として公開します。
パスワードはユーザ名と同じです。得点は登録されたユーザ名で集計されます。練習用
ID の得点は引き継がれませんのでできるだけ早くユーザ登録をしましょう。同じユー
ザ ID で複数のクライアントを認証させることはできません。
② ユーザ認証が成功すると、「roomNumber=」とメッセージが返ってくるので、ルーム番号を送信します。
③ ユーザ認証に失敗したらクライアントプログラムを停止させます。
④ ルーム指定が成功すると、「command1=」とメッセージが返ってくるので、サーバに文字列”gr”等を送信します（ゲットレディムーブ）。
⑤ ルーム指定に失敗したらクライアントプログラムを停止させます。
⑥ 各ルームで指定されているクライアント数が接続済みで、なおかつ自分のターンであれば、サーバからリターンコード（周囲９個のキャラクタ番号）が返ってきます。
そうではない場合は④に戻ります。
⑦ ゲットレディが成功すると、サーバからリターンコード（周囲９個のキャラクタ番号）が返ってきます。また「command2=」とメッセージが返ってくるので、サーバにコマンド文字列（コマンド表参照）を送信します。
⑧ コマンドが成功すると、サーバからリターンコード（周囲９個のキャラクタ番号）が返ってきます。また「command3=」とメッセージが返ってくるので、サーバにターン終了コマンド”#”を送信します。
⑨ ターン終了コマンドが成功すると次のクライアントの手番となります。
※クライアントが場外に近い場合は、返ってくるリターンコードの個数が減少します。
※ユーザ認証及びルーム番号送信に失敗した場合は、サーバ接続人数制限に達している可能性があります。クライアントを停止させてください。

25

２クライアントの場合
クライアント１

競技サーバ

クライアント２

競技サーバにユーザ認証

競技サーバにユーザ認証

ユーザ認証成功

ユーザ認証成功

ルーム番号送信
ルーム番号成功ｇｒコマンド等の送信
ルーム番号送信ｇｒコマンド等の送信
ルーム番号成功
周囲情報（９個）

ターン

ｇｒコマンド等の送信コマンドの送信
ｇｒコマンド等の送信周囲情報（９個）
ｇｒコマンド等の送信＃の送信
ｇｒコマンド等の送信
ｇｒコマンド等の送信
周囲情報（９個）
ｇｒコマンド等の送信コマンドの送信ｇｒコマンド等の送信
周囲情報（９個）
ｇｒコマンド等の送信＃の送信
ｇｒコマンド等の送信
周囲情報（９個）
ｇｒコマンド等の送信コマンドの送信ｇｒコマンド等の送信周囲情報（９個）
・・・

ステップアップヒント１は以上です。

26

ターン