2004年05月
2004年05月31日
Move.c
手を打ってから駒を反す関数です。
それに伴ってちょっとした処理もやっています。
元気は出てきたのですが、細かいコメントはもうちょっと先にさせてください。
#include "Othello.h"
extern char SearchList[1024];
short Move( Board *b )
{
char *p;
short i, j, k, pos, c;
i = b->p->move;
c = b->color;
b->color = c * (-1);
k = 0;
if( i < 0 ) return k;
p = SearchList;
pos = 0;
while( *p != End ) {
if( (i == *p) && (j=*((b->dir)+(*p))) ) {
if( ( pos >= 0 && pos < 72 && (j&0x01) ) ||
( pos >= 72 && pos < 144 && (j&0x02) ) ||
( pos >= 144 && pos < 216 && (j&0x04) ) ||
( pos >= 216 && pos < 288 && (j&0x08) ) ||
( pos >= 288 && pos < 357 && (j&0x10) ) ||
( pos >= 357 && pos < 426 && (j&0x20) ) ||
( pos >= 426 && pos < 495 && (j&0x40) ) ||
( pos >= 495 && pos < 565 && (j&0x80) ) ) {
p++;
pos++;
while( *((b->board)+(*p)) != c ) {
*((b->board)+(*p)) = c;
k++;
p++;
pos++;
}
}
}
p++;
pos++;
}
*((b->board) + i) = c;
return k;
}
それに伴ってちょっとした処理もやっています。
元気は出てきたのですが、細かいコメントはもうちょっと先にさせてください。
#include "Othello.h"
extern char SearchList[1024];
short Move( Board *b )
{
char *p;
short i, j, k, pos, c;
i = b->p->move;
c = b->color;
b->color = c * (-1);
k = 0;
if( i < 0 ) return k;
p = SearchList;
pos = 0;
while( *p != End ) {
if( (i == *p) && (j=*((b->dir)+(*p))) ) {
if( ( pos >= 0 && pos < 72 && (j&0x01) ) ||
( pos >= 72 && pos < 144 && (j&0x02) ) ||
( pos >= 144 && pos < 216 && (j&0x04) ) ||
( pos >= 216 && pos < 288 && (j&0x08) ) ||
( pos >= 288 && pos < 357 && (j&0x10) ) ||
( pos >= 357 && pos < 426 && (j&0x20) ) ||
( pos >= 426 && pos < 495 && (j&0x40) ) ||
( pos >= 495 && pos < 565 && (j&0x80) ) ) {
p++;
pos++;
while( *((b->board)+(*p)) != c ) {
*((b->board)+(*p)) = c;
k++;
p++;
pos++;
}
}
}
p++;
pos++;
}
*((b->board) + i) = c;
return k;
}
2004年05月30日
minmax.c
今日は検索の基本minmax.cです。
αβを実行する前に、minmaxで有望な手を検索の順番の前に出す為に使っています。
/***************************************
オセロミニマックス処理
*****************************************/
#include "Othello.h"
extern short depth;
extern short ManC;
extern Board temp;
short MinMax( short level, Board *b )
{
short m;
List *p;
if( level ) {
if( (m=Search(b)) == 0 ) { // End Check
temp = *b;
temp.color *= -1;
if( Search( &temp ) == 0 ) return SetMatch( b ); // End Process
}
}
if( level == depth ) return SetValue( b, m ); // Depth Check & Process
for(;;) {
*(b+1) = *b; // Move Create
Move( b+1 ); // Move Process
b->p->value = MinMax( level+1, b+1 ); // MinMax
b->p++; // Next Pass
if( b->p->move == End ) { // List End Check
p = b->p = b->list;
m = b->p->value;
if( b->color == ManC ) { // Min Process
for(;;) {
if( b->p->move == End ) break;
if( b->p->value < m ) {
m = b->p->value;
p = b->p;
}
b->p++;
}
}
else { // Max Process
for(;;) {
if( b->p->move == End ) break;
if( b->p->value > m ) {
m = b->p->value;
p = b->p;
}
b->p++;
}
}
break;
}
}
b->p = p;
return m; // Return MinMax Value
}
αβを実行する前に、minmaxで有望な手を検索の順番の前に出す為に使っています。
/***************************************
オセロミニマックス処理
*****************************************/
#include "Othello.h"
extern short depth;
extern short ManC;
extern Board temp;
short MinMax( short level, Board *b )
{
short m;
List *p;
if( level ) {
if( (m=Search(b)) == 0 ) { // End Check
temp = *b;
temp.color *= -1;
if( Search( &temp ) == 0 ) return SetMatch( b ); // End Process
}
}
if( level == depth ) return SetValue( b, m ); // Depth Check & Process
for(;;) {
*(b+1) = *b; // Move Create
Move( b+1 ); // Move Process
b->p->value = MinMax( level+1, b+1 ); // MinMax
b->p++; // Next Pass
if( b->p->move == End ) { // List End Check
p = b->p = b->list;
m = b->p->value;
if( b->color == ManC ) { // Min Process
for(;;) {
if( b->p->move == End ) break;
if( b->p->value < m ) {
m = b->p->value;
p = b->p;
}
b->p++;
}
}
else { // Max Process
for(;;) {
if( b->p->move == End ) break;
if( b->p->value > m ) {
m = b->p->value;
p = b->p;
}
b->p++;
}
}
break;
}
}
b->p = p;
return m; // Return MinMax Value
}
2004年05月29日
man.c
/***************************************
オセロ人間処理
*****************************************/
#include "othello.h"
extern short ch;
short Man(int pos, Board * b)
{
//TODO この下にコードを追加してください
List *p;
p = b->list;
if( p->move == End ) return p->move;
for(;;) {
if( p->move == End ) break;
if( p->move == pos ) {
b->p = p;
break;
}
p++;
}
if( p->move == End ) return -100;
SetStandardMove( ch, p->move );
return p->move;
}
オセロ人間処理
*****************************************/
#include "othello.h"
extern short ch;
short Man(int pos, Board * b)
{
//TODO この下にコードを追加してください
List *p;
p = b->list;
if( p->move == End ) return p->move;
for(;;) {
if( p->move == End ) break;
if( p->move == pos ) {
b->p = p;
break;
}
p++;
}
if( p->move == End ) return -100;
SetStandardMove( ch, p->move );
return p->move;
}