MBCMoveGenerator.h [plain text]
#import "MBCBoard.h"
@protocol MBCMoveBuilder
- (void) startMoveList:(BOOL)white;
- (void) startUnambiguousMoves;
- (void) endMoveList;
- (void) validMove:(MBCPiece)piece from:(MBCSquare)from to:(MBCSquare)to;
- (void) validMove:(MBCPiece)piece from:(MBCSquare)from to:(MBCSquare)to
capturing:(MBCPiece)victim;
- (void) validDrop:(MBCPiece)piece at:(MBCSquare)at;
- (void) validCastle:(MBCPiece)king kingSide:(BOOL)kingSide;
@end
@interface MBCMoveCounter : NSObject <MBCMoveBuilder> {
int fCount;
bool fCounting;
}
- (int)count;
@end
@interface MBCDebugMoveBuilder : NSObject <MBCMoveBuilder> {
bool fUnambiguous;
NSMutableArray * fMoves;
NSMutableArray * fUnambiguousMoves;
NSMutableArray * fDrops;
}
+ (id)debugMoveBuilder;
@end
typedef uint64_t MBCBoardMask;
struct MBCPieceMoves {
int fNumInstances; MBCSquare fFrom[16];
MBCBoardMask fTo[16];
};
struct MBCMoveCollection {
MBCPieceMoves fMoves[7];
MBCPieceMoves fUnambiguousMoves[7];
MBCBoardMask fPawnDrops;
MBCBoardMask fPieceDrops;
char fDroppablePieces;
bool fCastleKingside;
bool fCastleQueenside;
bool fWhiteMoves;
void AddMove(bool unambig, MBCPiece piece, MBCSquare from, MBCSquare to);
void AddDrop(MBCPiece piece, MBCSquare at);
void AddCastle(bool kingSide);
};
@interface MBCMoveCollector : NSObject <MBCMoveBuilder> {
bool fUnambiguous;
MBCMoveCollection fCollection;
};
- (MBCMoveCollection *) collection;
@end
class MBCMoveGenerator {
public:
MBCMoveGenerator(id <MBCMoveBuilder> builder, MBCVariant variant, long flags);
void SetVariant(MBCVariant variant);
void Generate(bool white, const MBCPieces & position);
void Ambiguities(MBCSquare from, MBCSquare to, const MBCPieces & position);
bool InCheck(bool white, const MBCPieces & position);
private:
bool TryMove(MBCPiece piece, MBCSquare from, MBCSquare to);
bool TryMove(MBCPiece piece, MBCSquare from, int dCol, int dRow);
void TryMoves(MBCPiece piece, MBCSquare from, int dCol, int dRow);
void TryMoves(MBCPiece piece, MBCSquare from);
void TryCastle();
void TryDrops();
void TryMoves(bool unambiguous);
id <MBCMoveBuilder> fBuilder;
long fFlags;
MBCVariant fVariant;
MBCPieceCode fColor;
MBCPiece fPieceFilter;
MBCSquare fTargetFilter;
const MBCPieces * fPosition;
bool fUnambiguous;
uint8_t fTargetUsed[64];
uint8_t fTargetAmbiguous[64];
};