Author: Hristo
Date: 14:37:41 09/24/99
Go up one level in this thread
On September 23, 1999 at 14:11:57, Normand M. Blais wrote: >On September 22, 1999 at 15:30:36, Brian Nielsen wrote: > >> >>Hi >> >>My name is Brian, i was thinking about writing a chess engine for fun. >>I am pretty experienced programmer/developper(c++,delpie), but have not been >>programming games, thoug i have made a packman clone a couple years ago. >> >>I have done a little research myself to get the principles in making a chess >>engine/program, and i think i now have basic understanding in how to(i hope :-)) >> >>i am curious in how you chessgame programmers represent the chessboard, I have >>seen 4-5 different examples/ways in how to do it, how do you do it and why ?? >> >>Second how long time does it take to make a basic engine! from scratch >>provided that i am a experienced programmer. >> >>Best regards >> >>Brian Nielsen > > >Hi, > >I'm not using C/C++ (yet) but I thought I could share the idea that I use for >my chess program. It is probably not new but I've nerver seen it mentionned any- >where. It is easy to understand and to implement. So, just for the record, here >it is. > > > >preliminary notes: The lower bound for array indexing is 1 (not 0) in the > explanation below. > >1- The board is represented by an array of 64 integers. > > > > 1 2 3 4 5 6 7 8 - 8 > 9 10 11 12 13 14 15 16 - 7 > 17 18 19 20 21 22 23 24 - 6 > 25 26 27 28 29 30 31 32 - 5 > 33 34 35 36 37 38 39 40 - 4 > 41 42 43 44 45 46 47 48 - 3 > 49 50 51 52 53 54 55 56 - 2 > 57 58 59 60 61 62 63 64 - 1 > > A B C D E F G H > > >2- A 64 by 8 integer array is used for the piece movements. For each square, > 8 directions is recorded: > > > NW(8) N(1) NE(2) > \ | / > W(7)--- ----E(3) > / | \ > SW(6) S(5) SE(4) > > For a given square and a given direction, the index of the adjacent square > is stored. If there is no square (case of a border square), 0 is stored. > > directions: 1 2 3 4 5 6 7 8 > --------------------------------------- > square(1) = 0, 0, 2,10, 9, 0, 0, 0 > square(2) = 0, 0, 3,11,10, 9, 1, 0 > . > . > . > square(64) = 56, 0, 0, 0, 0, 0,63,55 > > >3- The movement of the pieces are defined in term of directions: > > Rook --> 1 to 7 by 2 > Bishop --> 2 to 8 by 2 > Queen --> 1 to 8 by 1 > King --> 1 to 8 by 1 > > Knight --> {1,1,2},{1,1,8},{3,3,2},{3,3,4}, > {5,5,4},{5,5,6},{7,7,6},{7,7,8} > White: > pawn move one --> 1 > pawn move two --> {1,1} > pawn captures --> 2,8 > > Black: > pawn move one --> 5 > pawn move two --> {5,5} > pawn captures --> 4,6 > >4- Enhencements. > > A 64 by 8 array can be generated for the knight where the squares stored > for a given direction is the end square of a knight move. Then the knight > movement can be defined this way: > > Knight --> 1 to 8 by 1 > > > >Best Regards, > >Normand M. Blais Hi Normans. I've been using similar approach for some time now! It's *funny* to see how close our ideas are ... The diference is that I use direction[8][8]*64 matrix. and the directions are not predefined. There is a maximum of 8 directions and the maximum length a piece can go is 7 squares. i.e. square(x).direction(1).vector(...) = square number includes all possible squares that a given piece can reach from a given square(x) in direction(1). vector(n) is the square number and it doesn't have to adjacent to the origin square. Use vector(n)=0 as terminator and then go to the next direction. If direction(n)=0 there are no more valid directions. Knight moves are considerd in the same way as everything else, just their vectors have only one entry ... Single, very simple function, is used to generate almost all moves ... the pawns are a bit tricky, but not too bad. regards. hristo
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.