2004年06月08日

WinSearch.c

このファイルがソース公開の最後です。
最終読みきりのサーチ関数です。
次回からはヘッダーの残りとリソースの公開に移ります。
ソフトの基礎が出来た人ならこれらのファイルとコンパイラーがあればStaBuクローンは作れると思います。
でも重要なのは、アルゴリズムの理解です。
ここがソフトを趣味にする醍醐味ではないでしょうか?(言い過ぎ!?)


/***************************************
オセロサーチ処理
*****************************************/

#include "othello.h"

/*
+--+--+--+--+--+--+--+--+
|11|12|13|14|15|16|17|18|
+--+--+--+--+--+--+--+--+
|21|22|23|24|25|26|27|28|
+--+--+--+--+--+--+--+--+
|31|32|33|34|35|36|37|38|
+--+--+--+--+--+--+--+--+
|41|42|43|44|45|46|47|48|
+--+--+--+--+--+--+--+--+
|51|52|53|54|55|56|57|58|
+--+--+--+--+--+--+--+--+
|61|62|63|64|65|66|67|68|
+--+--+--+--+--+--+--+--+
|71|72|73|74|75|76|77|78|
+--+--+--+--+--+--+--+--+
|81|82|83|84|85|86|87|88|
+--+--+--+--+--+--+--+--+
*/

short WinSearch( WinBoard *b )
{
int i, j;
char *p, c0, c;
List *m, *m0;

p = b->space; // pを空き位置リストの先頭にする
m0 = m = b->list; // 手リストをクリア
while( m->move ) {
m->move = 0;
m++;
}
m = m0; // mを手リストの先頭にする
if( (c0=b->color) == BL ) c = WH; // 盤面の色をセット(反対も)
else c = BL;
j = 0; // 手数を0にする
while( *p ) { // 空き位置リストを調べる
i = *p;
for(;;) {
i++; // 右に1つ移動
if( b->board[i] == c ) { // 駒が違う色の場合
for(;;) { // ループ
i++; // 右に1つ移動
if( b->board[i] <= 0 ) break; // 駒が無いか盤の外に出たらブレーク
if( b->board[i] == c0 ) { // 同色の駒が有る場合
m0 = b->list; // m0を手リストの先頭にする
while( m0->move != *p ) { // 手リストの中に同じ手が無いか確認
if( m0->move == 0 ) { // 手リストが終わった場合
m->move = *p; // 手リストの最後に手を加える
m++; // 手リストの最後を1つ進める 
j++; // 手数を1加える
break; // 手リスト重複確認を終了
} //
m0++; // 手リストを1つ進める
} // ループ
break;
}
}
break;
}
break;
}

i = *p; // 左
for(;;) {
i--;
if( b->board[i] == c ) {
for(;;) {
i--;
if( b->board[i] <= 0 ) break;
if( b->board[i] == c0 ) {
m0 = b->list;
while( m0->move != *p ) {
if( m0->move == 0 ) {
m->move = *p;
m++;
j++;
break;
}
m0++;
}
break;
}
}
break;
}
break;
}

i = *p; // 上
for(;;) {
i -= 10;
if( b->board[i] == c ) {
for(;;) {
i -= 10;
if( b->board[i] <= 0 ) break;
if( b->board[i] == c0 ) {
m0 = b->list;
while( m0->move != *p ) {
if( m0->move == 0 ) {
m->move = *p;
m++;
j++;
break;
}
m0++;
}
break;
}
}
break;
}
break;
}

i = *p; // 下
for(;;) {
i += 10;
if( b->board[i] == c ) {
for(;;) {
i += 10;
if( b->board[i] <= 0 ) break;
if( b->board[i] == c0 ) {
m0 = b->list;
while( m0->move != *p ) {
if( m0->move == 0 ) {
m->move = *p;
m++;
j++;
break;
}
m0++;
}
break;
}
}
break;
}
break;
}

i = *p; // 右上
for(;;) {
i -= 9;
if( b->board[i] == c ) {
for(;;) {
i -= 9;
if( b->board[i] <= 0 ) break;
if( b->board[i] == c0 ) {
m0 = b->list;
while( m0->move != *p ) {
if( m0->move == 0 ) {
m->move = *p;
m++;
j++;
break;
}
m0++;
}
break;
}
}
break;
}
break;
}

i = *p; // 右下
for(;;) {
i += 11;
if( b->board[i] == c ) {
for(;;) {
i += 11;
if( b->board[i] <= 0 ) break;
if( b->board[i] == c0 ) {
m0 = b->list;
while( m0->move != *p ) {
if( m0->move == 0 ) {
m->move = *p;
m++;
j++;
break;
}
m0++;
}
break;
}
}
break;
}
break;
}

i = *p; // 左下
for(;;) {
i += 9;
if( b->board[i] == c ) {
for(;;) {
i += 9;
if( b->board[i] <= 0 ) break;
if( b->board[i] == c0 ) {
m0 = b->list;
while( m0->move != *p ) {
if( m0->move == 0 ) {
m->move = *p;
m++;
j++;
break;
}
m0++;
}
break;
}
}
break;
}
break;
}

i = *p; // 左上
for(;;) {
i -= 11;
if( b->board[i] == c ) {
for(;;) {
i -= 11;
if( b->board[i] <= 0 ) break;
if( b->board[i] == c0 ) {
m0 = b->list;
while( m0->move != *p ) {
if( m0->move == 0 ) {
m->move = *p;
m++;
j++;
break;
}
m0++;
}
break;
}
}
break;
}
break;
}
p++;
}
m->move = 0;
b->p = b->list;
return j;
}

