221 lines
7.7 KiB
C
221 lines
7.7 KiB
C
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
|
||
|
* This is GNU Go, a Go program. Contact gnugo@gnu.org, or see *
|
||
|
* http://www.gnu.org/software/gnugo/ for more information. *
|
||
|
* *
|
||
|
* Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, *
|
||
|
* 2008 and 2009 by the Free Software Foundation. *
|
||
|
* *
|
||
|
* This program is free software; you can redistribute it and/or *
|
||
|
* modify it under the terms of the GNU General Public License as *
|
||
|
* published by the Free Software Foundation - version 3 or *
|
||
|
* (at your option) any later version. *
|
||
|
* *
|
||
|
* This program is distributed in the hope that it will be useful, *
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||
|
* GNU General Public License in file COPYING for more details. *
|
||
|
* *
|
||
|
* You should have received a copy of the GNU General Public *
|
||
|
* License along with this program; if not, write to the Free *
|
||
|
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
|
||
|
* Boston, MA 02111, USA. *
|
||
|
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||
|
|
||
|
/* values for move_reason.type */
|
||
|
#define THREAT_BIT 1
|
||
|
|
||
|
/* Only use even values for non-threat move reasons! */
|
||
|
#define ATTACK_MOVE 2
|
||
|
#define ATTACK_MOVE_GOOD_KO 4
|
||
|
#define ATTACK_MOVE_BAD_KO 6
|
||
|
#define ATTACK_THREAT (ATTACK_MOVE | THREAT_BIT)
|
||
|
#define DEFEND_MOVE 8
|
||
|
#define DEFEND_MOVE_GOOD_KO 10
|
||
|
#define DEFEND_MOVE_BAD_KO 12
|
||
|
#define DEFEND_THREAT (DEFEND_MOVE | THREAT_BIT)
|
||
|
|
||
|
#define CONNECT_MOVE 14
|
||
|
#define CUT_MOVE 16
|
||
|
|
||
|
#define SEMEAI_MOVE 18
|
||
|
#define SEMEAI_THREAT (SEMEAI_MOVE | THREAT_BIT)
|
||
|
|
||
|
#define EXPAND_TERRITORY_MOVE 20
|
||
|
#define EXPAND_MOYO_MOVE 22
|
||
|
#define INVASION_MOVE 24
|
||
|
|
||
|
#define OWL_ATTACK_MOVE 26
|
||
|
#define OWL_ATTACK_MOVE_GOOD_KO 28
|
||
|
#define OWL_ATTACK_MOVE_BAD_KO 30
|
||
|
#define OWL_ATTACK_THREAT (OWL_ATTACK_MOVE | THREAT_BIT)
|
||
|
#define OWL_DEFEND_MOVE 32
|
||
|
#define OWL_DEFEND_MOVE_GOOD_KO 34
|
||
|
#define OWL_DEFEND_MOVE_BAD_KO 36
|
||
|
#define OWL_DEFEND_THREAT (OWL_DEFEND_MOVE | THREAT_BIT)
|
||
|
#define OWL_PREVENT_THREAT 38
|
||
|
#define UNCERTAIN_OWL_ATTACK 40
|
||
|
#define UNCERTAIN_OWL_DEFENSE 42
|
||
|
#define STRATEGIC_ATTACK_MOVE 44
|
||
|
#define STRATEGIC_DEFEND_MOVE 46
|
||
|
|
||
|
#define MY_ATARI_ATARI_MOVE 50
|
||
|
#define YOUR_ATARI_ATARI_MOVE 52
|
||
|
#define VITAL_EYE_MOVE 54
|
||
|
|
||
|
#define OWL_ATTACK_MOVE_GAIN 60
|
||
|
#define OWL_DEFEND_MOVE_LOSS 62
|
||
|
#define POTENTIAL_SEMEAI_ATTACK 64
|
||
|
#define POTENTIAL_SEMEAI_DEFENSE 66
|
||
|
|
||
|
#define ANTISUJI_MOVE 70
|
||
|
|
||
|
#define EITHER_MOVE 100
|
||
|
#define ALL_MOVE 102
|
||
|
|
||
|
|
||
|
/* Bitmap values for move_reason.status */
|
||
|
#define ACTIVE 0
|
||
|
#define TERRITORY_REDUNDANT 1
|
||
|
#define STRATEGICALLY_REDUNDANT 2
|
||
|
#define REDUNDANT (TERRITORY_REDUNDANT | STRATEGICALLY_REDUNDANT)
|
||
|
#define SECONDARY 4
|
||
|
|
||
|
#define MAX_REASONS 120
|
||
|
|
||
|
#define MAX_TRACE_LENGTH 160
|
||
|
|
||
|
#define HUGE_MOVE_VALUE 10.0*MAX_BOARD*MAX_BOARD
|
||
|
|
||
|
struct move_reason {
|
||
|
int type; /* e.g. attack, defend, or connect */
|
||
|
int what; /* pointer into list of strings, list of pair of dragons,
|
||
|
or similar */
|
||
|
int status; /* This is a bitmap to mark redundant or secondary
|
||
|
move reasons. */
|
||
|
};
|
||
|
|
||
|
struct move_data {
|
||
|
float value; /* total comparison value, computed at the very end */
|
||
|
float final_value; /* value after point redistribution. */
|
||
|
float additional_ko_value; /* Additional threat value if ko fight going on.*/
|
||
|
|
||
|
float territorial_value; /* Value in terms of actual profit. */
|
||
|
float strategical_value; /* Value with respect to strength, weakness, and
|
||
|
safety of all groups on the board. */
|
||
|
|
||
|
float maxpos_shape; /* Maximal positive contribution to shape */
|
||
|
float maxneg_shape; /* Maximal negative contribution to shape */
|
||
|
int numpos_shape; /* Number of positive contributions to shape */
|
||
|
int numneg_shape; /* Number of negative contributions to shape */
|
||
|
|
||
|
float followup_value; /* Value of followup move (our sente). */
|
||
|
float influence_followup_value; /* Followup value of move as reported by
|
||
|
experimental influence. */
|
||
|
float reverse_followup_value; /* Value of opponents followup move
|
||
|
(reverse sente). */
|
||
|
float secondary_value; /* Secondary move value. */
|
||
|
float min_value; /* Minimum allowed value for the move. */
|
||
|
float max_value; /* Maximum allowed value for the move. */
|
||
|
float min_territory; /* Minimum territorial value. */
|
||
|
float max_territory; /* Maximum territorial value. */
|
||
|
float randomness_scaling; /* Increase to randomize this move. */
|
||
|
|
||
|
int reason[MAX_REASONS]; /* List of reasons for a move. */
|
||
|
int move_safety; /* Whether the move seems safe. */
|
||
|
int worthwhile_threat; /* Play this move as a pure threat. */
|
||
|
float random_number; /* Random number connected to this move. */
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Some sizes.
|
||
|
*
|
||
|
* FIXME: Many of these could be optimized more for size (e.g. MAX_EYES)
|
||
|
*/
|
||
|
|
||
|
#define MAX_MOVE_REASONS 1000
|
||
|
#define MAX_WORMS 2*MAX_BOARD*MAX_BOARD/3
|
||
|
#define MAX_DRAGONS MAX_WORMS
|
||
|
#define MAX_CONNECTIONS 4*MAX_WORMS
|
||
|
#define MAX_POTENTIAL_SEMEAI 50
|
||
|
#define MAX_EYES MAX_BOARD*MAX_BOARD/2
|
||
|
#define MAX_LUNCHES MAX_WORMS
|
||
|
#define MAX_EITHER 100
|
||
|
#define MAX_ALL 100
|
||
|
#define MAX_ATTACK_THREATS 6
|
||
|
|
||
|
|
||
|
extern struct move_data move[BOARDMAX];
|
||
|
extern struct move_reason move_reasons[MAX_MOVE_REASONS];
|
||
|
extern int next_reason;
|
||
|
|
||
|
/* Connections */
|
||
|
extern int conn_worm1[MAX_CONNECTIONS];
|
||
|
extern int conn_worm2[MAX_CONNECTIONS];
|
||
|
extern int next_connection;
|
||
|
|
||
|
extern int semeai_target1[MAX_POTENTIAL_SEMEAI];
|
||
|
extern int semeai_target2[MAX_POTENTIAL_SEMEAI];
|
||
|
|
||
|
/* Unordered sets (currently pairs) of move reasons / targets */
|
||
|
typedef struct {
|
||
|
int reason1;
|
||
|
int what1;
|
||
|
int reason2;
|
||
|
int what2;
|
||
|
} Reason_set;
|
||
|
extern Reason_set either_data[MAX_EITHER];
|
||
|
extern int next_either;
|
||
|
extern Reason_set all_data[MAX_ALL];
|
||
|
extern int next_all;
|
||
|
|
||
|
/* Eye shapes */
|
||
|
extern int eyes[MAX_EYES];
|
||
|
extern int eyecolor[MAX_EYES];
|
||
|
extern int next_eye;
|
||
|
|
||
|
/* Lunches */
|
||
|
extern int lunch_dragon[MAX_LUNCHES]; /* eater */
|
||
|
extern int lunch_worm[MAX_LUNCHES]; /* food */
|
||
|
extern int next_lunch;
|
||
|
|
||
|
/* Point redistribution */
|
||
|
extern int replacement_map[BOARDMAX];
|
||
|
|
||
|
/* The color for which we are evaluating moves. */
|
||
|
extern int current_color;
|
||
|
|
||
|
int find_worm(int str);
|
||
|
int find_dragon(int str);
|
||
|
|
||
|
int move_reason_known(int pos, int type, int what);
|
||
|
int attack_move_reason_known(int pos, int what);
|
||
|
int defense_move_reason_known(int pos, int what);
|
||
|
int owl_attack_move_reason_known(int pos, int what);
|
||
|
int owl_defense_move_reason_known(int pos, int what);
|
||
|
int owl_move_reason_known(int pos, int what);
|
||
|
int semeai_move_reason_known(int pos, int what);
|
||
|
int get_biggest_owl_target(int pos);
|
||
|
int is_antisuji_move(int pos);
|
||
|
|
||
|
void discard_redundant_move_reasons(int pos);
|
||
|
|
||
|
void mark_changed_dragon(int pos, int color, int affected, int affected2,
|
||
|
int move_reason_type,
|
||
|
signed char safe_stones[BOARDMAX],
|
||
|
float strength[BOARDMAX], float *effective_size);
|
||
|
void mark_changed_string(int affected, signed char changed_stones[BOARDMAX],
|
||
|
float strength[BOARDMAX], signed char new_status);
|
||
|
int adjacent_to_nondead_stone(int pos, int color);
|
||
|
|
||
|
int find_connection(int worm1, int worm2);
|
||
|
|
||
|
/*
|
||
|
* Local Variables:
|
||
|
* tab-width: 8
|
||
|
* c-basic-offset: 2
|
||
|
* End:
|
||
|
*/
|
||
|
|