全国高校生プログラミングコンテスト
CHaserOnline2019
ステップアップヒント１
1 はじめに□ステップアップヒントや紹介動画は CHaserOnline にチャレンジする人のためにプログラムの作り方やサンプルを掲載しています。ぜひ参考にしてください。
CHaserOnline のクライアントプログラムは C 言語で作られています。まずはこのファイルをダウンロードすれば簡単にプログラミングをはじめることができます。ステップア
ップヒントでは C 言語を使用してクライアントプログラムを作っていきます。また、サーバプログラムは Web 上で提供しますので、インターネットを閲覧可能であれば特別な準備は必要ありません。
ステップアップヒント

参考動画
Puppy750_044_全情研ホームペー
ジから Youtube を見る
https://www.youtube.com/watch?v=vU_TxnVCdiw

12 CHaserOnline の概要□
CHaserOnline は競技サーバへ１つから８つのクライアントプログラムがそれぞれネットワークで接続し、サーバプログラムとクライアントプログラムの間で通信を行い、クライアント同士が対戦する競技です。ルームに入った順に C、H、a、s、e、r、O、ｎのキャラクタが割振られます。勝敗は「移動する」、「アイテム類を拾う」、「他クライアントからアイテムを奪う」などの各行動によって得られる得点で決まります。
CHaserOnline にチャレンジするにはクライアントプログラムを作る必要があります。
クライアントプログラムはいくつかの関数と、C 言語の制御文である if 文や while 文を組み合わせて自律的に制御していくものです。関数はサンプルプログラムとして提供されていますので、開発する必要はありません。
また、クライアントプログラムはサーバプログラムと通信することにより、サーバから周囲情報を受信したりコマンドをサーバへ送ったりといった役割もあります。
大会ではそれぞれのクライアントプログラムを別々のコンピュータで動作させるため、図１のようにクライアント数分のコンピュータが必要になります。しかし、開発段階では複数のクライアントプログラムを１台のコンピュータで実行しても対戦を行うことは可能です。
サーバ

サーバ
サーバプログラムクライアントクライアントクライアントクライアントプログラム 2

クライアントプログラム 1

クライアントプログラム 1

クライアントプログラム 2

図 2 1 台のコンピュータで実行する場合

図 1 2 台のコンピュータで実行する場合

参考動画
Puppy750_053_全国審判長 ppt03-3
https://www.youtube.com/watch?v=6
CGbNTj8hkc

2

3 C 言語開発環境の準備(既にある場合には省略可です)□
C 言語でプログラミングを行うには LiveCD Linux を使うのが簡単です。以下の手順で準備をします。
①iso イメージのダウンロード先
全情研ホームページの下記 URL に掲載します。
http://www.zenjouken.com/?page_id=583#_1083※CHaserOnline2019 のページになります。
②iso イメージのダウンロード
キャビネットの CHaserOnline2019/イメージファイル内のdb_CHaserOnlineSystemDiskWithoutSource20190425_00.zip～
db_CHaserOnlineSystemDiskWithoutSource20190425_07.zip 及びCHaserOnlineSystemDiskWithoutSource20190425.zipと書いてあるリンクをクリックするとファイルのダウンロードダイアログボックスが開きます。
「保存」をクリックしファイルを保存してください。
参考動画
Puppy750_046_001 イメージダウ
ンロード 1
https://www.youtube.com/watch?v=pcuuw8bu29M

3

ダウンロードしたファイルをすべて解凍し一箇所にまとめ、CHaserOnlineSystemDiskWithoutSource20190425.bat をダブルクリックするとイメージファイルが作成されます。

参考動画
Puppy750_048_003 解凍と移動
https://www.youtube.com/watch?v=PnHJCtPDULM
Puppy750_049_004 ファイルの合成
https://www.youtube.com/watch?v=E5AQ2eGBS9s③ファイルの保存場所は特に限定されませんが容量は 730MB 程度ありますので十分な空き容量がある場所に保存してください。
④イメージファイルの書き込み
ライティングソフトやＯＳでＤＶＤ－Ｒに書き込みをしてください。その際にはイメージファイルの書き込みを行うように設定してください。普通のファイルとして書き込んでしまうと起動することができませんのでご注意ください。
⑤出来上がった DVD から起動させます。
UEFI や BIOS の設定で DVD からブートできるようにしてください。PC によっては起動時に「F12」等を押してブートメディアを選ぶ必要があります。
⑥ネットワークの設定

右クリックし Setup networking を選びます4

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

