アナウンス 
- hex.cを更新しました。(2008.12.25)
 コマンドラインで範囲外の小さな(大きな)サイズが入力された際に、強制的に最小(最大)サイズにするようにしました。
 
ヘックス(HEX)のページ
 
コマンドラインでHEXゲームのリーグ戦をして勝率を競いましょう!
とりあえずWeb上(http://www.afsgames.com/hex.htm)で実際にゲームをやってみてこのゲームを理解して下さい。
ちなみにこれはFlash(ActionScript)で作成されたようです。
 
我々はコマンドラインで頑張りましょう!!
コマンドラインのHEXゲームでは、○と☆に分かれて、対岸にある○の辺同士あるいは☆の辺同士を繋ぎます。
それぞれの実行(.exe)ファイルをダウンロードして、コマンドプロンプトを起動して、コマンドとして入力して実行してみて下さい。
実行ファイルをダブルクリックして開始するとゲームの終了と同時にコマンドプロンプトのウィンドウが消えてしまいます。
- コマンドラインで、> hexXXX と入力するとゲーム盤のサイズを聞いてきます
- > hexXXX 13 等と入力するとゲーム盤のサイズを設定(この場合 13 )できます
- > hexXXX 13 1 と 1 を追加して入力すると先手と後手が入れ替わり、
 > hexXXX 13 0 と 0 を追加して入力すると仮の先手と後手のままです
- > hexXXX 13 0 0 と最後に何か(例えば 0 )を追加して入力すると毎回の盤の表示を省略します
- > hexXXX 13 0 2 と最後に 2 を追加して入力すると、ログファイル(hexlog.txt)に勝敗ログを追加します
- > hexXXX 13 0 3 と最後に 3 を追加して入力すると、加えて対戦ログファイル(clog.txt)に結果を追加します
- 人(human)の場合、横軸のX座標を数字と斜め縦軸のY座標のアルファベットを続けて入力します
| 
       1234
      ☆☆☆☆
   A○・・・・○A
  B○・・・・○B
 C○・・・・○C
D○・・・・○D
  ☆☆☆☆
 1234
 |  
 
 
- 人(human)の場合、X座標に負数を入力すると途中で降参することができます
- プログラムの場合は、[1,size]×[1,size]のXY座標(自然数)を用います
 左上の点A1が座標(1,1)に対応し、X軸が横方向、Y軸が斜め左下方向です
 
| 
(i,j)と隣接関係にあるのは:
     (i-1,j-1) (i, j-1)
         \ /
    (i-1,j)−(i,j)−(i+1, j)
         / \
      (i,j+1) (i+1,j+1)
 |  
 
 
実行ファイルのサンプル(最新ではありません)
- 人対人版(hexhuman.exe):二人であるいは一人二役で使って下さい
- サンプル版(hex95012.exe):サンプルプログラムの関数(ma95012:弱過ぎる思考ルーチン)がお相手します
- 乱数版(hexrand.exe):やる気の無いもの同士?の対戦結果を見て楽しむ
教材ソースファイル
分割コンパイルの仕方(Windows環境)
- cl /c hex.c  → hex.objが生成される
- cl /c hexgame.c  → hexgame.objが生成される
- cl /c ma95012.c  → ma95012.objが生成される
- cl /o hex95012 hex.obj hexgame.obj ma95012.obj
 → 必要なオブジェクトファイルをリンクして、実行ファイル(hex95012.exe)を生成する
 
/c オプションをつけるとリンクフェーズまで進まずに、オブジェクトファイル(xxx.obj)だけが生成される。
/o オプションを付けて続けて xxx と書くと、出力される実行ファイルの名前(xxx.exe)を指定できる。
ソースファイル(xxx.c)を変更したものについてのみ cl /c でオブジェクトファイルを生成し直して、必要なオブジェクトをリンクすれば良い。
 
個人ファイルとは、各自の思考ルーチンを関数として実現したソースファイルのことであり、
ma95012.c を参考にして作成して下さい。
- 学籍番号が M061234 の人は、ソースファイル名を m061234.c とすること
- その中で、関数 int m061234( int part, int xc, int yc, char **msg ) を定義する
- 他人(例:M069999)との対戦は、その関数(m069999())が定義されたオブジェクト(m069999.obj)をリンクする
- ソース(m069999.c)はお互いに見せたくないので、コンパイル後のオブジェクト(m069999.obj)を交換(あるいは公開)する
- 詳細はこちら
対戦定義ファイル(hexgame.c)とリンクコマンド
 
hexgame[] は対戦関数の配列で仮の先手、仮の後手の順で並べる。
ちなみに、hexXXX サイズ 0 で仮の先手・後手の順でプレーし、hexXXX サイズ 1 で仮の先手・後手を交代してプレーする。
- hexhuman.exe用
#include "hex.h"
int 	(*hexgame[2])() = { human, human };
リンクコマンド: cl /o hexhuman hex.obj hexgame.obj 
- hex95012.exe用
#include "hex.h"
extern	int	ma95012();
int 	(*hexgame[2])() = { human, ma95012 };
リンクコマンド: cl /o hex95012 hex.obj hexgame.obj ma95012.obj 
- hexrand.exe用
#include "hex.h"
int 	(*hexgame[2])() = { p_rand, p_rand };
リンクコマンド: cl /o hexrand hex.obj hexgame.obj 
- 学籍番号が M061234 の人の場合〜デバッグ用〜
#include "hex.h"
extern	int	m061234();
int 	(*hexgame[2])() = { m061234, human };
リンクコマンド: cl /o hex061234 hex.obj hexgame.obj m061234.obj 
- 学籍番号が M061234 の人が MA95012 と対戦したい場合
#include "hex.h"
extern	int	m061234();
extern	int	ma95012();
int 	(*hexgame[2])() = { m061234, ma95012 };
リンクコマンド: cl /o hex061234 hex.obj hexgame.obj m061234.obj ma95012.obj 
- 学籍番号が M061234 の人は、ソースファイル名を m061234.c とすること
- その中で、関数 int m061234( int part, int xc, int yc, char **msg ) を定義する
- 自分の手:part は MARU(○)か BATSU(☆)である
- 事前準備として part に EMPTY が設定されて呼び出されるので、
名前(ma95012)を msg に渡すこと
 *msg = "ma95012";
- 毎回の手に対して msg にコメントを出すことができる
 *msg = "参りました";	/* 負けを悟ったとき */
 出さないときは0を設定しておくこと(*msg = 0;)
- (xc,yc) は相手の直前手で、先手の場合は (0,0) と与えられる
- MARU(○)はX軸方向に、BATSU(☆)はY軸方向に接続する
- 26×26までの如何なるサイズでも、先手でも、後手でも戦えるようにしておくこと
- 対戦関数(m061234())以外の関数や外部変数は、static 宣言して、内部リンケージにしておくこと
- 利用できる関数(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)を打つ |  
 
- 
対戦関数の配列(hexgame[])にアクセスしないこと
 (相手に成りすまして弱く振舞ったり降参してみせる等は反則!正々堂々と戦え!!)
- 打てない処(盤の外や状態が EMPTY でない処)に打ったり、1回に2手以上打ったら負け
- 無限ループあるいはそれと区別できない長考も禁止とし、負けと判断します
- 他人(例:M069999)との対戦は、その関数(m069999())が定義されたオブジェクト(m069999.obj)をリンクする
- ソース(m069999.c)はお互いに見せたくないので、コンパイル後のオブジェクト(m069999.obj)を交換(あるいは公開)する
 
出口の授業用サーバ(経大内)の \\F13-sv01\deguchi に対戦用のオブジェクトファイルを共有する為の場所「hexobj」を作りました。
 サンプル
- 人と勝負できる程度?のサンプルとして deguchi2.obj を置いておきます。え?弱いって??
- また、hex2.exe はあなた自身(human)との対戦用に、対戦定義ファイル(hexgame2.c)と共に、
cl /o hex2 hex.obj hexgame2.obj deguchi2.obj
 で作成しています。
 エントリーの仕方
- 1人1エントリーとし、ファイル名は自分の「学籍番号.c」という命名規則を守ること!
- 自分のソース(m061234.c等)をコンパイルしたオブジェクトファイル(m061234.obj等)のみを \\F13-sv01\deguchi\hexobj にドラッグ&ドロップでコピーする
- 間違ってもここ「hexobj」に自分のソースファイルを置かないこと!!
 対戦のさせ方
- 他人のオブジェクトファイル(ma95012.obj等)のコピーを自分の場所(Z:hex等)に持って行って使用する
- hexgame.c を適切に修正して対戦の設定をする
- 自分の場所で以下の様にコンパイルする
cl /c hex.c  ・・・一回だけ。但しhex.cが更新されたらもう一度!
cl /c hexgame.c  ・・・対戦設定の度に
cl /c m061234.c  ・・・自分のソースを修正する度に
cl /o hex hex.obj hexgame.obj m061234.obj ma95012.obj 
- /o の後ろに書いた名前で実行ファイル(hex.exe等)ができるので、それを実行する
- 画面出力をファイルにリダイレクトすれば、対戦状況を振り返って検討できる!
hex 10 0 > res.txt 
 禁止事項
- 他人のファイルを改竄(削除、名前の変更も含む)しないこと
- 関係の無いファイルを置かないこと
- オブジェクトファイル置き場(hexobj)でコンパイルしないこと
- hex.c を自分の都合の良いように改竄しないこと
 
3限のクラス、4限のクラス合同で、提出された全員のオブジェクトファイル(xxx.obj)を元に、リーグ戦を行い総合勝ち数を競います。
二者の対戦においてはサイズを7から26の20種で先手後手を交代して40試合行っての勝ち数を求めます。
 連続試合とそのログ
- 第2引数のサイズ、第3引数の先手・後手の交代、第4引数のログ保存を利用するバッチファイルの例:game.bat
- リーグ戦に参加する名簿ファイルの例:members.txt
- mkgame.c は、対戦定義ファイル(h_x_y.c)を自動生成し、実行ファイル(h_x_y.exe)を生成するためのコンパイルコマンドのバッチファイル(com.bat)と連続試合の為のバッチファイル(game.bat)を生成する
- mkmat.c は、対戦ログファイル(clog.txt)を集計して対戦成績表(hexmat.csv)を生成する
| ファイル名 | 作成ファイル | 更新日付 | 
| mkgame.c | コンパイル用バッチファイル(com.bat) ゲームバッチファイル(game.bat)
 | 2007/01/16 | 
| mkmat.c | 対戦成績表(hexmat.csv) | 2007/01/16 | 
- 名簿ファイル(members.txt)を作成する
- mkgame.c をコンパイルして実行し、コンパイル用バッチファイル(com.bat)と連続試合の為のバッチファイル(game.bat)を生成する
- コンパイル用バッチファイル(com.bat)を実行し、実行ファイル(h_x_y.exe)を生成する
- ゲームバッチファイル(game.bat)を実行し、対戦ログファイル(clog.txt)を生成する
- mkmat.c をコンパイルして実行し、対戦ログファイル(clog.txt)から対戦成績表(hexmat.csv)を生成する
 強い順(勝ち数の多い順)にソートするには mkmat 1 と引数をつける
- 対戦成績表(hexmat.csv)はExcelで開いて見ることができる
戻る
Copyright © 2006-2008 DEGUCHI Hiroshi, All Rights Reserved.