blob: 94d737a5bb135712c9beb380a55f449fdd665e36 [file] [log] [blame]
#include "globals.h"
//#################################################################
// Give all the positions for this PLAYER which are symmetrical
// to the position (ROW, COL) a value of VALUE.
//#################################################################
static void
set_position_value(s32bit player, s32bit row, s32bit col, s32bit value)
{
s32bit num_rows, num_cols;
num_rows = g_board_size[player] + 1;
num_cols = g_board_size[player^PLAYER_MASK];
//printf("1 - %d %d %d\n", player, row, col);
g_first_move[player][row][col] = value;
//printf("2 - %d %d %d\n", player, num_rows-row, col);
g_first_move[player][num_rows-row][col] = value;
//printf("3 - %d %d %d\n", player, num_rows-row, num_cols-col);
g_first_move[player][num_rows-row][num_cols-col] = value;
// printf("4 - %d %d %d\n", player, row, num_cols-col);
g_first_move[player][row][num_cols-col] = value;
}
#ifdef DYNAMIC_POSITION_VALUES
//#################################################################
// If we are using dynamic position values then these are the
// functions (and variables) which we use to set these values.
//#################################################################
//=================================================================
// Variable to keep track of value we will give to the next position.
//=================================================================
static s32bit set_move_value_current = 127;
//=================================================================
// Initialize all positions with a value of 0
//=================================================================
extern void
init_move_value ()
{
s32bit i, j, k;
set_move_value_current = 127;
for(i = 0; i < 2; i++)
for(j = 0; j < 32; j++)
for(k = 0; k < 32; k++)
g_first_move[i][j][k] = 0;
}
//=================================================================
// Set the value of the positions symetrical to MOVE.
// return 0 if these positions already have a value, otherwise 1.
//=================================================================
extern s32bit
set_move_value (Move move, s32bit player)
{
if(g_first_move[player][move.array_index][move.mask_index] != 0)
return 0;
set_position_value(player, move.array_index, move.mask_index,
set_move_value_current--);
return 1;
}
//=================================================================
// UnSet the value of the positions symetrical to MOVE.
// Shouldn't be called if when 'set' was called it returned a value of 0.
//=================================================================
extern void
unset_move_value (Move move, s32bit player)
{
set_move_value_current
= g_first_move[player][move.array_index][move.mask_index];
set_position_value(player, move.array_index, move.mask_index, 0);
}
#else
//#################################################################
// If we are using dynamic position values then these are the
// functions which we use to set these values.
//#################################################################
//=================================================================
// Set the value of all the positions on the board.
// We only do this once at the start of the search.
//=================================================================
extern void
set_position_values()
{
s32bit i, j, k, count;
// set them all to zero.
for(i = 0; i < 2; i++)
for(j = 0; j < 32; j++)
for(k = 0; k < 32; k++)
g_first_move[i][j][k] = 0;
#if 0
// Set values using very simple scheme.
for(i = 0; i < 2; i++){
count = 64;
for(j = 1; j < (g_board_size[i]+3)/2; j++){
for(k = 1; k < (g_board_size[i^PLAYER_MASK]/2)+1; k++){
if(g_first_move[i][j][k] == 0)
set_position_value(i, j, k, --count);
}
}
}
#elif 1
// Set values using a more complex (seems to be better) scheme.
for(i = 0; i < 2; i++){
count = 127;
for(j = 2; j < (g_board_size[i]+3)/2; j+=2){
for(k = 1; k < (g_board_size[i^PLAYER_MASK]/2)+1; k+=2){
set_position_value(i, j, k, --count);
}
}
}
for(i = 0; i < 2; i++){
count = 90;
for(j = 2; j < (g_board_size[i]+3)/2; j+=2){
for(k = 1; k < (g_board_size[i^PLAYER_MASK]/2)+1; k++){
if(g_first_move[i][j][k] == 0)
set_position_value(i, j, k, --count);
}
}
}
for(i = 0; i < 2; i++){
count = 70;
for(j = 3; j < (g_board_size[i]+3)/2; j++){
for(k = 1; k < (g_board_size[i^PLAYER_MASK]/2)+1; k+=2){
if(g_first_move[i][j][k] == 0)
set_position_value(i, j, k, --count);
}
}
}
for(i = 0; i < 2; i++){
count = 50;
for(j = 3; j < (g_board_size[i]+3)/2; j++){
for(k = 1; k < (g_board_size[i^PLAYER_MASK]/2)+1; k++){
if(g_first_move[i][j][k] == 0)
set_position_value(i, j, k, --count);
}
}
}
for(i = 0; i < 2; i++){
count = 30;
for(j = 1; j < (g_board_size[i]+3)/2; j++){
for(k = 1; k < (g_board_size[i^PLAYER_MASK]/2)+1; k++){
if(g_first_move[i][j][k] == 0)
set_position_value(i, j, k, --count);
}
}
}
#endif
// print the values. (mostly for debugging)
#if 0
for(i = 0; i < 2; i++){
for(j = 0; j < 32; j++){
for(k = 0; k < 32; k++){
printf("%d ", g_first_move[i][j][k]);
}
printf("\n");
}
printf("\n");
}
exit(0);
#endif
}
#endif