参考動画
002 ネットワーク設定エラーが出ても負けずに入力 1
https://www.youtube.com/watch?v=f4oIGemdvIE「ネットワークを設定」が開きます。ネットワーク内に DHCP サー
バが稼動している場合は「自動DHCP」をクリックします。今回は DHCP サーバが起動していなものとして説明をします。
「固定 IP」をクリックします。

「IP アドレス」「ネットマスク」「ゲートウェイ」「DNS パラメー
タ(プライマリ)」「DNS パラメー
タ(セカンダリ)」を設定してください。ネットワークの設定についてはネットワーク管理者に確認をしてください。
必要事項を記入したら「OK」をクリックします。
IP 等は元々の OS の設定を参考にしてください。
また、Windows で IE を利用している場合は「ツール→インターネットオプシ
ョン→接続→LAN の設定→プロキシサーバー」のアドレスとポート番号も参考にしてください。

5

設定が正しければ「～を通してセットしました。」とメッセージが表示されます。
このメッセージが表示されない場合は、再度入力事項を確認してください。それでも解決しない場合はネットワーク管理者に相談してください。
「eth○ネットワークの設定に成功!」と出ればネットワークの設定は成功です。
「Yes」を押します。

⑦ブラウザを起動します。
⑧プロキシの設定。
（プロキシが必要な場合のみ設定してください）
編集→設定→ネットワーク→接続設定→詳細→手動でプロキシを設定する、と進みIE で確認したプロキシのアドレスとポートを設定します。
※「すべてのプロトコルでこのプロキシを使用する」にチェックを入れてください。
⑨ブラウザで WEB ページを表示できることを確認します。
※VeitualBox から起動させることもできます。
参考動画
Puppy750_050_005VirtualB
ox 起動
https://www.youtube.com/w
atch?v=YssbZyBbS08

6

4 サンプルプログラムのダウンロード□①全情研のページを開きます。
http://www.zenjouken.com/②プログラミングコンテスト→
CHaserOnline2019 とたどります。
③ページ下方にある「キャビネット」からサンプルプログラム→sample01.zip をクリックします。
参考動画
007 サンプルダウンロード 1
https://www.youtube.com/watch?v=bvzfp
JNu3fg④「sample01.zip を開く」ダイアログが開く
ので「ファイルを保存」を選び OK をクリックします。
「保存ファイル名を入力してください」と表示されたら、そのまま保存をクリックします。
⑤画面左上の「ファイル」から my-documentsとたどります。

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

7

5 サンプルプログラムの編集□
サンプルプログラムやサンプル対戦動画が多く提供されていますので色々試してみましょう。今回はサンプル 1 について説明します。
参考動画「zenprocon サンプル」で検索
https://www.youtube.com/results?searc
h_query=%E3%82%B5%E3%83%B3%
E3%83%97%E3%83%AB%E3%80%80z
enprocon①サンプルプログラムの保存先「pwd」コマンドで保存先を確認します。
ここでは/root となっていることを確認します。
「cd my-documents」でディレクトリを変更します。
②ファイルの確認「ls *.c」とすることでソースファイルを確認します。

③プログラムのコンパイル「cc」コマンドでコンパイルを行います。「-o」オプションを指定することで実行ファイルの名前を指定します。
「cc CHaserOnlineClient2019public001.c -o CHaserOnlineClient2019public001.o」とします。

↑ｏになっていることに注意

参考動画
Puppy750_051_ サ ン プ ル
コンパイル
https://www.youtube.com/
watch?v=sfG6iU5ZBf0

8※エディタを使う初回は調整が必要になります。
参考動画
Puppy750 004 エディタの調
整、ファイル開く
https://www.youtube.com/w
atch?v=eZNcga62Ous④ソースファイルの編集
ソースファイルを右クリックし、「テキストの編集」を選びます。
「Action を発行する」部分以外は特に編集する必要はありませんので、ステップアップでは「Action を発行する」部分のみについて説明します。
⑤ 「Action を発行する」部分のソースファイル説明（202 行目～）
do{ ～}while(○○○!=0);

入力されたコマンドが正常に実行されるまで繰り返すことになります。
strcpy(param, "command2=");
CHaserOnline サーバに送るパラメータを作成しています。
if(returnNumber[5]==2){ mode = 5; }else{ mode = 7; }036147258

サーバからの戻り値の６番目(returnNumber[5])が 2（土）だったら右（mode= 5）に進むようにし、そうでなければ下（mode = 7）へ進むように命令をセットします。その際、下の状況を判断することなく動いてしまうので工夫が必要になります。
また、mode 番号は自分の位置を中心に左上からマップを順に数えたものにしています。

