| 01 | 2026/02 | 03 |
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
本当に欲しいかどうかよくわからない物。でも、送料も無料の完全無料で手に入るとしたら、あなたはどうしますか?
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
本当に欲しいかどうかよくわからない物。でも、送料も無料の完全無料で手に入るとしたら、あなたはどうしますか?
私は昔、ゲームを作るのが大好きでした。でも、公開できないようなものばかり...。
でも、ひとつだけ公開できるものがあります。
ReversiProject
リバーシ(いわゆるオセロ)です。超初心者はかなわない程度の、人工知能がお相手します。DirectDrawを駆使(?)して、大迫力(?)のゲーム展開です!!もちろん無料のフリーソフトです。
ちなみにこのゲーム、自分でアルゴリズムが作れちゃうんです!!!
コンパイルの方法
コンパイルするには、yaneGameSDK 1.XX が必要です。プロジェクトに yaneSDK のファイルすべてと、Reversi Project のソースファイルをすべて追加し、必要があれば main.h を修正し、ビルドしてください。
コンパイルの方法の詳細は yaneGameSDK を使うための準備 をご覧ください。また、yaneGameSDK は BM98'S ROOM つう で手に入ります。
アルゴリズムの追加方法
以下の3ヶ所に追加記述してください。これを読んだだけではわかりにくいと思いますので、プログラム例なども参考にしてください。
(1) Algorithm.h
関数の宣言に、これから作る関数を追加。
[例]
int Random(CCockReversi * R, int p);
int Yokubari(CCockReversi * R, int p);
int Normal(CCockReversi * R, int p);
int Bech(CCockReversi * R, int p);
(2) Algorithm.cpp
アルゴリズムを記述してください。引数や返り値などは後で説明します。
(3) main.cpp
アルゴリズムの関数名と、アルゴリズムの名前の登録を行います。関数名とアルゴリズム名の順番が対応するようにしてください。
[例]
// アルゴリズムの関数名(最初のNULLの手前に追加してね)
int (*Alg[])(CCockReversi * R, int p) = {
Bech, Random, Yokubari, Normal, NULL, NULL
};
// 8文字以内のアルゴリズムの名前("blue"の手前に追加してね)
// ちなみに".bmp"を付けたものがコマのビットマップファイル名になる
string AlgName[] = {
"bech", "random", "yokubari", "normal", "blue", "red"
};
コマの bmp ファイル
アルゴリズムで使うコマのビットマップファイルを、koma フォルダに置いて下さい。サイズは 60 * 60 ドットで、透過色は一番左上のビットの色になります。ファイル名は、"[アルゴリズム名].bmp" としてください。この例の場合は "bech.bmp" になります。
自作の関数の引数と返り値について
関数は int Name(CCockReversi * R, int p) のように定義する。引数は必ずこのようにする。
関数の名前 Name
関数の名前なので、重複しないよう、自由につけることができる。
CCockReversi * R
CCockReversi へのポインタ。以下で説明するメンバ関数を R->function( ); で呼ぶことや、R[y][x] で (x, y) のにあるコマを調べたりできる。
int p
1なら自分がプレーヤー1であり、2ならプレイヤー2である。ちなみに、自分が p であれば、相手は 3 - p である。
返り値
コマを置く場所が (x, y) と決まったら、y * 8 + x を返す。つまり return y * 8 + x; とする。
※ コマが置けない場所を返すとバグります。(必ず1ヶ所以上コマが置けるところがあるときのみ、関数が呼ばれるようになっています)
CCockReversi のメンバ関数の説明
int Num()
置いてある自分のコマの数を返す。
int NumAll()
置いてあるすべてのコマの数を返す。
int Num(int p)
プレーヤー p のコマの数を返す。
int Get(int x, int y)
自分が (x, y) にコマを置いた時に取れる数を返す。
int Get(int x, int y, int p)
プレーヤー p が (x, y) にコマを置いた時に取れる数を返す。
int Data(int x, int y)
(x, y) にあるコマを返す。
※ これらの関数は、R->function(...); で呼ぶことができる。
※ p の値は、プレイヤー1は 1、プレイヤー2は2である。ちなみに先行がプレイヤー1で、後攻がプレイヤー2である。
※ (x, y) にあるコマは、1でプレーヤー1、2でプレーヤー2、0で無しを表す。
※ x, y は 0 ~ 7 の整数で、左上が x = 0, y = 0 つまり (0, 0) で、右下が (7, 7) 。
その他気付いたものがあれば追加していく予定です。
グローバル関数
int Get(int ** before, int ** after, int x, int y, int p)
コマ配置データ before の (x, y) に、コマ p を置いた時に取れる数を返す。さらに after にコマを置いた後のコマは位置データが書き込まれる。
※ この関数は普通に Get(...); で呼ぶことができる。
アルゴリズムの例
yokubari(欲張り)アルゴリズム
これは、もっとも多く相手のコマが取れる場所に置くという、かなり単純なアルゴリズムです。プログラムがわからない人は、このアルゴリズムを理解してみてください。C言語の入門書と、このページを読めば、きっと理解できるはずです。
int Yokubari(CCockReversi * R, int p)
{
int x = 0, y = 0, n = 0, i, j;
for(j=0; j<8; j++)
for(i=0; i<8; i++)
if(R->Get(i, j) > n) {
x = i;
y = j;
n = R->Get(i, j);
}
return y * 8 + x;
}
アルゴリズム募集
アルゴリズムを作ってくれた人は、是非私にメールで送ってください。送るものは関数本体と、コマのビットマップファイルだけで結構です。なかなか良いアルゴリズムでしたら、Riversi Project のアルゴリズムに追加させていただきます。そしてこのホームページで紹介させていただきたいと思います。そして、まだ開催されるか未定の、アルゴリズム大会にエントリーさせていただきます。