2004年06月08日
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;
}
/***************************************
オセロムーブ処理
*****************************************/
#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;
}