9サンプルプログラム 1 の動作例
参考動画
Puppy750_023 サンプル 1_Room1702
https://www.youtube.com/watch?v=Ua
rWs1cFcrg

サンプルプログラム 1 の編集の仕方
参考動画
Puppy750_007
サンプルの編集https://www.youtube.com/watch?v=_VY2jKd
VDSI

10switch(mode){ case 1:strcat(param, "du");break;
case 3:strcat(param, "dl");break;
case 5:strcat(param, "dr");break;
case 7:
strcat(param, "dd");
break;
default: strcat(param, "wr"); }設定されている mode を実際に発行されるコマンドに変換します。ここではｄ系のコマンド(dig 系コマンド)だけが指定されています。他のコマンドも登録したい場合はここに追加しファイルを保存してください。
send_cmd("CommandCheck", param, ReturnCode);
コマンドを CHaserOnline サーバへ送信しています。
/*----------------------Action を発行する-------------------------*/
do{strcpy(param, "command2=");if(returnNumber[5]==2){//もしも右がブロックだったら

mode = 5;//右へmode = 7;//下へ}
else{}
switch(mode){case 1:
strcat(param, "du");break;
case 3:
strcat(param, "dl");break;
case 5:strcat(param, "dr");break;
case 7:
strcat(param, "dd");
break;
default:strcat(param, "wr");}
send_cmd("CommandCheck", param, ReturnCode);count = returnCode2int(ReturnCode, returnNumber);}while((count < 0)&&(strchr(ReturnCode, ',')==NULL)&&(strcmp(ReturnCode, "user=")!=0));//Action が受け付けられるまでループ

11

⑥ キャラクタについて
番号
キャラクタ名

アイコン

得点

備考

場外－３００

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

０

穴－９

１

ターゲット

５０２

土－２０

３

アイテム

１０

５

化石１

１５０

６

化石２

１５０

７

化石３

１５０

８

化石４

１５０

２０～２３

ワープ

０

９

三葉虫

５０

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

岩盤

０

１２

ホワイト

－３００

６０～６３

ブラックスター０

それぞれのブラックスター間で移動できます。

１０００~
８０００

クライアント０

ルームへの接続順に１０００、２０００と順番になっています

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

初心者用マス目です。

※5 マスのワープ（３０～３３）については１０マスワープと同様になります。

12

6 プログラムの実行□① 公開ルームを調べる
CHaserOnline のトップページから待ち合わせページに入ると、ルーム番号・最大接続人数、マップ表示の可否、公開日、巡回ユーザ、備考を確認することができます。最大接続人数は、そのルームで対戦できるユーザの人数を表します。８と書いてあるのは８人用ルームです。プログラミングに慣れてきたら是非取り組んでみましょう。プログラミングを始めたばかりのときは、ルーム情報の Excel ファイル使ってマップの様子を確認しながら取り組むと良いでしょう。
参考動画
Puppy750_013 オンライン接続_待ち合
わせ確認
https://www.youtub
e.com/watch?v=525
diL4GfYY「初心者、初級～上級対応ルーム情報.xlsx」
http://www.zenjouken.com/?page_id=583#_1083
参考動画
054_初心者、初級～上級対応ルーム情報 001
https://www.youtube.
com/watch?v=xFFOt
6TwhI813

②利用可能ルームを調べる
CHaserOnline ページ(http://www7019ug.sakura.ne.jp)にアクセスし画面をクリックします。

③CHaserOnline メインメニューから「待ち合わせ」を選びます。
ユーザ認証画面が出ますのでユーザ名、パスワードを入力してください。
認証が成功すると、現在 CHaserOnline に接続中のユーザ名と利用ルーム番号が分かります。
自分が取り組もうとしているルーム番号が既に満員でないかどうかを確認してください。
ここで、まだクライアントプログラムを動作させていないのに、自分のユーザ名が表示された
場合はユーザが正しく通信できない「ゾンビ状態」になっていることを示します。クライ
アント処理が何かしらの失敗をしてしまい、対戦処理が完了しないとゾンビ状態になります。３分程度たって「ゾンビ状態」が解消してから「④クライアントプログラムを実行」へ進んでください。
サーバ側での「ゾンビ状態」の解除作業はクライアントのユーザ認証処理をきっかけに動作します。３分以上たっても「ゾンビ状態」が続いている場合は「④クライアントプログラムを実行」へ進んでみてください。
※ここでユーザ名、パスワードを認証することでスペルの確認にもなります。
※ブラウザがユーザ認証を奪ってしまうことがあります。どうしてもだめな場合は一度ブラウザを閉じてから④へ進んでください。
※サーバへ同時接続できる人数に制限をもうけています。サーバの負荷により人数制限をしますので、接続できなかった場合はしばらく待ってから試してみてください。

14

④クライアントプログラムを実行
端末を起動しクライアントコマンドを下枠のように打ち込みます。
-u はユーザ名の指定、-p はパスワードの指定、-r はルーム番号の指定をしています。シェルスクリプトに記入しておけば自動実行することができます。
ユーザ「cool」でルーム１９１５に接続する場合のコマンド記入例(ルーム番号は適宜変更)./CHaserOnlineClient2019public001.o ⊔http://www7019ug.sakura.ne.jp:80/
CHaserOnline003/user/⊔-u⊔cool⊔–p⊔cool⊔-r⊔1915※上記は改行せずに一行で記入してください。
※「⊔」は空白（スペース）を表します。
参考動画
Puppy750_014 オンラインシェルの調整（プロキシなしの場合）
https://www.youtube.com/watch?v=aRDCYW5iFCE

ユーザ「hot」でルーム１９１５にプロキシサーバ経由で接続する場合のコマンド記入例./CHaserOnlineClient2019public001.o ⊔http://www7019ug.sakura.ne.jp:80/
CHaserOnline003/user/⊔-u⊔hot⊔–p⊔hot⊔-r⊔1915⊔-x⊔192.168.30.251:8080※プロキシ指定は-x オプションを使います。アドレスとポートは「：」でつないで記入します。
※プロキシサーバのアドレスとポート番号は利用環境によって違います
ので、PC のブラウザ設定を参考にすると良いでしょう。
参考動画
Puppy750_015 オンラインシェルの調整（プロキシ有りの場合）
https://www.youtube.com/watch?v=oeieo6t3SP415※クライアントプログラムが正常動作すると「端末」内に「param=command1=～」というメッセージが現れます。
※ひとつのユーザ ID で複数のルームに同時にログインすることはできません。
また、ひとつのユーザ ID 同士で対戦させることはできません。
※対戦ルームを利用して動作確認をしたい場合は手動クライアントと対戦しても良いでしょう。その場合は以下の公開ユーザを利用してください。
cool01～cool99, coolhot01 ～ hot99, hot
hand01～hand99
参考動画
Puppy750_016 オンラインクライ
アント実行_サーバ画面表示
https://www.youtube.com/watch?v=ii7GOvnrnco⑤巡回ユーザとの対戦
巡回ユーザは常にどこかのルームにて対戦相手を待ち伏せしています。ユーザの接続を確認すると後攻で接続するようになっています。予戦用ルームでは常に待ち伏せしていますが、練習用ルームでＡパターンとＢパターンをある一定時間ごとに切り替えて待ち伏せをしていますので色々なルームにチャレンジしてみましょう。

⑥サーバ画面を準備します。
マップ表示（場合によっては何回かクリックしてください）→ユーザ認証と進みます。
クライアントプログラム動作中だけ、サーバ画面を見ることが出来ます。クライアントプ
ログラムが動作していない場合はエラー表示になってしまいますが、かまわずクライアン
トプログラムを実行させてください。何度かリロードすることによって画面が表示されます。対戦画面は自動的に更新されます。

16

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

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

17

⑨対戦結果表示
CHaserOnline メインメニューから「サーバ」→「結果表示」とたどります。
ユーザ認証画面がでますので、ユーザ名、パスワードを入力してください。
標準ではその日の対戦結果が表示されるようになっていますが、日付やルーム番号などを変更し、希望する範囲の対戦結果を表示させることができます。
練習のはじめの頃は得点のマイナスが多く、結果が表示されないことがありますが、得点の最小値をさらに小さくすることで表示できます。
参考動画
Puppy750_012 結果表示
https://www.youtube.com/watch?v=qQvrpMtUrzE⑩合計得点ランキング
CHaserOnline メインメニューから「サーバ」→「合計得点ランキング」とたどります。
最近の結果の中からルームに関係なく合計点でのランキングが表示されます。クライアン
ト作成の目標にすると良いでしょう。
参考動画
018 合計得点ランキング 1
https://www.youtube.com/watch?v=jz68Rw3Eq_I

18

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

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

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

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

19

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

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

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

20

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

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

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

競技サーバ

クライアント２

競技サーバにユーザ認証

競技サーバにユーザ認証

ユーザ認証成功

ユーザ認証成功

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

ターン

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

これでステップアップヒント１は終了となります。

23

ターン