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

Re: computer-go: Sharing Go modules



I use unit numbers too, but I do have 2 color  bits, one for white and
one for white, only  as an extra  convienence.  I'm happy to  see some
empirical evidence (the fact that a good programmer also uses it) that
the way I chose to represent my board is reasonable.

I am interested in what information  you keep per  unit.  I don't keep
much  right  now,  but  my list  has changed  from  time to  time with
different  versions.  But I'm focused  mainly  on very primitive basic
facts per unit:

     1.  Number of stones in unit.
     2.  A representive stone location. (can be any stone in unit)
     3.  Number of liberties for this unit.
     4.  Unit color
    
I'm only interested in  things that  can be incrementally  maintained,
otherwise I just compute from scratch when  I need it.   I feel that I
need more primitives in my unit structure.


Don




   Date: Thu, 17 May 2001 08:50:41 -0700
   From: David Fotland <fotland@xxxxxxxxxxxxxxxxx>

   Actually, dealing with the edge of the board does put many special cases in 
   the code, so I
   often have code like if(edge[p] > 1 && board[p-1] == board[p]), so your 
   approach is more efficient.
   I didn't use it originally, because of memory limitations.  All data had to 
   fit in about 100 KB for DOS.
   And once I had a lot of code written, it was way too hard to go back and 
   change to your scheme.

   For examining the points near a point, I have a set of offset indexes that 
   depend on the source point,
   so there is little overhead when iterating over the 4 (or sometimes 3 or 2) 
   adjacent points.  But it does
   make my code a little more complex.

   If I was starting over, I would do it your way.

   Also, my board array doesn't store colors.  It just stores unit 
   numbers.  The color is a feature of a
   unit.  I like Handtalk's scheme of storing unit numbers on the board, and 
   forcing black unit numbers to be even and
   white unit numbers to be odd.  So you can check the color of a unit by just 
   a bit-masking operation.

   As for board points, it is not so bad.  When I am debugging, I always have 
   a second copy of the position
   showing in another instance, so I can see what is on the board while I look 
   at the code.  If I count
   down the main diagonal of the board, the index increments by 20, so I can 
   quickly find the index of
   any point.

   I wanted to use positive numbers for colors so I can use the colors 
   directly as indexes to arrays.
   I picked 0 for black because black plays first.

   David

   At 12:56 PM 5/17/2001 +0200, you wrote:
   >The color-coding scheme seems to be different for everyone. Before I used 1
   >for Black and -1 for White so that I do otherColor = -color. However with
   >any of these schemes you get problems when your code starts to rely on the
   >particular coding scheme, so I've decided to make constant definitions for
   >Black, White, Empty etc... and a function (macro in C) invertColor(color)
   >that does the inversion. Other than that I don't think about it and the
   >actual values are free to change.
   >
   >I also have an array with the distance to the edge of each point in it. But
   >my program has a lot of code that does something like:
   >
   >  if (board[left(xy)] == board[xy])
   >         doSomething(left(xy));
   >
   >and I don't want to have to check all the time for the edge to make sure it
   >doesn't wrap to the other side. Or worse, go out of bounds. However it
   >depends a lot on how your program is organised, so for the ManyFaces program
   >it may be more efficient not to have any boundaries.
   >
   >And I wouldn't be surprised if after all these years David knows by heart of
   >all the coordinates where they're on the board :-)
   >
   >     Mark
   >
   >
   > > -----Original Message-----
   > > From: owner-computer-go@xxxxxxxxxxxxxxxxx
   > > [mailto:owner-computer-go@xxxxxxxxxxxxxxxxx]On Behalf Of David Fotland
   > > Sent: Thursday, May 17, 2001 4:09 AM
   > > To: computer-go@xxxxxxxxxxxxxxxxx
   > > Subject: Re: computer-go: Sharing Go modules
   > >
   > >
   > >
   > > Many Faces uses 0 for Black, 1 for White, 2 for Empty.
   > >
   > > I use single dimension arrays.  0-360 are points (x+y*19), 361 is
   > > PASS, 362
   > > is NO_POINT.
   > >
   > > I have a separate array edge[363], which contains
   > > the distance to the nearest edge, that I use for edge detection.
   > >
   > > At 08:38 PM 5/16/2001 +0200, you wrote:
   > > > > I agree it's a good scheme. It's the same one that NNGS uses.
   > > > > Being able to address the neighbours of point pos as
   > > > > pos-Vdiff, pos-1, pos+1, and pos+Vdiff is quite a bit more convenient
   > > > > than dealing with (-1,0), (0,-1), (0,1), (1,0) vectors. Is it
   > > > > similarly standard to use 0 for EMPTY, 1 for BLACK, 2 for WHITE, and 3
   > > > > for EDGE ?
   > > >
   > > >If BLACK is 0 and WHITE is 1 is easy to write code like
   > > >
   > > >procedure DoSomething(p: boardoffset; color: boardcolor);
   > > >begin
   > > >   othercolor := 1-color;
   > > >   ...
   > > >end;
   > > >
   > > >since one rarely want to deal with the colors explicetely. But this is
   > > >of course a rather minor point. It does not matter for the
   > > >performance because you only make this transformation once in
   > > >every procedure.
   > > >
   > > >Magnus Persson
   > >
   > > David Fotland
   > >
   > >

   David Fotland