gnugo-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnugo-devel] Patch: Internals of dragon.c made 1-dimensional


From: Inge Wallin
Subject: [gnugo-devel] Patch: Internals of dragon.c made 1-dimensional
Date: Mon, 15 Oct 2001 21:23:24 +0200 (MET DST)

In the ongoing series "making all of the GnuGo engine 1-dimensional",
here is todays part: the code within dragon.c

And I still think all of the files with '?' in front of them should be
put into .cvsignore (and gnugo.6 as well).

        -Inge

? config.log
? Makefile
? config.status
? config.h
? stamp-h
? doc/Makefile
? doc/gnugo.info
? engine/Makefile
? engine/.deps
? engine/dragon.c.save
? engine/dragon.c.save2
? interface/Makefile
? interface/.deps
? interface/gnugo
? interface/debugboard/Makefile
? interface/debugboard/.deps
? interface/debugboard/debugboard
? patterns/Makefile
? patterns/.deps
? patterns/joseki
? patterns/mkeyes
? patterns/mkpat
? patterns/eyes.c
? patterns/influence.c
? patterns/barriers.c
? patterns/endgame.c
? patterns/owl_attackpat.c
? patterns/owl_vital_apat.c
? patterns/owl_defendpat.c
? patterns/fusekipat.c
? patterns/fuseki9.c
? patterns/fuseki13.c
? patterns/fuseki19.c
? patterns/hoshi.db
? patterns/komoku.db
? patterns/sansan.db
? patterns/mokuhazushi.db
? patterns/takamoku.db
? patterns/conn.c
? patterns/patterns.c
? patterns/apatterns.c
? patterns/dpatterns.c
? patterns/josekidb.c
? patterns/extract_fuseki
? patterns/sta00915
? patterns/sta00921
? regression/Makefile
? sgf/Makefile
? sgf/.deps
? sgf/sgfgen
? utils/Makefile
? utils/.deps
Index: engine/dragon.c
===================================================================
RCS file: /cvsroot/gnugo/gnugo/engine/dragon.c,v
retrieving revision 1.22
diff -u -r1.22 dragon.c
--- engine/dragon.c     2001/10/12 20:35:25     1.22
+++ engine/dragon.c     2001/10/15 19:13:37
@@ -33,10 +33,10 @@
 static void find_neighbor_dragons(void);
 static void add_adjacent_dragons(int a, int b);
 static void add_adjacent_dragon(int a, int b);
-static int dragon_invincible(int m, int n);
+static int dragon_invincible(int pos);
 static int compute_dragon_status(int pos);
 static void dragon_eye(int pos, struct eye_data[BOARDMAX]);
-static int compute_escape(int m, int n, int dragon_status_known);
+static int compute_escape(int pos, int dragon_status_known);
 
 static int dragon2_initialized;
 static int lively_white_dragons;
@@ -56,7 +56,9 @@
 make_dragons(int color, int stop_before_owl)
 {
   int m, n;
+  int ii;
   int i, j;
+  int dr;
   int d;
 
   start_timer(2);
@@ -68,27 +70,29 @@
 
   for (m = 0; m < board_size; m++)
     for (n = 0; n < board_size; n++) {
-      dragon[POS(m, n)].id                 = -1;
-      dragon[POS(m, n)].size               = worm[POS(m, n)].size;
-      dragon[POS(m, n)].effective_size     = worm[POS(m, n)].effective_size;
-      dragon[POS(m, n)].color              = worm[POS(m, n)].color;
-      dragon[POS(m, n)].origin             = worm[POS(m, n)].origin;
-      dragon[POS(m, n)].owl_attack_point   = NO_MOVE;
-      dragon[POS(m, n)].owl_attack_certain =  1;
-      dragon[POS(m, n)].owl_defense_point  = NO_MOVE;
-      dragon[POS(m, n)].owl_defend_certain =  1;
-      dragon[POS(m, n)].owl_status         = UNCHECKED;
-      dragon[POS(m, n)].status             = UNKNOWN;
-      dragon[POS(m, n)].matcher_status     = UNKNOWN;
-      dragon[POS(m, n)].owl_threat_status  = UNCHECKED;
-      dragon[POS(m, n)].owl_second_attack_point  = NO_MOVE;
-      dragon[POS(m, n)].owl_second_defense_point = NO_MOVE;
-      half_eye[POS(m, n)].type        =  0;
+      ii = POS(m, n);
+
+      dragon[ii].id                 = -1;
+      dragon[ii].size               = worm[ii].size;
+      dragon[ii].effective_size     = worm[ii].effective_size;
+      dragon[ii].color              = worm[ii].color;
+      dragon[ii].origin             = worm[ii].origin;
+      dragon[ii].owl_attack_point   = NO_MOVE;
+      dragon[ii].owl_attack_certain =  1;
+      dragon[ii].owl_defense_point  = NO_MOVE;
+      dragon[ii].owl_defend_certain =  1;
+      dragon[ii].owl_status         = UNCHECKED;
+      dragon[ii].status             = UNKNOWN;
+      dragon[ii].matcher_status     = UNKNOWN;
+      dragon[ii].owl_threat_status  = UNCHECKED;
+      dragon[ii].owl_second_attack_point  = NO_MOVE;
+      dragon[ii].owl_second_defense_point = NO_MOVE;
+      half_eye[ii].type        =  0;
       
-      if (worm[POS(m, n)].origin == POS(m, n))
+      if (worm[ii].origin == ii)
        DEBUG(DEBUG_DRAGONS, 
              "Initialising dragon from worm at %1m, size %d\n", 
-             POS(m, n), worm[POS(m, n)].size);
+             ii, worm[ii].size);
     }
 
   time_report(2, "  time to initialize dragons", -1, -1, 1.0);
