📄 renju.c
字号:
{
mode =(unsigned char) (connect_result>>4)&0xf;
ret_value += mode_value[mode];
switch((connect_result>>18)&3)
{
case 3: ret_value |= 0x8000; multi++; break;
case 2: ret_value |= 0x4000; multi++; break;
case 1: if( chess_object->level != 1 && chess_object->particular == 1 )
{ //handle particular case:o+o+o+o
ret_value |= 0x2000; //
chess_object->particular = 0;
}
multi ++;
break;
default:
if(mode<=5) multi++;
}
}
if(connect_result&0x10000000l)
{
mode =(unsigned char) connect_result&0xf;
ret_value += mode_value[mode];
switch((connect_result>>16)&3)
{
case 3: ret_value |= 0x8000; multi++; break;
case 2: ret_value |= 0x4000; multi++; break;
case 1: if( chess_object->level != 1 && chess_object->particular == 1 )
{ //handle particular case:o+o+o+o
ret_value |= 0x2000; //
chess_object->particular = 0;
}
multi ++;
break;
default:
if(mode<=5) multi++;
}
}
if(multi>=2) ret_value |= 0x2000;
return ret_value;
}
static unsigned long Renju_Connect(unsigned short int x, unsigned short int y, unsigned char who)
{
CALOG_ENT(); //added by calog
unsigned char enemy;
short int i, j, left, right;
unsigned long board_pattern, pattern_temp, ret_value;
if(chess_object->map[y][x]!=0)
return 0x08000000l;
chess_object->map[y][x]=who;
enemy = (who==MAN)? MACHINE : MAN; /* enemy = (~who) & 3; */
ret_value = 0l;
// Up <-> Down
pattern_temp = 0;
for(j=y-1,right=0;j>=0&&right<4;right++,j--)
if(chess_object->map[j][x]==enemy) break;
if(j>=0&&chess_object->map[j][x]!=enemy)
{
if(chess_object->map[j][x]==who)
pattern_temp |= 0xc000;
else
pattern_temp |= 0x8000;
}
for(j=y+1,left=0;j<CHESS_LEN_Y&&left<4;left++,j++)
if(chess_object->map[j][x]==enemy) break;
if(j<CHESS_LEN_Y&&chess_object->map[j][x]!=enemy)
{
if(chess_object->map[j][x]==who)
pattern_temp |= 0x3000;
else
pattern_temp |= 0x2000;
}
if(right+left+1>=5)
{
ret_value |= 0x80000000l;
board_pattern = 0;
for(j=y-right;j<=y+left;j++)
{
board_pattern <<= 1;
if(chess_object->map[j][x]==who) board_pattern |= 1;
}
board_pattern |= pattern_temp;
i =(short int) Renju_ConnectSub((unsigned char)left, (unsigned char)right, (unsigned short int)board_pattern);
if(i&0x10)
ret_value &= 0x7fffffffl;
else
{
if(i&0x80)
ret_value |= 0x00c00000l;
else if(i&0x40)
ret_value |= 0x00800000l;
else if(i&0x20)
ret_value |= 0x00400000l;
ret_value |= (((unsigned long)i)&0xf)<<12;
}
}
// Up.right <-> Down.left
pattern_temp = 0;
for(i=x-1,j=y+1,right=0;i>=0&&j<CHESS_LEN_Y&&right<4;right++,i--,j++)
if(chess_object->map[j][i]==enemy) break;
if(i>=0&&j<CHESS_LEN_Y&&chess_object->map[j][i]!=enemy)
{
if(chess_object->map[j][i]==who)
pattern_temp |= 0xc000;
else
pattern_temp |= 0x8000;
}
for(i=x+1,j=y-1,left=0;i<CHESS_LEN_X&&j>=0&&left<4;left++,i++,j--)
if(chess_object->map[j][i]==enemy) break;
if(i<CHESS_LEN_X&&j>=0&&chess_object->map[j][i]!=enemy)
{
if(chess_object->map[j][i]==who)
pattern_temp |= 0x3000;
else
pattern_temp |= 0x2000;
}
if(right+left+1>=5)
{
ret_value |= 0x40000000l;
board_pattern = 0;
for(i=x-right,j=y+right;i<=x+left;i++,j--)
{
board_pattern <<= 1;
if(chess_object->map[j][i]==who) board_pattern |= 1;
}
board_pattern |= pattern_temp;
i =(short int) Renju_ConnectSub((unsigned char)left, (unsigned char)right, (unsigned short int)board_pattern);
if(i&0x10)
ret_value &= 0xbfffffffl;
else
{
if(i&0x80)
ret_value |= 0x00300000l;
else if(i&0x40)
ret_value |= 0x00200000l;
else if(i&0x20)
ret_value |= 0x00100000l;
ret_value |= (((unsigned long)i)&0xf)<<8;
}
}
// right <-> left
pattern_temp = 0;
for(i=x-1,right=0;i>=0&&right<4;right++,i--)
if(chess_object->map[y][i]==enemy) break;
if(i>=0&&chess_object->map[y][i]!=enemy)
{
if(chess_object->map[y][i]==who)
pattern_temp |= 0xc000;
else
pattern_temp |= 0x8000;
}
for(i=x+1,left=0;i<CHESS_LEN_X&&left<4;left++,i++)
if(chess_object->map[y][i]==enemy) break;
if(i<CHESS_LEN_X&&chess_object->map[y][i]!=enemy)
{
if(chess_object->map[y][i]==who)
pattern_temp |= 0x3000;
else
pattern_temp |= 0x2000;
}
if(right+left+1>=5)
{
ret_value |= 0x20000000l;
board_pattern = 0;
for(i=x-right;i<=x+left;i++)
{
board_pattern <<= 1;
if(chess_object->map[y][i]==who) board_pattern |= 1;
}
board_pattern |= pattern_temp;
i =(short int) Renju_ConnectSub((unsigned char)left, (unsigned char)right, (unsigned short int)board_pattern);
if(i&0x10)
ret_value &= 0xdfffffffl;
else
{
if(i&0x80)
ret_value |= 0x000c0000l;
else if(i&0x40)
ret_value |= 0x00080000l;
else if(i&0x20)
ret_value |= 0x00040000l;
ret_value |= (i&0xf)<<4;
}
}
// Down.right <-> Up.left
pattern_temp = 0;
for(i=x-1,j=y-1,right=0;i>=0&&j>=0&&right<4;right++,i--,j--)
if(chess_object->map[j][i]==enemy) break;
if(i>=0&&j>=0&&chess_object->map[j][i]!=enemy)
{
if(chess_object->map[j][i]==who)
pattern_temp |= 0xc000;
else
pattern_temp |= 0x8000;
}
for(i=x+1,j=y+1,left=0;i<CHESS_LEN_X&&j<CHESS_LEN_Y&&left<4;left++,i++,j++)
if(chess_object->map[j][i]==enemy) break;
if(i<CHESS_LEN_X&&j<CHESS_LEN_Y&&chess_object->map[j][i]!=enemy)
{
if(chess_object->map[j][i]==who)
pattern_temp |= 0x3000;
else
pattern_temp |= 0x2000;
}
if(right+left+1>=5)
{
ret_value |= 0x10000000l;
board_pattern = 0;
for(i=x-right,j=y-right;i<=x+left;i++,j++)
{
board_pattern <<= 1;
if(chess_object->map[j][i]==who) board_pattern |= 1;
}
board_pattern |= pattern_temp;
i =(short int) Renju_ConnectSub((unsigned char)left, (unsigned char)right, (unsigned short int)board_pattern);
if(i&0x10)
ret_value &= 0xefffffffl;
else
{
if(i&0x80)
ret_value |= 0x00030000l;
else if(i&0x40)
ret_value |= 0x00020000l;
else if(i&0x20)
ret_value |= 0x00010000l;
ret_value |= i&0xf;
}
}
chess_object->map[y][x]=0;
return ret_value;
}
static unsigned char Renju_ConnectSub(unsigned char left, unsigned char right, unsigned short int board_pattern)
{
CALOG_ENT(); //added by calog
static const unsigned char connect_pattern[]=
{
0x1f, // 5 -- 1 [0]
0x0f, 0x17, 0x1b, 0x1d, 0x1e, // 4 -- 5 [ 1] ~ [ 5]
0x07, 0x0b, 0x0d, 0x0e, // 3 -- 4 [ 6] ~ [ 9]
0x03, 0x05, 0x06, // 2 -- 2 [10] ~ [12]
0x5d
};
short int i, j;
unsigned char begin, end;
unsigned short int temp;
if( chess_object->level != 1 )
{
temp = board_pattern & 0x00ff;
if( temp == 0x005d || temp == 0xdd || temp == 0xba || temp == 0xbb )
{
chess_object->particular = 1;
return 0x2d;
}
}
begin = 0; end = left + right - 4; // Pattern 0 ~ 5
for(j=0; j<=5; j++)
{
for(i=begin;i<=end;i++)
{
temp = connect_pattern[j] << i;
if((board_pattern&temp) == temp)
{
if(i-1<0 || i>left+right-4)
temp = 0;
else if(board_pattern&(0x21<<(i-1)))
temp = 0;
else
temp = 0x40;
break;
}
}
if(i<=end) break;
}
if(j==0)
return 0x80;
else if(j<=5)
return j | temp;
if(left>3) begin++; if(right>3) end--; end++;// Pattern 6 ~ 9
for(j=6; j<=9; j++)
{
for(i=begin;i<=end;i++)
{
temp = connect_pattern[j] << i;
if((board_pattern&temp) == temp)
{
if(i-1<0 || i>left+right-4)
temp = 0;
else if(board_pattern&(0x21<<(i-1)))
temp = 0;
else
temp = 0x20;
break;
}
}
if(i<=end) break;
}
if(j<=9) return j | temp;
if(left>2) begin++; if(right>2) end--; end++;// Pattern 10 ~ 12
for(j=10; j<=12; j++)
{
for(i=begin;i<=end;i++)
{
temp = connect_pattern[j] << i;
if((board_pattern&temp) == temp) break;
}
if(i<=end) break;
}
if(j<=12) return (unsigned char)j;
return 0x1f;
}
/************************************************************************
功能说明: 产生一个0-max之间的随机整数.
接口说明:
调用格式: short rand(short max)
参数说明:
max 一个整数,产生的随机数的最大值不能超过max.
输出说明: 返回产生的随机数.
数据说明:
函数调用: 无
*************************************************************************/
int Renju_rndom(int max)
{
CALOG_ENT(); //added by calog
static long a=100001L;
int rand_number;
float b,x,t1=0.0;
//GetDateTime(&SystemTime);
//rand_number=SystemTime.tm_sec;
//t1=(float)rand_number/60L;
a = ( a * 125 ) % 2796203L;
b = ( float ) a / 2796203L;
b = b + t1;
x = b - ( short ) b;
rand_number = ( unsigned short )( x * ( max ) );
return rand_number;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -