アナウンス

ヘックス(HEX)のページ

  コマンドラインでHEXゲームのリーグ戦をして勝率を競いましょう! とりあえずWeb上(http://www.afsgames.com/hex.htm)で実際にゲームをやってみてこのゲームを理解して下さい。 ちなみにこれはFlash(ActionScript)で作成されたようです。

  我々はコマンドラインで頑張りましょう!! コマンドラインのHEXゲームでは、○と☆に分かれて、対岸にある○の辺同士あるいは☆の辺同士を繋ぎます。 それぞれの実行(.exe)ファイルをダウンロードして、コマンドプロンプトを起動して、コマンドとして入力して実行してみて下さい。 実行ファイルをダブルクリックして開始するとゲームの終了と同時にコマンドプロンプトのウィンドウが消えてしまいます。

実行ファイルのサンプル(最新ではありません)

  1. 人対人版(hexhuman.exe):二人であるいは一人二役で使って下さい
  2. サンプル版(hex95012.exe):サンプルプログラムの関数(ma95012:弱過ぎる思考ルーチン)がお相手します
  3. 乱数版(hexrand.exe):やる気の無いもの同士?の対戦結果を見て楽しむ

教材ソースファイル

分割コンパイルの仕方(Windows環境)

  1. cl /c hex.c  → hex.objが生成される
  2. cl /c hexgame.c  → hexgame.objが生成される
  3. cl /c ma95012.c  → ma95012.objが生成される
  4. cl /o hex95012 hex.obj hexgame.obj ma95012.obj
      → 必要なオブジェクトファイルをリンクして、実行ファイル(hex95012.exe)を生成する

  /c オプションをつけるとリンクフェーズまで進まずに、オブジェクトファイル(xxx.obj)だけが生成される。 /o オプションを付けて続けて xxx と書くと、出力される実行ファイルの名前(xxx.exe)を指定できる。 ソースファイル(xxx.c)を変更したものについてのみ cl /c でオブジェクトファイルを生成し直して、必要なオブジェクトをリンクすれば良い。

個人ファイル

  個人ファイルとは、各自の思考ルーチンを関数として実現したソースファイルのことであり、 ma95012.c を参考にして作成して下さい。

  1. 学籍番号が M061234 の人は、ソースファイル名を m061234.c とすること
  2. その中で、関数 int m061234( int part, int xc, int yc, char **msg ) を定義する
  3. 他人(例:M069999)との対戦は、その関数(m069999())が定義されたオブジェクト(m069999.obj)をリンクする
  4. ソース(m069999.c)はお互いに見せたくないので、コンパイル後のオブジェクト(m069999.obj)を交換(あるいは公開)する
  5. 詳細はこちら

対戦定義ファイル(hexgame.c)とリンクコマンド

  hexgame[] は対戦関数の配列で仮の先手、仮の後手の順で並べる。 ちなみに、hexXXX サイズ 0 で仮の先手・後手の順でプレーし、hexXXX サイズ 1 で仮の先手・後手を交代してプレーする。

個人ファイル(詳細)

  1. 学籍番号が M061234 の人は、ソースファイル名を m061234.c とすること
  2. その中で、関数 int m061234( int part, int xc, int yc, char **msg ) を定義する
  3. 自分の手:partMARU(○)か BATSU(☆)である
  4. 事前準備として partEMPTY が設定されて呼び出されるので、 名前(ma95012)を msg に渡すこと
    *msg = "ma95012";
  5. 毎回の手に対して msg にコメントを出すことができる
    *msg = "参りました"; /* 負けを悟ったとき */
    出さないときは0を設定しておくこと(*msg = 0;
  6. (xc,yc) は相手の直前手で、先手の場合は (0,0) と与えられる
  7. MARU(○)はX軸方向に、BATSU(☆)はY軸方向に接続する
  8. 26×26までの如何なるサイズでも、先手でも、後手でも戦えるようにしておくこと
  9. 対戦関数(m061234())以外の関数や外部変数は、static 宣言して、内部リンケージにしておくこと
  10. 利用できる関数(hex.cに定義されている):
    int size = getsize();ゲームのサイズ([1,size]×[1,size])を得る
    int cpart = counter( part );part の相手(cpart)を得る
    int gethex( int part, int x, int y )盤上の点(x,y)の状態(EMPTY or MARU or BATSU)を知る
    int puthex( int part, int x, int y )盤上の点(x,y)に手(part)を打つ
  11. 対戦関数の配列(hexgame[])にアクセスしないこと
    (相手に成りすまして弱く振舞ったり降参してみせる等は反則!正々堂々と戦え!!)
  12. 打てない処(盤の外や状態が EMPTY でない処)に打ったり、1回に2手以上打ったら負け
  13. 無限ループあるいはそれと区別できない長考も禁止とし、負けと判断します
  14. 他人(例:M069999)との対戦は、その関数(m069999())が定義されたオブジェクト(m069999.obj)をリンクする
  15. ソース(m069999.c)はお互いに見せたくないので、コンパイル後のオブジェクト(m069999.obj)を交換(あるいは公開)する

対戦について(学内のみ)

  出口の授業用サーバ(経大内)の \\F13-sv01\deguchi に対戦用のオブジェクトファイルを共有する為の場所「hexobj」を作りました。

 サンプル

 エントリーの仕方

 対戦のさせ方

  1. 他人のオブジェクトファイル(ma95012.obj等)のコピーを自分の場所(Z:hex等)に持って行って使用する
  2. hexgame.c を適切に修正して対戦の設定をする
  3. 自分の場所で以下の様にコンパイルする
  4. /o の後ろに書いた名前で実行ファイル(hex.exe等)ができるので、それを実行する

 禁止事項

リーグ戦について

  3限のクラス、4限のクラス合同で、提出された全員のオブジェクトファイル(xxx.obj)を元に、リーグ戦を行い総合勝ち数を競います。 二者の対戦においてはサイズを7から26の20種で先手後手を交代して40試合行っての勝ち数を求めます。

 連続試合とそのログ

  1. 名簿ファイル(members.txt)を作成する
  2. mkgame.c をコンパイルして実行し、コンパイル用バッチファイル(com.bat)と連続試合の為のバッチファイル(game.bat)を生成する
  3. コンパイル用バッチファイル(com.bat)を実行し、実行ファイル(h_x_y.exe)を生成する
  4. ゲームバッチファイル(game.bat)を実行し、対戦ログファイル(clog.txt)を生成する
  5. mkmat.c をコンパイルして実行し、対戦ログファイル(clog.txt)から対戦成績表(hexmat.csv)を生成する
    強い順(勝ち数の多い順)にソートするには mkmat 1 と引数をつける
  6. 対戦成績表(hexmat.csv)はExcelで開いて見ることができる

戻る
Copyright © 2006-2008 DEGUCHI Hiroshi, All Rights Reserved.