@@ -108,38 +112,39 @@
    */
   for (m = 0; m < board_size; m++)
     for (n = 0; n < board_size; n++) {
+      ii = POS(m, n);
 
-      if (black_eye[POS(m, n)].color == BLACK_BORDER
-         && black_eye[POS(m, n)].origin == POS(m, n)) {
-       if (!is_ko_point(POS(m, n))
-          || black_eye[POS(m, n)].esize > 1) /* Only exclude living kos. */
-         dragon_eye(POS(m, n), black_eye);
+      if (black_eye[ii].color == BLACK_BORDER
+         && black_eye[ii].origin == ii) {
+       if (!is_ko_point(ii)
+          || black_eye[ii].esize > 1) /* Only exclude living kos. */
+         dragon_eye(ii, black_eye);
        else {
-         if (m > 0 && !is_ko_point(POS(m-1, n)))
-           black_eye[POS(m, n)].dragon = dragon[POS(m-1, n)].origin;
-         else if (m < board_size-1 && !is_ko_point(POS(m+1, n)))
-           black_eye[POS(m, n)].dragon = dragon[POS(m+1, n)].origin;
-         else if (n > 0 && !is_ko_point(POS(m, n-1)))
-           black_eye[POS(m, n)].dragon = dragon[POS(m, n-1)].origin;
-         else if (n < board_size-1 && !is_ko_point(POS(m, n+1)))
-           black_eye[POS(m, n)].dragon = dragon[POS(m, n+1)].origin;
+         if (m > 0 && !is_ko_point(ii-NS))
+           black_eye[ii].dragon = dragon[ii-NS].origin;
+         else if (m < board_size-1 && !is_ko_point(ii+NS))
+           black_eye[ii].dragon = dragon[ii+NS].origin;
+         else if (n > 0 && !is_ko_point(ii-1))
+           black_eye[ii].dragon = dragon[ii-1].origin;
+         else if (n < board_size-1 && !is_ko_point(ii+1))
+           black_eye[ii].dragon = dragon[ii+1].origin;
        }
       }
          
-      if (white_eye[POS(m, n)].color == WHITE_BORDER
-         && white_eye[POS(m, n)].origin == POS(m, n)) {
-       if (!is_ko_point(POS(m, n))
-           || white_eye[POS(m, n)].esize > 1) /* Only exclude living kos. */
-         dragon_eye(POS(m, n), white_eye);
+      if (white_eye[ii].color == WHITE_BORDER
+         && white_eye[ii].origin == ii) {
+       if (!is_ko_point(ii)
+           || white_eye[ii].esize > 1) /* Only exclude living kos. */
+         dragon_eye(ii, white_eye);
        else {
-         if (m > 0 && !is_ko_point(POS(m-1, n)))
-           white_eye[POS(m, n)].dragon = dragon[POS(m-1, n)].origin;
-         else if (m < board_size-1 && !is_ko_point(POS(m+1, n)))
-           white_eye[POS(m, n)].dragon = dragon[POS(m+1, n)].origin;
-         else if (n > 0 && !is_ko_point(POS(m, n-1)))
-           white_eye[POS(m, n)].dragon = dragon[POS(m, n-1)].origin;
-         else if (n < board_size-1 && !is_ko_point(POS(m, n+1)))
-           white_eye[POS(m, n)].dragon = dragon[POS(m, n+1)].origin;
+         if (m > 0 && !is_ko_point(ii-NS))
+           white_eye[ii].dragon = dragon[ii-NS].origin;
+         else if (m < board_size-1 && !is_ko_point(ii+NS))
+           white_eye[ii].dragon = dragon[ii+NS].origin;
+         else if (n > 0 && !is_ko_point(ii-1))
+           white_eye[ii].dragon = dragon[ii-1].origin;
+         else if (n < board_size-1 && !is_ko_point(ii+1))
+           white_eye[ii].dragon = dragon[ii+1].origin;
        }
       }
     }
@@ -156,12 +161,15 @@
   for (m = 0; m < board_size; m++)
     for (n = 0; n < board_size; n++) {
       int food;
-      if (worm[POS(m, n)].origin != POS(m, n)
-         || BOARD(m, n) == EMPTY
-         || worm[POS(m, n)].lunch == NO_MOVE)
+
+      ii = POS(m, n);
+
+      if (worm[ii].origin != ii
+         || board[ii] == EMPTY
+         || worm[ii].lunch == NO_MOVE)
        continue;
 
-      food = worm[POS(m, n)].lunch;
+      food = worm[ii].lunch;
 
       /* In contrast to worm lunches, a dragon lunch must also be
        * able to defend itself. 
@@ -171,13 +179,13 @@
 
       /* Tell the move generation code about the lunch. */
       if (IS_STONE(color))
-       add_lunch(POS(m, n), food);
+       add_lunch(ii, food);
        
       /* If several lunches are found, we pick the juiciest.
        * First maximize cutstone, then minimize liberties.
        */
       {
-       int origin = dragon[POS(m, n)].origin;
+       int origin = dragon[ii].origin;
        int lunch = DRAGON2(origin).lunch;
 
        if (lunch == NO_MOVE
@@ -186,7 +194,7 @@
                && (worm[food].liberties < worm[lunch].liberties))) {
          DRAGON2(origin).lunch = worm[food].origin;
          TRACE("at %1m setting %1m.lunch to %1m (cutstone=%d)\n",
-               POS(m, n), origin,
+               ii, origin,
                worm[food].origin, worm[food].cutstone);
        }
       }
@@ -197,14 +205,16 @@
   /* In case origins of dragons got moved, put the dragons of eyes aright. */
   for (i = 0; i < board_size; i++)
     for (j = 0; j < board_size; j++) {
-      if (black_eye[POS(i, j)].dragon != NO_MOVE) {
-       int dr = dragon[black_eye[POS(i, j)].dragon].origin;
-       black_eye[POS(i, j)].dragon = dr;
+      ii = POS(i, j);
+
+      if (black_eye[ii].dragon != NO_MOVE) {
+       int dr = dragon[black_eye[ii].dragon].origin;
+       black_eye[ii].dragon = dr;
       }
 
-      if (white_eye[POS(i, j)].dragon != NO_MOVE) {
-       int dr = dragon[white_eye[POS(i, j)].dragon].origin;
-         white_eye[POS(i, j)].dragon = dr;
+      if (white_eye[ii].dragon != NO_MOVE) {
+       int dr = dragon[white_eye[ii].dragon].origin;
+         white_eye[ii].dragon = dr;
       }
     }
   time_report(2, "  time to fix origins", -1, -1, 1.0);
@@ -221,39 +231,41 @@
       int aj = -1;
       int di = -1;
       int dj = -1;
+
+      ii = POS(m, n);
 
-      if (black_eye[POS(m, n)].color == BLACK_BORDER
-         && (!black_eye[POS(m, n)].marginal || life)
-         && black_eye[POS(m, n)].neighbors <= 1
-         && black_eye[POS(m, n)].dragon != NO_MOVE) {
-       sum = topological_eye(m, n, BLACK, &ai, &aj, &di, &dj,
+      if (black_eye[ii].color == BLACK_BORDER
+         && (!black_eye[ii].marginal || life)
+         && black_eye[ii].neighbors <= 1
+         && black_eye[ii].dragon != NO_MOVE) {
+       sum = topological_eye(I(ii), J(ii), BLACK, &ai, &aj, &di, &dj,
                              black_eye, white_eye, half_eye);
        if (sum >= 4) {
-         half_eye[POS(m, n)].type = FALSE_EYE;
-         if (black_eye[POS(m, n)].esize == 1
-             || is_legal(POS(m, n), WHITE)
-             || BOARD(m, n) == WHITE)
-           add_half_eye(m, n, black_eye, half_eye);
+         half_eye[ii].type = FALSE_EYE;
+         if (black_eye[ii].esize == 1
+             || is_legal(ii, WHITE)
+             || board[ii] == WHITE)
+           add_half_eye(I(ii), J(ii), black_eye, half_eye);
        }
        else if (sum == 3)
-         half_eye[POS(m, n)].type = HALF_EYE;
+         half_eye[ii].type = HALF_EYE;
       }
       
-      if (white_eye[POS(m, n)].color == WHITE_BORDER
-         && (!white_eye[POS(m, n)].marginal || life)
-         && white_eye[POS(m, n)].neighbors <= 1
-         && white_eye[POS(m, n)].dragon != NO_MOVE) {
-       sum = topological_eye(m, n, WHITE, &ai, &aj, &di, &dj,
+      if (white_eye[ii].color == WHITE_BORDER
+         && (!white_eye[ii].marginal || life)
+         && white_eye[ii].neighbors <= 1
+         && white_eye[ii].dragon != NO_MOVE) {
+       sum = topological_eye(I(ii), J(ii), WHITE, &ai, &aj, &di, &dj,
                              black_eye, white_eye, half_eye);
        if (sum >= 4) {
-         half_eye[POS(m, n)].type = FALSE_EYE;
-         if (white_eye[POS(m, n)].esize == 1
-             || is_legal(POS(m, n), BLACK)
+         half_eye[ii].type = FALSE_EYE;
+         if (white_eye[ii].esize == 1
+             || is_legal(ii, BLACK)
              || BOARD(m, n) == BLACK)
-           add_half_eye(m, n, white_eye, half_eye);
+           add_half_eye(I(ii), J(ii), white_eye, half_eye);
        }
        else if (sum == 3)
-         half_eye[POS(m, n)].type = HALF_EYE;
+         half_eye[ii].type = HALF_EYE;
       }
     }
 
@@ -265,36 +277,38 @@
   /* Compute the number of eyes, half eyes, etc. in an eye space. */
   for (i = 0; i < board_size; i++)
     for (j = 0; j < board_size; j++) {
-      if (black_eye[POS(i, j)].color == BLACK_BORDER
-         && black_eye[POS(i, j)].origin == POS(i, j))
+      ii = POS(i, j);
+
+      if (black_eye[ii].color == BLACK_BORDER
+         && black_eye[ii].origin == ii)
       {
        int max, min, attack_point, defense_point;
 
-       compute_eyes(POS(i, j), &max, &min, &attack_point,
-                    &defense_point, black_eye, half_eye, 1, color);
-       DEBUG(DEBUG_EYES, "Black eyespace at %m: min=%d, max=%d\n",
-             i, j, min, max);
-       black_eye[POS(i, j)].maxeye = max;
-       black_eye[POS(i, j)].mineye = min;
-       black_eye[POS(i, j)].attack_point = attack_point;
-       black_eye[POS(i, j)].defense_point = defense_point;
-       propagate_eye(POS(i, j), black_eye);
+       compute_eyes(ii, &max, &min, &attack_point, &defense_point, 
+                    black_eye, half_eye, 1, color);
+       DEBUG(DEBUG_EYES, "Black eyespace at %1m: min=%d, max=%d\n",
+             ii, min, max);
+       black_eye[ii].maxeye = max;
+       black_eye[ii].mineye = min;
+       black_eye[ii].attack_point = attack_point;
+       black_eye[ii].defense_point = defense_point;
+       propagate_eye(ii, black_eye);
       }
 
-      if (white_eye[POS(i, j)].color == WHITE_BORDER
-         && white_eye[POS(i, j)].origin == POS(i, j))
+      if (white_eye[ii].color == WHITE_BORDER
+         && white_eye[ii].origin == ii)
       {
        int max, min, attack_point, defense_point;
 
-       compute_eyes(POS(i, j), &max, &min, &attack_point,
-                    &defense_point, white_eye, half_eye, 1, color);
-       DEBUG(DEBUG_EYES, "White eyespace at %m: min=%d, max=%d\n",
-             i, j, min, max);
-       white_eye[POS(i, j)].maxeye = max;
-       white_eye[POS(i, j)].mineye = min;
-       white_eye[POS(i, j)].attack_point = attack_point;
-       white_eye[POS(i, j)].defense_point = defense_point;
-       propagate_eye(POS(i, j), white_eye);
+       compute_eyes(ii, &max, &min, &attack_point, &defense_point,
+                    white_eye, half_eye, 1, color);
+       DEBUG(DEBUG_EYES, "White eyespace at %1m: min=%d, max=%d\n",
+             ii, min, max);
+       white_eye[ii].maxeye = max;
+       white_eye[ii].mineye = min;
+       white_eye[ii].attack_point = attack_point;
+       white_eye[ii].defense_point = defense_point;
+       propagate_eye(ii, white_eye);
       }
     }
   time_report(2, "  time to find eyes", -1, -1, 1.0);
@@ -302,35 +316,35 @@
   /* Now we compute the genus. */
   for (i = 0; i < board_size; i++)
     for (j = 0; j < board_size; j++) {
-      if (black_eye[POS(i, j)].color == BLACK_BORDER
-         && black_eye[POS(i, j)].dragon != NO_MOVE
-         && black_eye[POS(i, j)].origin == POS(i, j))
+      int ii = POS(i, j);
+
+      if (black_eye[ii].color == BLACK_BORDER
+         && black_eye[ii].dragon != NO_MOVE
+         && black_eye[ii].origin == ii)
       {
-       m = I(black_eye[POS(i, j)].dragon);
-       n = J(black_eye[POS(i, j)].dragon);
-       gg_assert (BOARD(m, n) == BLACK);
+       dr = black_eye[ii].dragon;
+
+       gg_assert(board[dr] == BLACK);
        TRACE("eye at %1m found for dragon at %1m--augmenting genus\n",
-             POS(i, j), POS(m, n));
-       DRAGON2(POS(m, n)).genus += (black_eye[POS(i, j)].mineye);
-       DRAGON2(POS(m, n)).heyes += (black_eye[POS(i, j)].maxeye
-                                    - black_eye[POS(i, j)].mineye);
-       if (black_eye[POS(i, j)].maxeye - black_eye[POS(i, j)].mineye > 0)
-         DRAGON2(POS(m, n)).heye = black_eye[POS(i, j)].attack_point;
-      }
-      if ((white_eye[POS(i, j)].color == WHITE_BORDER) 
-         && (white_eye[POS(i, j)].dragon != NO_MOVE)
-         && (white_eye[POS(i, j)].origin == POS(i, j))) 
+             ii, dr);
+       DRAGON2(dr).genus += (black_eye[ii].mineye);
+       DRAGON2(dr).heyes += (black_eye[ii].maxeye - black_eye[ii].mineye);
+       if (black_eye[ii].maxeye - black_eye[ii].mineye > 0)
+         DRAGON2(dr).heye = black_eye[ii].attack_point;
+      }
+      if ((white_eye[ii].color == WHITE_BORDER) 
+         && (white_eye[ii].dragon != NO_MOVE)
+         && (white_eye[ii].origin == ii)) 
       {
-       m = I(white_eye[POS(i, j)].dragon);
-       n = J(white_eye[POS(i, j)].dragon);
-       gg_assert (BOARD(m, n) == WHITE);
-       TRACE("eye at %1m found for dragon at %1m--augmenting genus\n",
-             POS(i, j), POS(m, n));
-       DRAGON2(POS(m, n)).genus += (white_eye[POS(i, j)].mineye);
-       DRAGON2(POS(m, n)).heyes += (white_eye[POS(i, j)].maxeye
-                                    - white_eye[POS(i, j)].mineye);
-       if (white_eye[POS(i, j)].maxeye - white_eye[POS(i, j)].mineye > 0) {
-         DRAGON2(POS(m, n)).heye = white_eye[POS(i, j)].attack_point;
+       dr = white_eye[ii].dragon;
+
+       gg_assert (board[dr] == WHITE);
+       TRACE("eye at %1m found for dragon at %1m--augmenting genus\n", 
+             ii, dr);
+       DRAGON2(dr).genus += (white_eye[ii].mineye);
+       DRAGON2(dr).heyes += (white_eye[ii].maxeye - white_eye[ii].mineye);
+       if (white_eye[ii].maxeye - white_eye[ii].mineye > 0) {
+         DRAGON2(dr).heye = white_eye[ii].attack_point;
        }
       }
     }
@@ -339,11 +353,14 @@
 
   /* Compute the escape route measure. */
   for (m = 0; m < board_size; m++)
-    for (n = 0; n < board_size; n++) 
-      if (dragon[POS(m, n)].origin == POS(m, n)
-         && IS_STONE(BOARD(m, n))) {
-       DRAGON2(POS(m, n)).escape_route = compute_escape(m, n, 0);
+    for (n = 0; n < board_size; n++) {
+      ii = POS(m, n);
+
+      if (dragon[ii].origin == ii
+         && IS_STONE(board[ii])) {
+       DRAGON2(ii).escape_route = compute_escape(ii, 0);
       }
+    }
 
   time_report(2, "  time to compute escape", -1, -1, 1.0);
 
@@ -366,9 +383,11 @@
   /* Determine status: ALIVE, DEAD, CRITICAL or UNKNOWN */
   for (m = 0; m < board_size; m++)
     for (n = 0; n < board_size; n++) {
-      if (dragon[POS(m, n)].origin == POS(m, n) && BOARD(m, n)) {
-       dragon[POS(m, n)].status = compute_dragon_status(POS(m, n));
-       sgffile_dragon_status(m, n, dragon[POS(m, n)].status);
+      ii = POS(m, n);
+
+      if (dragon[ii].origin == ii && board[ii]) {
+       dragon[ii].status = compute_dragon_status(ii);
+       sgffile_dragon_status(I(ii), J(ii), dragon[ii].status);
       }
     }
   time_report(2, "  compute_dragon_status", -1, -1, 1.0);
@@ -378,10 +397,12 @@
    */
   for (m = 0; m < board_size; m++)
     for (n = 0; n < board_size; n++) {
-      struct dragon_data *d = &(dragon[POS(m, n)]);
-      dragon[POS(m, n)] = dragon[d->origin];
+      int ii = POS(m, n);
+      struct dragon_data *d = &(dragon[ii]);
+
+      dragon[ii] = dragon[d->origin];
     }
-  
+
   find_neighbor_dragons();
   time_report(2, "  find_neighbor_dragons", -1, -1, 1.0);
 
@@ -403,34 +424,36 @@
       int second_defendi = -1;
       int second_defendj = -1;
       
-      if (BOARD(m, n) == EMPTY
-         || dragon[POS(m, n)].origin != POS(m, n))
+      ii = POS(m, n);
+
+      if (board[ii] == EMPTY
+         || dragon[ii].origin != ii)
        continue;
 
       /* Some dragons can be ignored. But
        * Be extra careful with big dragons. */
-      if (DRAGON2(POS(m, n)).escape_route > 25
-         || DRAGON2(POS(m, n)).moyo > 20
-         || (DRAGON2(POS(m, n)).moyo > 10
-             && DRAGON2(POS(m, n)).moyo > dragon[POS(m, n)].size)) {
-       dragon[POS(m, n)].owl_status = UNCHECKED;
-       dragon[POS(m, n)].owl_threat_status = UNCHECKED;
-       dragon[POS(m, n)].owl_attack_point  = NO_MOVE;
-       dragon[POS(m, n)].owl_defense_point = NO_MOVE;
-       dragon[POS(m, n)].owl_second_attack_point  = NO_MOVE;
-       dragon[POS(m, n)].owl_second_defense_point = NO_MOVE;
+      if (DRAGON2(ii).escape_route > 25
+         || DRAGON2(ii).moyo > 20
+         || (DRAGON2(ii).moyo > 10
+             && DRAGON2(ii).moyo > dragon[ii].size)) {
+       dragon[ii].owl_status = UNCHECKED;
+       dragon[ii].owl_threat_status = UNCHECKED;
+       dragon[ii].owl_attack_point  = NO_MOVE;
+       dragon[ii].owl_defense_point = NO_MOVE;
+       dragon[ii].owl_second_attack_point  = NO_MOVE;
+       dragon[ii].owl_second_defense_point = NO_MOVE;
       }
       else {
        start_timer(3);
        if (owl_attack(m, n, &attacki, &attackj, 
-                      &dragon[POS(m, n)].owl_attack_certain)) {
-         dragon[POS(m, n)].owl_attack_point = POS(attacki, attackj);
+                      &dragon[ii].owl_attack_certain)) {
+         dragon[ii].owl_attack_point = POS(attacki, attackj);
          if (attacki != -1
              && owl_defend(m, n, &defendi, &defendj, 
-                           &dragon[POS(m, n)].owl_defend_certain)) {
+                           &dragon[ii].owl_defend_certain)) {
            if (defendi != -1) {
-             dragon[POS(m, n)].owl_status = CRITICAL;
-             dragon[POS(m, n)].owl_defense_point = POS(defendi, defendj);
+             dragon[ii].owl_status = CRITICAL;
+             dragon[ii].owl_defense_point = POS(defendi, defendj);
            }
            else {
              /* Due to irregularities in the owl code, it may
@@ -441,50 +464,50 @@
               * propose. Having the status right is important e.g.
               * for connection moves to be properly valued.
               */
-             dragon[POS(m, n)].owl_status = CRITICAL;
+             dragon[ii].owl_status = CRITICAL;
              DEBUG(DEBUG_OWL_PERFORMANCE,
-                   "Inconsistent owl attack and defense results for %m.\n",
-                   m, n);
+                   "Inconsistent owl attack and defense results for %1m.\n", 
+                   ii);
            }
          }
          else {
-           dragon[POS(m, n)].owl_status = DEAD; 
-           dragon[POS(m, n)].owl_defense_point = NO_MOVE;
+           dragon[ii].owl_status = DEAD; 
+           dragon[ii].owl_defense_point = NO_MOVE;
            if (level >= 8
                && !disable_threat_computation) {
              if (owl_threaten_defense(m, n, &defendi, &defendj,
                                       &second_defendi, &second_defendj)) {
-               dragon[POS(m, n)].owl_threat_status = CAN_THREATEN_DEFENSE;
-               dragon[POS(m, n)].owl_defense_point = POS(defendi, defendj);
-               dragon[POS(m, n)].owl_second_defense_point = 
POS(second_defendi, 
-                                                           second_defendj);
+               dragon[ii].owl_threat_status = CAN_THREATEN_DEFENSE;
+               dragon[ii].owl_defense_point = POS(defendi, defendj);
+               dragon[ii].owl_second_defense_point = POS(second_defendi, 
+                                                         second_defendj);
              }
              else
-               dragon[POS(m, n)].owl_threat_status = DEAD;;
+               dragon[ii].owl_threat_status = DEAD;;
            }
          }
        }
        else {
-         if (!dragon[POS(m, n)].owl_attack_certain
+         if (!dragon[ii].owl_attack_certain
              && owl_defend(m, n, &defendi, &defendj, 
-                           &dragon[POS(m, n)].owl_defend_certain)) {
+                           &dragon[ii].owl_defend_certain)) {
            /* If the result of owl_attack was not certain, we may
             * still want the result of owl_defend */
-           dragon[POS(m, n)].owl_defense_point = POS(defendi, defendj);
+           dragon[ii].owl_defense_point = POS(defendi, defendj);
          }
-         dragon[POS(m, n)].owl_status = ALIVE;
-         dragon[POS(m, n)].owl_attack_point = NO_MOVE;
+         dragon[ii].owl_status = ALIVE;
+         dragon[ii].owl_attack_point = NO_MOVE;
          if (level >= 8
              && !disable_threat_computation) {
            if (owl_threaten_attack(m, n, &attacki, &attackj,
                                    &second_attacki, &second_attackj)) {
-             dragon[POS(m, n)].owl_threat_status = CAN_THREATEN_ATTACK;
-             dragon[POS(m, n)].owl_attack_point = POS(attacki, attackj);
-             dragon[POS(m, n)].owl_second_attack_point = POS(second_attacki,
-                                                        second_attackj);
+             dragon[ii].owl_threat_status = CAN_THREATEN_ATTACK;
+             dragon[ii].owl_attack_point = POS(attacki, attackj);
+             dragon[ii].owl_second_attack_point = POS(second_attacki,
+                                                      second_attackj);
            }
            else
-             dragon[POS(m, n)].owl_threat_status = ALIVE;
+             dragon[ii].owl_threat_status = ALIVE;
          }
        }
        time_report(3, "    owl reading for dragon at ", m, n, 1.0);
@@ -498,69 +521,73 @@
    */
   for (m = 0; m < board_size; m++)
     for (n = 0; n < board_size; n++) {
-      struct dragon_data *d = &(dragon[POS(m, n)]);
-      dragon[POS(m, n)] = dragon[d->origin];
+      int ii = POS(m, n);
+      struct dragon_data *d = &(dragon[ii]);
+      dragon[ii] = dragon[d->origin];
     }
 
   /* Compute the status to be used by the matcher. We most trust the
    * owl status, if it is available.
    */
   for (m = 0; m < board_size; m++)
-    for (n = 0; n < board_size; n++)
-      if (IS_STONE(BOARD(m, n))) {
-       if (dragon[POS(m, n)].owl_status != UNCHECKED)
-         dragon[POS(m, n)].matcher_status = dragon[POS(m, n)].owl_status;
-       else if (dragon[POS(m, n)].status == DEAD 
-                || dragon[POS(m, n)].status == CRITICAL) {
+    for (n = 0; n < board_size; n++) {
+      ii = POS(m, n);
+
+      if (IS_STONE(board[ii])) {
+       if (dragon[ii].owl_status != UNCHECKED)
+         dragon[ii].matcher_status = dragon[ii].owl_status;
+       else if (dragon[ii].status == DEAD 
+                || dragon[ii].status == CRITICAL) {
          /* If a dragon has sufficient escape potential or
           * surrounding moyo to stop the owl code from being run, the
           * matcher_status should be no worse than UNKNOWN,
           * regardless what the static life and death analysis
           * guesses.
           */
-         dragon[POS(m, n)].matcher_status = UNKNOWN;
+         dragon[ii].matcher_status = UNKNOWN;
        }
        else
-         dragon[POS(m, n)].matcher_status = dragon[POS(m, n)].status;
+         dragon[ii].matcher_status = dragon[ii].status;
       }
+    }
 
   time_report(2, "  compute matcher status", -1, -1, 1.0);
 
   /* Compute the safety value. */
   for (d = 0; d < number_of_dragons; d++) {
     int true_genus;
-    m = I(dragon2[d].origin);
-    n = J(dragon2[d].origin);
+    int origin = dragon2[d].origin;
+
     true_genus = 2 * dragon2[d].genus + dragon2[d].heyes;
     /* FIXME: Probably need a better definition of INESSENTIAL dragons.
      *        There are cases where a string is owl insubstantial
      *        yet allowing it to be captured greatly weakens our
      *        position.
      */
-    if (dragon[POS(m, n)].size == worm[POS(m, n)].size
-       && !owl_substantial(m, n))
+    if (dragon[origin].size == worm[origin].size
+       && !owl_substantial(I(origin), J(origin)))
       dragon2[d].safety = INESSENTIAL;
-    else if (dragon[POS(m, n)].size == worm[POS(m, n)].size
-            && worm[POS(m, n)].attack_codes[0] != 0
-            && worm[POS(m, n)].defend_codes[0] == 0)
+    else if (dragon[origin].size == worm[origin].size
+            && worm[origin].attack_codes[0] != 0
+            && worm[origin].defend_codes[0] == 0)
       dragon2[d].safety = TACTICALLY_DEAD;
     else if (0) /* Seki is detected by the call to semeai() below. */
       dragon2[d].safety = ALIVE_IN_SEKI;
-    else if (dragon[POS(m, n)].owl_status == DEAD)
+    else if (dragon[origin].owl_status == DEAD)
       dragon2[d].safety = DEAD;
-    else if (dragon[POS(m, n)].owl_status == CRITICAL)
+    else if (dragon[origin].owl_status == CRITICAL)
       dragon2[d].safety = CRITICAL;
-    else if (dragon[POS(m, n)].owl_status == UNCHECKED
+    else if (dragon[origin].owl_status == UNCHECKED
             && true_genus < 4
             && dragon2[d].moyo <= 10)
       dragon2[d].safety = WEAK;
-    else if (dragon_invincible(m, n))
+    else if (dragon_invincible(origin))
       dragon2[d].safety = INVINCIBLE;
     else if (true_genus >= 6 || dragon2[d].moyo > 20)
       dragon2[d].safety = STRONGLY_ALIVE;
     else if ((2 * true_genus + dragon2[d].moyo < 8
              && dragon2[d].escape_route < 10)
-            || (dragon[POS(m, n)].owl_threat_status == CAN_THREATEN_ATTACK)) {
+            || (dragon[origin].owl_threat_status == CAN_THREATEN_ATTACK)) {
       if (DRAGON(d).owl_attack_certain)
          dragon2[d].safety = WEAKLY_ALIVE;
       else
@@ -581,8 +608,9 @@
    */
   for (m = 0; m < board_size; m++)
     for (n = 0; n < board_size; n++) {
-      dragon[POS(m, n)].matcher_status =
-       dragon[dragon[POS(m, n)].origin].matcher_status;
+      ii = POS(m, n);
+
+      dragon[ii].matcher_status = dragon[dragon[ii].origin].matcher_status;
     }
 
   /* Revise essentiality of critical worms. Specifically, a critical
@@ -591,17 +619,17 @@
    */
   for (m = 0; m < board_size; m++)
     for (n = 0; n < board_size; n++) {
-      int pos = POS(m, n);
-      if (is_worm_origin(pos, pos)
-         && worm[pos].attack_codes[0] != 0
-         && worm[pos].defend_codes[0] != 0
-         && !worm[pos].inessential) {
+      ii = POS(m, n);
+      if (is_worm_origin(ii, ii)
+         && worm[ii].attack_codes[0] != 0
+         && worm[ii].defend_codes[0] != 0
+         && !worm[ii].inessential) {
        int adjs[MAXCHAIN];
        int neighbors;
        int r;
        int essential = 0;
        
-       neighbors = chainlinks(pos, adjs);
+       neighbors = chainlinks(ii, adjs);
        for (r = 0; r < neighbors; r++)
          if (dragon[adjs[r]].matcher_status != DEAD) {
            essential = 1;
@@ -609,9 +637,9 @@
          }
 
        if (!essential) {
-         DEBUG(DEBUG_WORMS, "Worm %1m revised to be inessential.\n", pos);
-         worm[pos].inessential = 1;
-         propagate_worm(pos);
+         DEBUG(DEBUG_WORMS, "Worm %1m revised to be inessential.\n", ii);
+         worm[ii].inessential = 1;
+         propagate_worm(ii);
        }
       }
     }
@@ -636,7 +664,6 @@
 initialize_supplementary_dragon_data()
 {
   int m, n;
-  int i, j;
   int d;
   
   /* Give each dragon (caves excluded) an id number for indexing into
@@ -645,13 +672,15 @@
   number_of_dragons = 0;
   for (m = 0; m < board_size; m++)
     for (n = 0; n < board_size; n++) {
-      if (BOARD(m, n) == EMPTY)
+      int ii = POS(m, n);
+      int origin = dragon[ii].origin;
+
+      if (board[ii] == EMPTY)
        continue;
-      i = I(dragon[POS(m, n)].origin);
-      j = J(dragon[POS(m, n)].origin);
-      if (dragon[POS(i, j)].id == -1)
-       dragon[POS(i, j)].id = number_of_dragons++;
-      dragon[POS(m, n)].id = dragon[POS(i, j)].id;
+
+      if (dragon[origin].id == -1)
+       dragon[origin].id = number_of_dragons++;
+      dragon[ii].id = dragon[origin].id;
     }
 
   /* Now number_of_dragons contains the number of dragons and we can
@@ -672,9 +701,11 @@
    */
   for (m = 0; m < board_size; m++)
     for (n = 0; n < board_size; n++) {
-      if (IS_STONE(BOARD(m, n))
-         && dragon[POS(m, n)].origin == POS(m, n)) {
-       DRAGON2(POS(m, n)).origin = POS(m, n);
+      int ii = POS(m, n);
+
+      if (IS_STONE(board[ii])
+         && dragon[ii].origin == ii) {
+       DRAGON2(ii).origin = ii;
       }
     }
 
@@ -709,10 +740,12 @@
 find_neighbor_dragons()
 {
   int m, n;
+  int ii;
   int i, j;
+  int jj;
   int d;
-  int dragons[MAX_BOARD][MAX_BOARD];
-  int distances[MAX_BOARD][MAX_BOARD];
+  int dragons[BOARDMAX];
+  int distances[BOARDMAX];
   int dist;
   int k;
   int color;
@@ -722,13 +755,15 @@
   /* Initialize the arrays. */
   for (m = 0; m < board_size; m++)
     for (n = 0; n < board_size; n++) {
-      if (IS_STONE(BOARD(m, n))) {
-       dragons[m][n] = dragon[POS(m, n)].id;
-       distances[m][n] = 0;
+      ii = POS(m, n);
+
+      if (IS_STONE(board[ii])) {
+       dragons[ii] = dragon[ii].id;
+       distances[ii] = 0;
       }
       else {
-       dragons[m][n] = -1;
-       distances[m][n] = -1;
+       dragons[ii] = -1;
+       distances[ii] = -1;
       }
     }
 
@@ -740,32 +775,37 @@
       
     for (m = 0; m < board_size; m++)
       for (n = 0; n < board_size; n++) {
-       if (distances[m][n] != dist-1 || dragons[m][n] < 0)
+       ii = POS(m, n);
+
+       if (distances[ii] != dist-1 || dragons[ii] < 0)
          continue;
-       color = DRAGON(dragons[m][n]).color;
+
+       color = DRAGON(dragons[ii]).color;
        for (k = 0; k < 4; k++) {
-         i = m + deltai[k];
-         j = n + deltaj[k];
-         if (!ON_BOARD(POS(i, j)))
+         jj = ii + delta[k];
+
+         if (!ON_BOARD1(jj))
            continue;
-         /* Consider expansion from (m, n) to adjacent intersection
-          * (i, j).
+
+         /* Consider expansion from (ii) to adjacent intersection
+          * (jj).
           */
-         if (distances[i][j] >= 0 && distances[i][j] < dist)
-           continue; /* (i, j) already occupied. */
-         if (influence_area_color(m, n) == color
-             && influence_area_color(i, j) != OTHER_COLOR(color)) {
+         if (distances[jj] >= 0 && distances[jj] < dist)
+           continue; /* (jj) already occupied. */
+
+         if (influence_area_color(I(ii), J(ii)) == color
+             && influence_area_color(I(jj), J(jj)) != OTHER_COLOR(color)) {
            /* Expansion ok. Now see if someone else has tried to
             * expand here. In that case we indicate a collision by
             * setting the dragon number to -2.
             */
-           if (distances[i][j] == dist) {
-             if (dragons[i][j] != dragons[m][n])
-               dragons[i][j] = -2;
+           if (distances[jj] == dist) {
+             if (dragons[jj] != dragons[ii])
+               dragons[jj] = -2;
            }
            else {
-             dragons[i][j] = dragons[m][n];
-             distances[i][j] = dist;
+             dragons[jj] = dragons[ii];
+             distances[jj] = dist;
              found_one = 1;
            }
          }
@@ -778,7 +818,7 @@
   if (0) {
     for (m = 0; m < board_size; m++) {
       for (n = 0; n < board_size; n++) {
-       fprintf(stderr, "%3d", dragons[m][n]);
+       fprintf(stderr, "%3d", dragons[POS(m, n)]);
       }
       fprintf(stderr, "\n");
     }
@@ -786,7 +826,7 @@
       
     for (m = 0; m < board_size; m++) {
       for (n = 0; n < board_size; n++) {
-       fprintf(stderr, "%3d", distances[m][n]);
+       fprintf(stderr, "%3d", distances[POS(m, n)]);
       }
       fprintf(stderr, "\n");
     }
@@ -800,29 +840,32 @@
      */
   for (m = 0; m < board_size; m++)
     for (n = 0; n < board_size; n++) {
-      if (dragons[m][n] == -2) {
+      ii = POS(m, n);
+
+      if (dragons[ii] == -2) {
        int neighbors = 0;
        int adjacent[4];
+
        for (k = 0; k < 4; k++) {
-         i = m + deltai[k];
-         j = n + deltaj[k];
-         if (ON_BOARD(POS(i, j)) && dragons[i][j] >= 0)
-           adjacent[neighbors++] = dragons[i][j];
+         jj = ii + delta[k];
+
+         if (ON_BOARD1(jj) && dragons[jj] >= 0)
+           adjacent[neighbors++] = dragons[jj];
        }
        for (i = 0; i < neighbors; i++)
          for (j = i+1; j < neighbors; j++)
            add_adjacent_dragons(adjacent[i], adjacent[j]);
       }
-      else if (dragons[m][n] >= 0) {
-       if (m < board_size-1) {
-         if (dragons[m+1][n] >= 0
-             && dragons[m+1][n] != dragons[m][n])
-           add_adjacent_dragons(dragons[m][n], dragons[m+1][n]);
+      else if (dragons[ii] >= 0) {
+       if (I(ii) < board_size-1) {
+         if (dragons[ii+NS] >= 0
+             && dragons[ii+NS] != dragons[ii])
+           add_adjacent_dragons(dragons[ii], dragons[ii+NS]);
        }
-       if (n < board_size-1) {
-         if (dragons[m][n+1] >= 0
-             && dragons[m][n+1] != dragons[m][n])
-           add_adjacent_dragons(dragons[m][n], dragons[m][n+1]);
+       if (J(ii) < board_size-1) {
+         if (dragons[ii+1] >= 0
+             && dragons[ii+1] != dragons[ii])
+           add_adjacent_dragons(dragons[ii], dragons[ii+1]);
        }
       }
     }
@@ -877,38 +920,45 @@
  */
 
 static int
-dragon_invincible(int m, int n)
+dragon_invincible(int pos)
 {
 
   struct eye_data *eye;
 
   int i, j;
+  int ii;
 
   int strong_eyes = 0;
 
-  gg_assert(IS_STONE(BOARD(m, n)));
+  gg_assert(IS_STONE(board[pos]));
 
   /* First look for invincible strings in the dragon. */
   for (i = 0; i < board_size; i++)
-    for (j = 0; j < board_size; j++)
-      if (same_dragon(POS(i, j), POS(m, n)) && worm[POS(i, j)].invincible)
+    for (j = 0; j < board_size; j++) {
+      ii = POS(i, j);
+
+      if (same_dragon(ii, pos) && worm[ii].invincible)
         return 1;
+    }
 
   /* Examine the eye spaces.
    * FIXME: The check for half eyes or false eyes may be too weak.
    */
-  if (BOARD(m, n) == BLACK)
+  if (board[pos] == BLACK)
     eye = black_eye;
   else
     eye = white_eye;
 
   for (i = 0; i < board_size; i++)
-    for (j = 0; j < board_size; j++)
-      if (eye[POS(i, j)].origin == POS(i, j)
-          && same_dragon(eye[POS(i, j)].dragon, POS(m, n))) {
-        if (eye[POS(i, j)].msize == 0 && eye[POS(i, j)].mineye > 0)
+    for (j = 0; j < board_size; j++) {
+      ii = POS(i, j);
+
+      if (eye[ii].origin == ii
+          && same_dragon(eye[ii].dragon, pos)) {
+        if (eye[ii].msize == 0 && eye[ii].mineye > 0)
           strong_eyes++;
       }
+    }
 
   if (strong_eyes >= 2)
     return 1;
@@ -931,17 +981,20 @@
    "weakly_alive", "alive_in_seki", "strongly_alive", "invincible"};
   
   int m, n;
+  int ii;
   int k;
 
   for (m = 0; m < board_size; m++)
     for (n = 0; n < board_size; n++) {
       struct worm_data *w = &(worm[POS(m, n)]);
+
+      ii = POS(m, n);
 
-      if (w->origin == POS(m, n)) {
-       if (BOARD(m, n)) {
-         gprintf("%m : (dragon %1m) %s string of size %d (%f), genus %d: 
(%d,%d,%d,%d)",
-                 m, n, dragon[POS(m, n)].origin,
-                 color_to_string(BOARD(m, n)),
+      if (w->origin == ii) {
+       if (board[ii]) {
+         gprintf("%1m : (dragon %1m) %s string of size %d (%f), genus %d: 
(%d,%d,%d,%d)",
+                 ii, dragon[ii].origin,
+                 color_to_string(board[ii]),
                  w->size,
                  w->effective_size,
                  w->genus,
@@ -1014,11 +1067,13 @@
       struct dragon_data2 *d2 = &(dragon2[d->id]);
       int k;
 
-      if (d->origin == POS(m, n)) {
-       if (BOARD(m, n)) {
-         gprintf("%m : %s dragon size %d (%f), genus %d, half eyes %d, escape 
factor %d, status %s, matcher status %s, moyo size %d safety %s",
-                 m, n,
-                 BOARD(m, n)==BLACK ? "B" : "W",
+      ii = POS(m, n);
+
+      if (d->origin == ii) {
+       if (board[ii]) {
+         gprintf("%1m : %s dragon size %d (%f), genus %d, half eyes %d, escape 
factor %d, status %s, matcher status %s, moyo size %d safety %s",
+                 ii,
+                 board[ii]==BLACK ? "B" : "W",
                  d->size,
                  d->effective_size,
                  d2->genus,
@@ -1049,13 +1104,13 @@
 }
 
 
-  
-/* 
- * dragon_eye(m, n, *di, *dj) is invoked with (m, n) the origin of an
- * eyespace. It unites all the worms adjacent to non-marginal points of
- * the eyespace into a single dragon with origin (*di, *dj). In addition
- * to marginal eye space points, amalgamation is inhibited for points
- * with the INHIBIT_CONNECTION type set.
+
+/*
+ * dragon_eye(pos, eye_data) is invoked with (pos) the origin of an
+ * eyespace. It unites all the worms adjacent to non-marginal points
+ * of the eyespace into a single dragon.. In addition to marginal eye
+ * space points, amalgamation is inhibited for points with the
+ * INHIBIT_CONNECTION type set.
  *
  * This is based on the older function dragon_ring.
  */
@@ -1064,7 +1119,8 @@
 dragon_eye(int pos, struct eye_data eye[BOARDMAX])
 {
   int i, j;
-  int eye_dragon = NO_MOVE;
+  int ii;
+  int dr = NO_MOVE;
   int color;
   int k;
 
@@ -1082,19 +1138,20 @@
 
   for (i = 0; i < board_size; i++)
     for (j = 0; j < board_size; j++) {
-      if (eye[POS(i, j)].origin == pos
-         && !eye[POS(i, j)].marginal
-         && !(eye[POS(i, j)].type & INHIBIT_CONNECTION)) {
+      ii = POS(i, j);
+
+      if (eye[ii].origin == pos
+         && !eye[ii].marginal
+         && !(eye[ii].type & INHIBIT_CONNECTION)) {
        for (k = 0; k < 4; k++) {
-         int di = deltai[k];
-         int dj = deltaj[k];
-         if (BOARD(i+di, j+dj) == color) {
-           if (eye_dragon == NO_MOVE) {
-             eye_dragon = dragon[POS(i+di, j+dj)].origin;
-           }
-           else if (dragon[POS(i+di, j+dj)].origin != eye_dragon) {
-             join_dragons(POS(i+di, j+dj), eye_dragon);
-             eye_dragon = dragon[POS(i+di, j+dj)].origin;
+         int d = delta[k];
+
+         if (board[ii+d] == color) {
+           if (dr == NO_MOVE)
+             dr = dragon[ii+d].origin;
+           else if (dragon[ii+d].origin != dr) {
+             join_dragons(ii+d, dr);
+             dr = dragon[ii+d].origin;
            }
          }
        }
@@ -1103,11 +1160,13 @@
   
   for (i = 0; i < board_size; i++)
     for (j = 0; j < board_size; j++) {
-      if ((eye[POS(i, j)].color == BLACK_BORDER 
-          || eye[POS(i, j)].color == WHITE_BORDER) 
-         && eye[POS(i, j)].origin == pos)
+      ii = POS(i, j);
+
+      if ((eye[ii].color == BLACK_BORDER 
+          || eye[ii].color == WHITE_BORDER) 
+         && eye[ii].origin == pos)
       {
-       eye[POS(i, j)].dragon = eye_dragon;
+       eye[ii].dragon = dr;
       }
     }
 }
@@ -1121,8 +1180,8 @@
 void 
 join_dragons(int d1, int d2)
 {
+  int ii;
   int origin; /* new origin */
-  int pos;
 
   /* Normalize dragon coordinates. */
   d1 = dragon[d1].origin;
@@ -1151,18 +1210,18 @@
   dragon[origin].effective_size  = (dragon[d2].effective_size
                                    + dragon[d1].effective_size);
 
-  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
-    if (ON_BOARD(pos)
-       && (dragon[pos].origin == d1 || dragon[pos].origin == d2))
-      dragon[pos].origin = origin;
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++) {
+    if (ON_BOARD(ii)
+       && (dragon[ii].origin == d1 || dragon[ii].origin == d2))
+      dragon[ii].origin = origin;
   }
 }
 
 
 
 /*
- * compute_dragon_status(i, j) tries to determine whether the dragon
- * at (i, j) is ALIVE, DEAD, or UNKNOWN. The algorithm is not perfect
+ * compute_dragon_status(pos) tries to determine whether the dragon
+ * at (pos) is ALIVE, DEAD, or UNKNOWN. The algorithm is not perfect
  * and can give incorrect answers.
  *
  * The dragon is judged alive if its genus is >1. It is judged dead if
@@ -1202,8 +1261,7 @@
       && true_genus >= 3)
     return ALIVE;
 
-  if (lunch == NO_MOVE || worm[lunch].cutstone < 2) 
-  {
+  if (lunch == NO_MOVE || worm[lunch].cutstone < 2) {
     if (true_genus < 3
        && DRAGON2(pos).escape_route == 0
        && DRAGON2(pos).moyo < 5)
@@ -1251,9 +1309,8 @@
  * intersection.
  */
 
-#define ENQUEUE(i, j) (queuei[queue_end] = (i),\
-                      queuej[queue_end++] = (j),\
-                      mx[i][j] = 1)
+#define ENQUEUE(pos) (queue[queue_end++] = (pos),\
+                     mx[pos] = 1)
 
 /* Compute the escape potential described above. The dragon is marked
  * in the goal array.
@@ -1263,11 +1320,11 @@
              int escape_value[BOARDMAX])
 {
   int i, j;
+  int ii;
   int k;
-  static int mx[MAX_BOARD][MAX_BOARD];
+  static int mx[BOARDMAX];
   static int mx_initialized = 0;
-  int queuei[MAX_BOARD * MAX_BOARD];
-  int queuej[MAX_BOARD * MAX_BOARD];
+  int queue[MAX_BOARD * MAX_BOARD];
   int queue_start = 0;
   int queue_end = 0;
   int other = OTHER_COLOR(color);
@@ -1283,9 +1340,12 @@
 
   /* Enter the stones of the dragon in the queue. */
   for (i = 0; i < board_size; i++)
-    for (j = 0; j < board_size; j++)
-      if (goal[POS(i, j)])
-       ENQUEUE(i, j);
+    for (j = 0; j < board_size; j++) {
+      ii = POS(i, j);
+
+      if (goal[ii])
+       ENQUEUE(ii);
+    }
   
   /* Find points at increasing distances from the dragon. At distance
    * four, sum the escape values at those points to get the escape
@@ -1294,57 +1354,58 @@
   for (distance = 0; distance <= 4; distance++) {
     int save_queue_end = queue_end;
     while (queue_start < save_queue_end) {
-      i = queuei[queue_start];
-      j = queuej[queue_start];
+      ii = queue[queue_start];
+      i = I(ii);               /* FIXME: Remove i,j */
+      j = J(ii);
       queue_start++;
 
       /* Do not pass connection inhibited intersections. */
       if ((color == WHITE
-          && ((white_eye[POS(i, j)].type & INHIBIT_CONNECTION)
-              || white_eye[POS(i, j)].cut == 1))
+          && ((white_eye[ii].type & INHIBIT_CONNECTION)
+              || white_eye[ii].cut == 1))
          || (color == BLACK
-             && ((black_eye[POS(i, j)].type & INHIBIT_CONNECTION)
-                 || black_eye[POS(i, j)].cut == 1)))
+             && ((black_eye[ii].type & INHIBIT_CONNECTION)
+                 || black_eye[ii].cut == 1)))
        continue;
-      
+/* qwe      */
       if (distance == 4)
        escape_potential += escape_value[POS(i, j)];
       else {
-       if (i > 0
-           && !mx[i-1][j]
-           && (BOARD(i-1, j) == color
-               || (BOARD(i-1, j) == EMPTY
-                   && i > 1 && BOARD(i-2, j) != other
-                   && j > 0 && BOARD(i-1, j-1) != other
-                   && j < board_size-1 && BOARD(i-1, j+1) != other)))
-         ENQUEUE(i-1, j);
+       if (I(ii) > 0
+           && !mx[ii-NS]
+           && (board[ii-NS] == color
+               || (board[ii-NS] == EMPTY
+                   && I(ii) > 1 && board[ii-2*NS] != other
+                   && J(ii) > 0 && board[ii-NS-1] != other
+                   && J(ii) < board_size-1 && board[ii-NS+1] != other)))
+         ENQUEUE(ii-NS);
 
        if (i < board_size-1
-           && !mx[i+1][j]
+           && !mx[POS(i+1, j)]
            && (BOARD(i+1, j) == color
                || (BOARD(i+1, j) == EMPTY
                    && i < board_size-2 && BOARD(i+2, j) != other
                    && j > 0 && BOARD(i+1, j-1) != other
                    && j < board_size-1 && BOARD(i+1, j+1) != other)))
-         ENQUEUE(i+1, j);
+         ENQUEUE(POS(i+1, j));
 
        if (j > 0
-           && !mx[i][j-1]
+           && !mx[POS(i, j-1)]
            && (BOARD(i, j-1) == color
                || (BOARD(i, j-1) == EMPTY
                    && j > 1 && BOARD(i, j-2) != other
                    && i > 0 && BOARD(i-1, j-1) != other
                    && i < board_size-1 && BOARD(i+1, j-1) != other)))
-         ENQUEUE(i, j-1);
+         ENQUEUE(POS(i, j-1));
 
        if (j < board_size-1
-           && !mx[i][j+1]
+           && !mx[POS(i, j+1)]
            && (BOARD(i, j+1) == color
                || (BOARD(i, j+1) == EMPTY
                    && j < board_size-2 && BOARD(i, j+2) != other
                    && i > 0 && BOARD(i-1, j+1) != other
                    && i < board_size-1 && BOARD(i+1, j+1) != other)))
-         ENQUEUE(i, j+1);
+         ENQUEUE(POS(i, j+1));
 
        /* For distance one intersections, allow kosumi to move out. I.e.
         *
@@ -1361,7 +1422,7 @@
                  || (BOARD(i-1, j-1) == EMPTY
                      && BOARD(i-2, j-1) != other
                      && BOARD(i-1, j-2) != other)))
-           ENQUEUE(i-1, j-1);
+           ENQUEUE(POS(i-1, j-1));
 
          if (i > 1 && j < board_size-2
              && BOARD(i, j+1) == EMPTY && BOARD(i-1, j) == EMPTY
@@ -1369,7 +1430,7 @@
                  || (BOARD(i-1, j+1) == EMPTY
                      && BOARD(i-2, j+1) != other
                      && BOARD(i-1, j+2) != other)))
-           ENQUEUE(i-1, j+1);
+           ENQUEUE(POS(i-1, j+1));
 
          if (i < board_size-2 && j < board_size-2
              && BOARD(i, j+1) == EMPTY && BOARD(i+1, j) == EMPTY
@@ -1377,7 +1438,7 @@
                  || (BOARD(i+1, j+1) == EMPTY
                      && BOARD(i+2, j+1) != other
                      && BOARD(i+1, j+2) != other)))
-           ENQUEUE(i+1, j+1);
+           ENQUEUE(POS(i+1, j+1));
 
          if (i < board_size-2 && j > 1
              && BOARD(i, j-1) == EMPTY && BOARD(i+1, j) == EMPTY
@@ -1385,7 +1446,7 @@
                  || (BOARD(i+1, j-1) == EMPTY
                      && BOARD(i+2, j-1) != other
                      && BOARD(i+1, j-2) != other)))
-           ENQUEUE(i+1, j-1);
+           ENQUEUE(POS(i+1, j-1));
        }
       }
     }
@@ -1393,7 +1454,7 @@
 
   /* Reset used mx cells. */
   for (k = 0; k < queue_end; k++)
-    mx[queuei[k]][queuej[k]] = 0;
+    mx[queue[k]] = 0;
 
   return escape_potential;
 }
@@ -1402,40 +1463,45 @@
  * for the dragon at (m, n).
  */
 static int
-compute_escape(int m, int n, int dragon_status_known)
+compute_escape(int pos, int dragon_status_known)
 {
   int i, j;
+  int ii;
   char goal[BOARDMAX];
   int escape_value[BOARDMAX];
 
-  ASSERT1(IS_STONE(board[POS(m, n)]), POS(m, n));
+  ASSERT1(IS_STONE(board[pos]), pos);
   
   for (i = 0; i < board_size; i++)
     for (j = 0; j < board_size; j++) {
-      goal[POS(i, j)] = same_dragon(POS(i, j), POS(m, n));
+      ii = POS(i, j);
+
+      goal[ii] = same_dragon(ii, pos);
     }
 
-  compute_escape_influence(goal, BOARD(m, n), escape_value,
+  compute_escape_influence(goal, board[pos], escape_value,
                           dragon_status_known);
 
   for (i = 0; i < board_size; i++)
     for (j = 0; j < board_size; j++) {
+      ii = POS(i, j);
+
       if (dragon_status_known) {
-       if (dragon[POS(i, j)].status == ALIVE)
-         escape_value[POS(i, j)] = 6;
-       else if (dragon[POS(i, j)].status == UNKNOWN
-                && (DRAGON2(POS(i, j)).escape_route > 5 || DRAGON2(POS(i, 
j)).moyo > 5))
-         escape_value[POS(i, j)] = 4;
+       if (dragon[ii].status == ALIVE)
+         escape_value[ii] = 6;
+       else if (dragon[ii].status == UNKNOWN
+                && (DRAGON2(ii).escape_route > 5 || DRAGON2(ii).moyo > 5))
+         escape_value[ii] = 4;
       }
       else {
-       if (BOARD(i, j) == BOARD(m, n)
-           && !goal[POS(i, j)]
-           && worm[POS(i, j)].attack_codes[0] == 0)
-         escape_value[POS(i, j)] = 2;
+       if (board[ii] == board[pos]
+           && !goal[ii]
+           && worm[ii].attack_codes[0] == 0)
+         escape_value[ii] = 2;
       }
     }
 
-  return dragon_escape(goal, BOARD(m, n), escape_value);
+  return dragon_escape(goal, board[pos], escape_value);
 }
 
 
@@ -1466,16 +1532,16 @@
  */
 
 int
-dragon_status(int i, int j)
+dragon_status(int pos)
 {
-  return dragon[POS(i, j)].status;
+  return dragon[pos].status;
 }
 
 
 int
-matcher_status(int i, int j)
+matcher_status(int pos)
 {
-  return dragon[POS(i, j)].matcher_status;
+  return dragon[pos].matcher_status;
 }
 
 
@@ -1516,7 +1582,9 @@
 void
 report_dragon(int m, int n)
 {
-  int i, j, k;
+  int i, j;
+  int ii;
+  int k;
   struct dragon_data *d = &(dragon[POS(m, n)]);
   struct dragon_data2 *d2 = &(dragon2[d->id]);
   
@@ -1534,10 +1602,13 @@
 
   gprintf("strings:");
   for (i = 0; i < board_size; i++)
-    for (j = 0; j < board_size; j++)
-      if (worm[POS(i, j)].origin == POS(i, j)
-         && same_dragon(POS(i, j), POS(m, n)))
+    for (j = 0; j < board_size; j++) {
+      ii = POS(i, j);
+
+      if (worm[ii].origin == ii
+         && same_dragon(ii, POS(m, n)))
        gprintf(" %m", i, j);
+    }
 
   gprintf("\nhalf eyes: %d, ", d2->heyes);
   if (d2->heye != NO_MOVE)
Index: engine/gnugo.h
===================================================================
RCS file: /cvsroot/gnugo/gnugo/engine/gnugo.h,v
retrieving revision 1.18
diff -u -r1.18 gnugo.h
--- engine/gnugo.h      2001/10/12 20:35:25     1.18
+++ engine/gnugo.h      2001/10/15 19:13:41
@@ -429,8 +429,9 @@
 /* dragon.c */
 void make_dragons(int color, int stop_before_owl);
 void show_dragons(void);
-int dragon_status(int i, int j);
-int matcher_status(int i, int j);
+int dragon_status(int pos);
+int matcher_status(int pos);
+int same_dragon(int dr1, int dr2);
 
 /* moyo functions */
 void print_moyo(void);
Index: engine/liberty.h
===================================================================
RCS file: /cvsroot/gnugo/gnugo/engine/liberty.h,v
retrieving revision 1.34
diff -u -r1.34 liberty.h
--- engine/liberty.h    2001/10/13 15:29:15     1.34
+++ engine/liberty.h    2001/10/15 19:13:50
@@ -125,7 +125,7 @@
  */
 extern int position_number;
 
-/* Count and/or find liberties at (i, j). */
+/* Count and/or find liberties at (pos). */
 int countlib(int str);
 int findlib(int str, int maxlib, int *libs);
 int approxlib(int pos, int color, int maxlib, int *libs);
@@ -137,7 +137,7 @@
 double time_report(int n, const char *occupation, int i, int j, 
                   double mintime);
 
-/* Play at (m, n) and then count the liberties. */
+/* Play at (pos) and then count the liberties. */
 int accurate_approxlib(int pos, int color, int maxlib, int *libs);
 
 /* Check for self atari. */
Index: interface/play_ascii.c
===================================================================
RCS file: /cvsroot/gnugo/gnugo/interface/play_ascii.c,v
retrieving revision 1.7
diff -u -r1.7 play_ascii.c
--- interface/play_ascii.c      2001/10/02 06:36:02     1.7
+++ interface/play_ascii.c      2001/10/15 19:14:02
@@ -234,7 +234,7 @@
         pos_is_move = 128;
        else
         pos_is_move = 0;
-       dead = (matcher_status(i, j)==DEAD) && showdead;
+       dead = (matcher_status(POS(i, j))==DEAD) && showdead;
        switch (pos->board[i][j] + pos_is_move + last_pos_was_move) {
        case EMPTY+128:
        case EMPTY:
@@ -1089,7 +1089,7 @@
          || gameinfo->position.board[i][j] == EMPTY)
        printf("\ninvalid!\n");
       else {
-       int status = matcher_status(i, j);
+       int status = matcher_status(POS(i, j));
        status = (status == DEAD) ? ALIVE : DEAD;
        change_matcher_status(i, j, status);
        ascii_showboard(&gameinfo->position);
Index: patterns/helpers.c
===================================================================
RCS file: /cvsroot/gnugo/gnugo/patterns/helpers.c,v
retrieving revision 1.16
diff -u -r1.16 helpers.c
--- patterns/helpers.c  2001/10/12 15:09:52     1.16
+++ patterns/helpers.c  2001/10/15 19:14:05
@@ -499,6 +499,7 @@
   int apos = POS(ai, aj);
   int bpos = POS(bi, bj);
   int cpos = POS(ci, cj);
+
   if (!same_dragon(apos, bpos) && !same_dragon(bpos, cpos)) {
     if (dragon[apos].effective_size >= dragon[cpos].effective_size)
       join_dragons(apos, bpos);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]