/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
* 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 */
/* Only use even values for non-threat move reasons! */
#define ATTACK_MOVE_GOOD_KO 4
#define ATTACK_MOVE_BAD_KO 6
#define ATTACK_THREAT (ATTACK_MOVE | THREAT_BIT)
#define DEFEND_MOVE_GOOD_KO 10
#define DEFEND_MOVE_BAD_KO 12
#define DEFEND_THREAT (DEFEND_MOVE | THREAT_BIT)
#define SEMEAI_THREAT (SEMEAI_MOVE | THREAT_BIT)
#define EXPAND_TERRITORY_MOVE 20
#define EXPAND_MOYO_MOVE 22
#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
/* Bitmap values for move_reason.status */
#define TERRITORY_REDUNDANT 1
#define STRATEGICALLY_REDUNDANT 2
#define REDUNDANT (TERRITORY_REDUNDANT | STRATEGICALLY_REDUNDANT)
#define MAX_TRACE_LENGTH 160
#define HUGE_MOVE_VALUE 10.0*MAX_BOARD*MAX_BOARD
int type
; /* e.g. attack, defend, or connect */
int what
; /* pointer into list of strings, list of pair of dragons,
int status
; /* This is a bitmap to mark redundant or secondary
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
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. */
* 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_ATTACK_THREATS 6
extern struct move_data move
[BOARDMAX
];
extern struct move_reason move_reasons
[MAX_MOVE_REASONS
];
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 */
extern Reason_set either_data
[MAX_EITHER
];
extern Reason_set all_data
[MAX_ALL
];
extern int eyes
[MAX_EYES
];
extern int eyecolor
[MAX_EYES
];
extern int lunch_dragon
[MAX_LUNCHES
]; /* eater */
extern int lunch_worm
[MAX_LUNCHES
]; /* food */
/* Point redistribution */
extern int replacement_map
[BOARDMAX
];
/* The color for which we are evaluating moves. */
extern int current_color
;
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
,
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
);