at 23:52|PermalinkComments(0)mixiチェック StaBu 

出張

今日は普通の日です。
平日という言葉がぴったり。
お仕事は普通に進み、
午後10時には帰宅。
ニュースを見て、お風呂入って、四川省やって、Web見て、日記を書いてます。
明日は東京出張なので、念のためシップを肩と首に張って寝ます。

at 23:46|PermalinkComments(0)mixiチェック 日記 

winmove.c

move.cと違うのは、引数の構造体が違うからです。最終読み切りには以前使っていた構造体gあ早いのがわかっていたので、残り駒数が少なくなったらこちらに切り替えています。





/***************************************
オセロムーブ処理
*****************************************/

#include "othello.h"

short WinMove( WinBoard *b )
{
int i, j, k;
char *p;
short c0, c, pp;

if( b->p->move == 0 ) {
if( b->color == BL ) b->color = WH;
else b->color = BL;
return 0;
}

p = b->space;
for(;;) { // space list から move を削除
if( *p == b->p->move ) {
do {
p++;
*(p-1) = *p;
} while( *p );
break;
}
p++;
}
c0 = b->color; // 色を記録
if( c0 == BL ) c = WH;
else c = BL;

i = j = b->p->move;
b->board[i] = c0;
pp = 1;

i = j; // 右
for(;;) {
i++;
if( (k=b->board[i]) <= 0 ) break;
if( k == c0 ) {
for(;;) {
i--;
if( b->board[i] == c0 ) break;
b->board[i] = c0;
pp++;
}
break;
}
}

i = j; // 左
for(;;) {
i--;
if( (k=b->board[i]) <= 0 ) break;
if( k == c0 ) {
for(;;) {
i++;
if( b->board[i] == c0 ) break;
b->board[i] = c0;
pp++;
}
break;
}
}

i = j; // 上
for(;;) {
i -= 10;
if( (k=b->board[i]) <= 0 ) break;
if( k == c0 ) {
for(;;) {
i += 10;
if( b->board[i] == c0 ) break;
b->board[i] = c0;
pp++;
}
break;
}
}

i = j; // 下
for(;;) {
i += 10;
if( (k=b->board[i]) <= 0 ) break;
if( k == c0 ) {
for(;;) {
i -= 10;
if( b->board[i] == c0 ) break;
b->board[i] = c0;
pp++;
}
break;
}
}

i = j; // 右上
for(;;) {
i -= 9;
if( (k=b->board[i]) <= 0 ) break;
if( k == c0 ) {
for(;;) {
i += 9;
if( b->board[i] == c0 ) break;
b->board[i] = c0;
pp++;
}
break;
}
}

i = j; // 右下
for(;;) {
i += 11;
if( (k=b->board[i]) <= 0 ) break;
if( k == c0 ) {
for(;;) {
i -= 11;
if( b->board[i] == c0 ) break;
b->board[i] = c0;
pp++;
}
break;
}
}

i = j; // 左下
for(;;) {
i += 9;
if( (k=b->board[i]) <= 0 ) break;
if( k == c0 ) {
for(;;) {
i -= 9;
if( b->board[i] == c0 ) break;
b->board[i] = c0;
pp++;
}
break;
}
}

i = j; // 左上
for(;;) {
i -= 11;
if( (k=b->board[i]) <= 0 ) break;
if( k == c0 ) {
for(;;) {
i += 11;
if( b->board[i] == c0 ) break;
b->board[i] = c0;
pp++;
}
break;
}
}

b->color = c; // 盤面の色を変える.
if( c0 == BL ) {
b->black += pp;
b->white -= (pp-1);
}
else {
b->white += pp;
b->black -= (pp-1);
}
return pp;
}

at 01:05|PermalinkComments(0)mixiチェック StaBu