Author: Robert Hyatt
Date: 18:02:54 07/07/00
Go up one level in this thread
On July 07, 2000 at 18:43:01, KarinsDad wrote: >On July 07, 2000 at 15:25:45, Robert Hyatt wrote: > >>On July 07, 2000 at 12:25:10, KarinsDad wrote: >> >>>Other than mine? >>> >>>One of the bugs having my program play itself on Winboad discovered was that the >>>king would move out of check into a square that was not originally covered by >>>check, but is now an illegal square due to the checking piece now attacking it. >>>For example: >>> >>>[D]1Q4k1/6pp/8/8/8/8/8/6K1 b >>> >>>In this position, white just played Qb8+. Black then plays the illegal move Kh8 >>>since it determines which squares are not attacked by white using the >>>PieceAttacks structure (which is just a set of bits indicating which squares are >>>attacked by which piece in a given position). >>> >>>Now, I am adding code to avoid this problem, but without generating ALL moves >>>ahead of time and checking for legality after illegal moves have been generated, >>>does anyone else have a program which does this up front? And if so, is there a >>>slick way of doing it (my method is kind of clumsy)? >>> >>>KarinsDad :) >> >> >>With bitmaps this is easy to do... just make sure you move the king in any >>direction _but_ the direction the check comes from. Then Kh8 would not be >>generated at all... > > >This is basically what I am doing to correct it, but I put the correction into >the PieceAttacks creation routine as opposed to the Move Generation routine. > >I added variables for two illegal squares to my Position Information structure. >When the PieceAttacks structure gets created, the code determines whether there >are any sliding pieces attacking the king and then creates an illegal square >behind the king in that direction. The reason for 2 such squares is that a >double discovered check could result in a rook and a bishop/queen checking the >king simultaneously (and eliminating 2 squares). > >The reason I did not like this solution is that I had to put about 12 lines of >code into about a dozen places to set these squares (I hardwired it since a >macro or function would have required about 5 variables passed in, I might have >to bite the bullet and create a macro after all) and I had to then check these >squares in my move generator. I was hoping there was an easier way. > >I initially thought about doing it in the Move Generation routine, but realized >that some of the temporary data that I already create in the PieceAttacks >creation routine would then have to be re-created in Move Generation and I >didn't want to do that. > >KarinsDad :) With bitmaps you eliminate Kh8 the same way you eliminate Kf8. By noticing that if a sliding piece checks you, you have to move in any other direction but the direction of the slider. Then you cull the two moves at one time...
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.