Esempio n. 1
0
/**
 * @brief  main 
 *
 * @param  argc
 * @param  argv[]
 *
 * @return  
 */
int main ( int argc, char *argv[] ) { 
	char board[N][N] = { {0,0} };
//	int *player = &Player;
	int x = 0, y =0;
	int flag = 2;
	status s = -1;
	CreateBoard(board);
	while ( true ) {
		PrintBoard(board, x, y);
		PrintInfo(flag, Player);
		if ( s == WIN ) {
			printf ( "\033[33mSome one win!\n\033[0m" );
			break;
		}
		s = PlayChess(board, Player, &x, &y);
		if ( s == -1 ) continue;
		if ( s == RES ) {
			printf ( "Someone rescinded!\n" );
		}
		if ( s == QUIT ) {
			printf ( "Gave Over\n" );
			break;
		}
		s =  CheckBoard(board, Player, &x,&y);
		Player = ( Player + 1 ) % 2;

	}
	return EXIT_SUCCESS;
}				/* ----------  end of function main  ---------- */
Esempio n. 2
0
void PerftTest(int depth, S_BOARD *pos) {
	S_MOVELIST list[1];
	int move;
	int MoveNum = 0;
	int start = GetTimeMs();
	long cumnodes, oldnodes;

	ASSERT(CheckBoard(pos));

	PrintBoard(pos);
	printf("\nStarting Test To Depth:%d\n", depth);
	leafNodes = 0;
	
	GenerateAllMoves(pos, list);

	for(MoveNum = 0; MoveNum < list->count; ++MoveNum) {
		move = list->moves[MoveNum].move;
		if(!MakeMove(pos, move))
			continue;

		cumnodes = leafNodes;
		Perft(depth - 1, pos);
		TakeMove(pos);
		oldnodes = leafNodes - cumnodes;
		printf("move %d : %s : %ld\n", MoveNum + 1, PrMove(move), oldnodes);
	}

	printf("\nTest Complete : %ld nodes visited in %dms\n", leafNodes, GetTimeMs() - start);
}
// next move, moves to a different player
// the NextMove function
void NextMove()
{
	if(Player == 1)
	{
		Player = 2;
	}
	else
	{
		Player = 1;
	}

	Drop.Play();

	int Winner = 0;
	if(CheckBoard(Winner) == true)
	{
		GameOver = true;
		GameWinner = Winner;
		if(GameWinner == 0)
		{
		CatsGameSound.Play();
		}
		else
		{
		GameOverSound.Play();
		}
	}
}
Esempio n. 4
0
void Queen(int * board, int n)
{
	Stack * StateStack;
	if ( CreateStack(&StateStack, sizeof(State), n * n) == false )
	{
		printf("Loi: Khong du bo nho!\n");
		exit(0);
	}
	
	int i, k;
	
	i = 0;
	k = 0;
	
	State * state;
	
	do
	{
		if (k < n)
		{
			for (i = 0; i < n; ++i)
			{
				state = CreateState(k, i);
				push(StateStack, state);
			}
		}
		
		state = pop(StateStack);
		k = state->k;
		i = state->i;
		board[k] = i;
		
		free(state);
		
		if (k == n - 1)
		{
			do
			{
				if (CheckBoard(board, n) == true)
				{
					Mark(board, n);
				}
				
				state = pop(StateStack);
				k = state->k;
				i = state->i;
				board[k] = i;
				
				free(state);
				
			} while (k == n-1);
		}
		
		++k;
		
	} while (CheckEmpty(StateStack) != true);
	
	DestroyStack(StateStack);
}
Esempio n. 5
0
static void AddEnPassantMove(const CHESS_BOARD *pos, int move, MOVELIST *list) {

	ASSERT(SqOnBoard(FROMSQ(move)));
	ASSERT(SqOnBoard(TOSQ(move)));
	ASSERT(CheckBoard(pos));
	ASSERT((RanksBrd[TOSQ(move)] == RANK_6 && pos->side == WHITE) || (RanksBrd[TOSQ(move)] == RANK_3 && pos->side == BLACK));

	list->moves[list->count].move = move;
	list->moves[list->count].score = 105 + 1000000;
	list->count++;
}
Esempio n. 6
0
static void AddCaptureMove(const CHESS_BOARD *pos, int move, MOVELIST *list) {

	ASSERT(SqOnBoard(FROMSQ(move)));
	ASSERT(SqOnBoard(TOSQ(move)));
	ASSERT(PieceValid(CAPTURED(move)));
	ASSERT(CheckBoard(pos));

	list->moves[list->count].move = move;
	list->moves[list->count].score = MvvLvaScores[CAPTURED(move)][pos->pieces[FROMSQ(move)]] + 1000000;
	list->count++;
}
Esempio n. 7
0
void InputMap(int *x,int*y)
{
  int inputX,inputY;
  char inpx[5],inpy[5];

  /*手盤の反転*/
  color = FlipColor(color);
  CheckBoard();

  while(1){
    if(color == 1){
      printf("BLACK TURN    Pass -> -1\n");
    }else{
      printf("WHITE TURN    Pass -> -1\n");
    }

    /*手の入力*/
    printf("x -> ");
    fgets(inpx,5,stdin);
    inputX = atoi(inpx);

    /* Pass */
    if(inputX == -1){
      move++;
      printf("Pass\n");
      break;
    }

    printf("y -> ");
    fgets(inpy,5,stdin);
    inputY = atoi(inpy);

    if(inputX != 0 && inputY != 0 && inputX <= B_SIZE && inputY <= B_SIZE){
      break;
    }

    printf("Try Again! Input is 1 ~ %d.\n",B_SIZE);
    printf("If you want to exit,please enter -1 twice.\n");

  }

  if(inputX == -1 && color == 1){
    *x = 0;
  }else if(inputX == -1 && color == 2){
    *y = 0;
  }else{
    *x = inputX;
    *y = inputY;
  }
}
Esempio n. 8
0
static void AddBlackPawnMove(const CHESS_BOARD *pos, const int from, const int to, MOVELIST *list) {

	ASSERT(SqOnBoard(from));
	ASSERT(SqOnBoard(to));
	ASSERT(CheckBoard(pos));

	if (RanksBrd[from] == RANK_2) {
		AddQuietMove(pos, MOVE(from, to, EMPTY, bQ, 0), list);
		AddQuietMove(pos, MOVE(from, to, EMPTY, bR, 0), list);
		AddQuietMove(pos, MOVE(from, to, EMPTY, bB, 0), list);
		AddQuietMove(pos, MOVE(from, to, EMPTY, bN, 0), list);
	}
	else {
		AddQuietMove(pos, MOVE(from, to, EMPTY, EMPTY, 0), list);
	}
}
Esempio n. 9
0
static void AddBlackPawnCapMove(const CHESS_BOARD *pos, const int from, const int to, const int cap, MOVELIST *list) {

	ASSERT(PieceValidEmpty(cap));
	ASSERT(SqOnBoard(from));
	ASSERT(SqOnBoard(to));
	ASSERT(CheckBoard(pos));

	if (RanksBrd[from] == RANK_2) {
		AddCaptureMove(pos, MOVE(from, to, cap, bQ, 0), list);
		AddCaptureMove(pos, MOVE(from, to, cap, bR, 0), list);
		AddCaptureMove(pos, MOVE(from, to, cap, bB, 0), list);
		AddCaptureMove(pos, MOVE(from, to, cap, bN, 0), list);
	}
	else {
		AddCaptureMove(pos, MOVE(from, to, cap, EMPTY, 0), list);
	}
}
Esempio n. 10
0
int ParseMove(char *ptrChar, CHESS_BOARD *pos) {

	ASSERT(CheckBoard(pos));

	if (ptrChar[1] > '8' || ptrChar[1] < '1') return NOMOVE;
	if (ptrChar[3] > '8' || ptrChar[3] < '1') return NOMOVE;
	if (ptrChar[0] > 'h' || ptrChar[0] < 'a') return NOMOVE;
	if (ptrChar[2] > 'h' || ptrChar[2] < 'a') return NOMOVE;

	int from = FR2SQ(ptrChar[0] - 'a', ptrChar[1] - '1');
	int to = FR2SQ(ptrChar[2] - 'a', ptrChar[3] - '1');

	ASSERT(SqOnBoard(from) && SqOnBoard(to));

	MOVELIST list[1];
	GenerateAllMoves(pos, list);
	int MoveNum = 0;
	int Move = 0;
	int PromPce = EMPTY;

	for (MoveNum = 0; MoveNum < list->count; ++MoveNum) {
		Move = list->moves[MoveNum].move;
		if (FROMSQ(Move) == from && TOSQ(Move) == to) {
			PromPce = PROMOTED(Move);
			if (PromPce != EMPTY) {
				if (IsRQ(PromPce) && !IsBQ(PromPce) && ptrChar[4] == 'r') {
					return Move;
				}
				else if (!IsRQ(PromPce) && IsBQ(PromPce) && ptrChar[4] == 'b') {
					return Move;
				}
				else if (IsRQ(PromPce) && IsBQ(PromPce) && ptrChar[4] == 'q') {
					return Move;
				}
				else if (IsKn(PromPce) && ptrChar[4] == 'n') {
					return Move;
				}
				continue;
			}
			return Move;
		}
	}

	return NOMOVE;
}
Esempio n. 11
0
void KlondikeView::Cheat() {
	for (short i = 0; i < 4; i++) {
		fFoundationsColors[i] = i;
		fFoundations[i] = 12;
	}
	
	for (short i = 0; i < 7; i++) {
		_RemoveCardFromPile(i, fBoard[i]);
	}
	
	for (short i = 0; i < 24; i++) {
		fStock[i]->fRevealed = true;
	}
	
	Invalidate();
	
	CheckBoard();
}
Esempio n. 12
0
void MirrorBoard(S_BOARD *pos) {

    int tempPiecesArray[64];
    int tempSide = pos->side^1;
	int SwapPiece[13] = { EMPTY, bP, bN, bB, bR, bQ, bK, wP, wN, wB, wR, wQ, wK };
    int tempCastlePerm = 0;
    int tempEnPas = NO_SQ;

	int sq;
	int tp;

    if (pos->castlePerm & WKCA) tempCastlePerm |= BKCA;
    if (pos->castlePerm & WQCA) tempCastlePerm |= BQCA;

    if (pos->castlePerm & BKCA) tempCastlePerm |= WKCA;
    if (pos->castlePerm & BQCA) tempCastlePerm |= WQCA;

	if (pos->enPas != NO_SQ)  {
        tempEnPas = SQ120(Mirror64[SQ64(pos->enPas)]);
    }

    for (sq = 0; sq < 64; sq++) {
        tempPiecesArray[sq] = pos->pieces[SQ120(Mirror64[sq])];
    }

    ResetBoard(pos);

	for (sq = 0; sq < 64; sq++) {
        tp = SwapPiece[tempPiecesArray[sq]];
        pos->pieces[SQ120(sq)] = tp;
    }

	pos->side = tempSide;
    pos->castlePerm = tempCastlePerm;
    pos->enPas = tempEnPas;

    pos->posKey = GeneratePosKey(pos);

	UpdateListsMaterial(pos);

    ASSERT(CheckBoard(pos));
}
Esempio n. 13
0
static void AddQuietMove(const CHESS_BOARD *pos, int move, MOVELIST *list) {

	ASSERT(SqOnBoard(FROMSQ(move)));
	ASSERT(SqOnBoard(TOSQ(move)));
	ASSERT(CheckBoard(pos));
	ASSERT(pos->ply >= 0 && pos->ply < MAXDEPTH);

	list->moves[list->count].move = move;

	if (pos->searchKillers[0][pos->ply] == move) {
		list->moves[list->count].score = 900000;
	}
	else if (pos->searchKillers[1][pos->ply] == move) {
		list->moves[list->count].score = 800000;
	}
	else {
		list->moves[list->count].score = pos->searchHistory[pos->pieces[FROMSQ(move)]][TOSQ(move)];
	}
	list->count++;
}
Esempio n. 14
0
void KlondikeView::Pulse()
{
	if (fDoubleClick > -1)
		fDoubleClick--;
	
	if (fAutoPlayStarted) {
		if (fAutoPlayCountdown > -1) {
			fAutoPlayCountdown--;
			return;
		}

		if (!MoveOneToFoundation()) {
			fAutoPlayStarted = false;
			CheckBoard();
		}
		Invalidate();
		
		fAutoPlayCountdown = 1;
	} else
		fAutoPlayCountdown = -1;
}
Esempio n. 15
0
void Perft(int depth, S_BOARD *pos) {
	S_MOVELIST list[1];
	int MoveNum = 0;

	ASSERT(CheckBoard(pos));

	if(depth == 0) {
		leafNodes++;
		return;
	}

	GenerateAllMoves(pos, list);

	for(MoveNum = 0; MoveNum < list->count; ++MoveNum) {
		if(!MakeMove(pos, list->moves[MoveNum].move)) {
			continue;
		}

		Perft(depth - 1, pos);
		TakeMove(pos);
	}

	return;
}
Esempio n. 16
0
void KlondikeView::MouseUp(BPoint point)
{
	if (fIsCardPicked) {
		int hSpacing = _CardHSpacing();
		short stack = (int)((point.x - hSpacing) / (CARD_WIDTH + hSpacing));

		if (stack >= 3 && stack < 7 && point.y < 15 + CARD_HEIGHT) {
			short foundation = stack - 3;
			
			if (fPickedCard->fValue == 0)
				fFoundationsColors[foundation] = fPickedCard->fColor;
			
			if (fFoundationsColors[foundation] == fPickedCard->fColor
				&& fPickedCard->fValue - fFoundations[foundation] == 1) {
				fFoundations[foundation]++;
				if (_FindLastUsed(fPickedCardBoardPos) != NULL)
						_FindLastUsed(fPickedCardBoardPos)->fRevealed = true;
				
				fPoints += 10;
				
				CheckBoard();
			} else
				_AddCardToPile(fPickedCardBoardPos, fPickedCard);
		}
		

		else if (stack >= 0 && stack < 7 && (_FindLastUsed(stack) == NULL
			|| (_FindLastUsed(stack)->fValue - fPickedCard->fValue == 1
			&& _FindLastUsed(stack)->fIsColorRed
			!= fPickedCard->fIsColorRed)) && fIsCardPicked
			&& point.y > 2 * 15 + CARD_HEIGHT) {
			// attach to stack, only kings on empty fields
			if (!(fPickedCard-> fValue != 12 && fBoard[stack] == NULL)) {
				_AddCardToPile(stack, fPickedCard);
			
				// reveal last card from pile the cards were from
				if (_FindLastUsed(fPickedCardBoardPos) != NULL) {
					_FindLastUsed(fPickedCardBoardPos)->fRevealed = true;
					
					if (stack != fPickedCardBoardPos)
						fPoints += 5;
				}
			} else
				_AddCardToPile(fPickedCardBoardPos, fPickedCard);
		} else {
			// reattach to old stack
			_AddCardToPile(fPickedCardBoardPos, fPickedCard);
		}

		fIsCardPicked = false;

		Invalidate();
		
		return;
	}
	
	if (fIsWasteCardPicked) {
		int hSpacing = _CardHSpacing();
		short stack = (int)((point.x - hSpacing) / (CARD_WIDTH + hSpacing));
		
		if (stack >= 3 && stack < 7 && point.y < 18 + CARD_HEIGHT) {
			short foundation = stack - 3;
			
			if (fPickedCard->fValue == 0)
				fFoundationsColors[foundation] = fPickedCard->fColor;
			
			if (fFoundationsColors[foundation] == fPickedCard->fColor
				&& fPickedCard->fValue - fFoundations[foundation] == 1) {
				fFoundations[foundation]++;
				fPickedCard->fRevealed = true;
				
				fWasteCard--;
				while (fWasteCard != -1 && fStock[fWasteCard]->fRevealed)
					fWasteCard--;
				
				fPoints += 10;
				
				CheckBoard();
			}
		}
		
		else if (stack >= 0 && stack < 7 && (_FindLastUsed(stack) == NULL
				|| _FindLastUsed(stack)->fValue - fPickedCard->fValue == 1)) {
			// attach to stack, only kings on empty fields
			if (!(fPickedCard-> fValue != 12 && fBoard[stack] == NULL)) {
				_AddCardToPile(stack, fPickedCard);
			
				fPickedCard->fRevealed = true;
				
				fWasteCard--;
				while (fWasteCard != -1 && fStock[fWasteCard]->fRevealed)
					fWasteCard--;
					
				fPoints += 5;
			}
		}

		fIsWasteCardPicked = false;

		Invalidate();
	}
	
	if (fIsFoundationCardPicked) {
		int hSpacing = _CardHSpacing();
		short stack = (int)((point.x - hSpacing) / (CARD_WIDTH + hSpacing));
		
		if (stack >= 0 && stack < 7 && (_FindLastUsed(stack) == NULL
				|| _FindLastUsed(stack)->fValue - fPickedCard->fValue == 1)) {
			// attach to stack
			_AddCardToPile(stack, fPickedCard);
			
			if (fFoundations[fPickedCardBoardPos] == -1)
				fFoundationsColors[fPickedCardBoardPos] = -1;
			
			fPoints -= 15;
			if (fPoints < 0)
				fPoints = 0;
		} else {
			fFoundations[fPickedCardBoardPos]++;
		}

		fIsFoundationCardPicked = false;

		Invalidate();
	}

	fMouseLock = false;
}
Esempio n. 17
0
void KlondikeView::MouseDown(BPoint point)
{
	if (fMouseLock)
		return;
	fMouseLock = true;
	
	uint32 mouse;
	GetMouse(&point, &mouse);
	
	if (mouse == B_SECONDARY_MOUSE_BUTTON) {
		// stop auto-play if it's started
		if (fAutoPlayStarted) {
			fAutoPlayStarted = false;
			return;
		}
		
		if (fQuickAutoPlay) {
			while(MoveOneToFoundation());
			
			Invalidate();
			CheckBoard();
		}
		else {
			fAutoPlayStarted = true;
		}
		
		return;
	}

	int hSpacing = _CardHSpacing();
	
	short stack = (int)((point.x - hSpacing) / (CARD_WIDTH + hSpacing));
	
	if (point.x > (stack + 1) * (CARD_WIDTH + hSpacing))
		return;
	
	// stock
	if (point.y < 15 + CARD_HEIGHT && point.y > 15
		&& stack == 0 && point.x > hSpacing) {
		int revealed = 0;
		for (short i = 0; i < 24; i++)
			if (fStock[i]->fRevealed)
				revealed++;
		
		if (revealed < 24 && ++fWasteCard == 24) {
			fWasteCard = -1;
			
			fPoints -= 100;
			if (fPoints < 0)
				fPoints = 0;
		}
		
		Invalidate();
		return;
	}
	
	// pick up a card from waste
	if (stack == 1 && point.y < 15 + CARD_HEIGHT) {		
		if (fWasteCard == -1)
			return;
		
		if (fDoubleClick == -1)
			fDoubleClick = 1;
		else if (fDoubleClick > -1) {
			_MoveWasteToFoundation();
			
			CheckBoard();	
			Invalidate();
			fDoubleClick = -1;
			
			return;
		}
		
		card* picked = fStock[fWasteCard];
		fPickedCard = picked;
		fIsWasteCardPicked = true;
		
		BMessage msg(B_SIMPLE_DATA);
		msg.AddPointer("view", this);
		BBitmap* img = new BBitmap(
			fCards[picked->fColor * CARDS_IN_SUIT + picked->fValue]);
		
		DragMessage(&msg, img, B_OP_BLEND,
			BPoint((int)(point.x - hSpacing) % (CARD_WIDTH + hSpacing),
			point.y - 15));
		
		Invalidate();
		
		return;
	}
	
	// pick up a card from a foundation
	if (stack > 2 && stack < 7 && point.y < 15 + CARD_HEIGHT) {
		short foundation = stack - 3;
		short value = fFoundations[foundation];
		short color = fFoundationsColors[foundation];
		
		if (fFoundations[foundation] == -1)
			return;
		
		// find picked card
		for (short i = 0; i < CARDS_IN_DECK; i++) {
			if (fAllCards[i]->fValue == value
				&& fAllCards[i]->fColor == color)
			fPickedCard = fAllCards[i];
		}
		
		BMessage msg(B_SIMPLE_DATA);
		msg.AddPointer("view", this);
		BBitmap* img = new BBitmap(
			fCards[fPickedCard->fColor * CARDS_IN_SUIT + fPickedCard->fValue]);
		
		fIsFoundationCardPicked = true;
		fPickedCardBoardPos = foundation;
		fFoundations[foundation]--;
		
		DragMessage(&msg, img, B_OP_BLEND,
			BPoint((int)(point.x - hSpacing) % (CARD_WIDTH + hSpacing),
			point.y - 15));
		
		Invalidate();
		
		return;
	}

	// pick up a stack
	if (stack < 7 && fBoard[stack] != NULL
		&& point.x > hSpacing && point.y > 2 * 15 + CARD_HEIGHT) {
		// find clicked on card
		int cardNumber = 1;
		card* picked = fBoard[stack];
		while (picked->fNextCard != NULL) {
			if (point.y - 18 * cardNumber - CARD_HEIGHT - 15 < 18) {
				break;
			}
			picked = picked->fNextCard;
			cardNumber++;
		}
		if (picked->fNextCard == NULL) {
			// on last card, if below than not clicking on card
			if (point.y - 18 * cardNumber - CARD_HEIGHT - 15 >= CARD_HEIGHT) {
				return;
			}
			
			if (fDoubleClick == -1)
				fDoubleClick = 1;
			else if (fDoubleClick > -1 && fAutoPlayEnabled) {
				MoveOneToFoundation(stack, stack);
				
				CheckBoard();	
				Invalidate();
				fDoubleClick = -1;
				
				return;
			}
		}
		
		if (picked->fRevealed == false)
			return;
		
		card* currentCard = picked->fNextCard;
		card* lastCard = picked;
		short pickedHeight = 1;
		for (short i = 1; currentCard != NULL;
				i++) {
			pickedHeight++;
			if (lastCard->fIsColorRed == currentCard->fIsColorRed)
				return;
			lastCard = currentCard;
			currentCard = currentCard->fNextCard;
		}
		
		fPickedCardBoardPos = stack;
		fPickedCard = picked;
		fIsCardPicked = true;

		_RemoveCardFromPile(stack, picked);

		BMessage msg(B_SIMPLE_DATA);
		msg.AddPointer("view", this);
		BBitmap* img;
		if (pickedHeight == 1)
			img = new BBitmap(
				fCards[picked->fColor * CARDS_IN_SUIT + picked->fValue]);
		else {
			img = new BBitmap(BRect(0, 0, CARD_WIDTH - 1,
				CARD_HEIGHT + (pickedHeight - 1) * 18),
				fBack[0]->ColorSpace(), true);
			BView* imgView = new BView(img->Bounds(), NULL, 0, 0);
			BRect destRect = fBack[0]->Bounds();
			img->AddChild(imgView);
			img->Lock();
			currentCard = picked;

			imgView->SetDrawingMode(B_OP_COPY);
			imgView->DrawBitmap(fCards
				[currentCard->fColor * CARDS_IN_SUIT + currentCard->fValue],
				destRect);
			destRect.top = (pickedHeight - 1) * 18;
			destRect.bottom = destRect.top + CARD_HEIGHT;

			imgView->DrawBitmap(fBack[0], destRect);
				// we don't know the top card yet, so we'll overwrite this

			imgView->SetDrawingMode(B_OP_ALPHA);
			for (short j = 0; j < pickedHeight; j++) {
				destRect.top = j * 18;
				destRect.bottom = destRect.top + CARD_HEIGHT;
				imgView->DrawBitmap(fCards[currentCard->fColor
					* CARDS_IN_SUIT + currentCard->fValue], destRect);
				currentCard = currentCard->fNextCard;
			}
			
			imgView->Sync();
			img->Unlock();
			img->RemoveChild(imgView);
			delete imgView;
		}
		DragMessage(&msg, img, B_OP_BLEND,
			BPoint((int)(point.x - hSpacing) % (CARD_WIDTH + hSpacing),
			point.y - cardNumber * 18 - 131));
		
		Invalidate();
	}
}
Esempio n. 18
0
void GenerateAllMoves(const CHESS_BOARD *pos, MOVELIST *list) {

	ASSERT(CheckBoard(pos));

	list->count = 0;

	int pce = EMPTY;
	int side = pos->side;
	int sq = 0; int t_sq = 0;
	int pceNum = 0;
	int dir = 0;
	int index = 0;
	int pceIndex = 0;

	if (side == WHITE) {

		for (pceNum = 0; pceNum < pos->pieceNum[wP]; ++pceNum) {
			sq = pos->pList[wP][pceNum];
			ASSERT(SqOnBoard(sq));

			if (pos->pieces[sq + 10] == EMPTY) {
				AddWhitePawnMove(pos, sq, sq + 10, list);
				if (RanksBrd[sq] == RANK_2 && pos->pieces[sq + 20] == EMPTY) {
					AddQuietMove(pos, MOVE(sq, (sq + 20), EMPTY, EMPTY, MFLAGPS), list);
				}
			}

			if (!SQOFFBOARD(sq + 9) && PieceCol[pos->pieces[sq + 9]] == BLACK) {
				AddWhitePawnCapMove(pos, sq, sq + 9, pos->pieces[sq + 9], list);
			}
			if (!SQOFFBOARD(sq + 11) && PieceCol[pos->pieces[sq + 11]] == BLACK) {
				AddWhitePawnCapMove(pos, sq, sq + 11, pos->pieces[sq + 11], list);
			}

			if (pos->enPas != NO_SQ) {
				if (sq + 9 == pos->enPas) {
					AddEnPassantMove(pos, MOVE(sq, sq + 9, EMPTY, EMPTY, MFLAGEP), list);
				}
				if (sq + 11 == pos->enPas) {
					AddEnPassantMove(pos, MOVE(sq, sq + 11, EMPTY, EMPTY, MFLAGEP), list);
				}
			}
		}

		if (pos->castlePerm & WKCA) {
			if (pos->pieces[F1] == EMPTY && pos->pieces[G1] == EMPTY) {
				if (!SqAttacked(E1, BLACK, pos) && !SqAttacked(F1, BLACK, pos)) {
					AddQuietMove(pos, MOVE(E1, G1, EMPTY, EMPTY, MFLAGCA), list);
				}
			}
		}

		if (pos->castlePerm & WQCA) {
			if (pos->pieces[D1] == EMPTY && pos->pieces[C1] == EMPTY && pos->pieces[B1] == EMPTY) {
				if (!SqAttacked(E1, BLACK, pos) && !SqAttacked(D1, BLACK, pos)) {
					AddQuietMove(pos, MOVE(E1, C1, EMPTY, EMPTY, MFLAGCA), list);
				}
			}
		}

	}
	else {

		for (pceNum = 0; pceNum < pos->pieceNum[bP]; ++pceNum) {
			sq = pos->pList[bP][pceNum];
			ASSERT(SqOnBoard(sq));

			if (pos->pieces[sq - 10] == EMPTY) {
				AddBlackPawnMove(pos, sq, sq - 10, list);
				if (RanksBrd[sq] == RANK_7 && pos->pieces[sq - 20] == EMPTY) {
					AddQuietMove(pos, MOVE(sq, (sq - 20), EMPTY, EMPTY, MFLAGPS), list);
				}
			}

			if (!SQOFFBOARD(sq - 9) && PieceCol[pos->pieces[sq - 9]] == WHITE) {
				AddBlackPawnCapMove(pos, sq, sq - 9, pos->pieces[sq - 9], list);
			}

			if (!SQOFFBOARD(sq - 11) && PieceCol[pos->pieces[sq - 11]] == WHITE) {
				AddBlackPawnCapMove(pos, sq, sq - 11, pos->pieces[sq - 11], list);
			}
			if (pos->enPas != NO_SQ) {
				if (sq - 9 == pos->enPas) {
					AddEnPassantMove(pos, MOVE(sq, sq - 9, EMPTY, EMPTY, MFLAGEP), list);
				}
				if (sq - 11 == pos->enPas) {
					AddEnPassantMove(pos, MOVE(sq, sq - 11, EMPTY, EMPTY, MFLAGEP), list);
				}
			}
		}

		// castling
		if (pos->castlePerm &  BKCA) {
			if (pos->pieces[F8] == EMPTY && pos->pieces[G8] == EMPTY) {
				if (!SqAttacked(E8, WHITE, pos) && !SqAttacked(F8, WHITE, pos)) {
					AddQuietMove(pos, MOVE(E8, G8, EMPTY, EMPTY, MFLAGCA), list);
				}
			}
		}

		if (pos->castlePerm &  BQCA) {
			if (pos->pieces[D8] == EMPTY && pos->pieces[C8] == EMPTY && pos->pieces[B8] == EMPTY) {
				if (!SqAttacked(E8, WHITE, pos) && !SqAttacked(D8, WHITE, pos)) {
					AddQuietMove(pos, MOVE(E8, C8, EMPTY, EMPTY, MFLAGCA), list);
				}
			}
		}
	}

	/* Loop for slide pieces */
	pceIndex = LoopSlideIndex[side];
	pce = LoopSlidePce[pceIndex++];
	while (pce != 0) {
		ASSERT(PieceValid(pce));

		for (pceNum = 0; pceNum < pos->pieceNum[pce]; ++pceNum) {
			sq = pos->pList[pce][pceNum];
			ASSERT(SqOnBoard(sq));

			for (index = 0; index < NumDir[pce]; ++index) {
				dir = PceDir[pce][index];
				t_sq = sq + dir;

				while (!SQOFFBOARD(t_sq)) {
					// BLACK ^ 1 == WHITE       WHITE ^ 1 == BLACK
					if (pos->pieces[t_sq] != EMPTY) {
						if (PieceCol[pos->pieces[t_sq]] == (side ^ 1)) {
							AddCaptureMove(pos, MOVE(sq, t_sq, pos->pieces[t_sq], EMPTY, 0), list);
						}
						break;
					}
					AddQuietMove(pos, MOVE(sq, t_sq, EMPTY, EMPTY, 0), list);
					t_sq += dir;
				}
			}
		}

		pce = LoopSlidePce[pceIndex++];
	}

	/* Loop for non slide */
	pceIndex = LoopNonSlideIndex[side];
	pce = LoopNonSlidePce[pceIndex++];

	while (pce != 0) {
		ASSERT(PieceValid(pce));

		for (pceNum = 0; pceNum < pos->pieceNum[pce]; ++pceNum) {
			sq = pos->pList[pce][pceNum];
			ASSERT(SqOnBoard(sq));

			for (index = 0; index < NumDir[pce]; ++index) {
				dir = PceDir[pce][index];
				t_sq = sq + dir;

				if (SQOFFBOARD(t_sq)) {
					continue;
				}

				// BLACK ^ 1 == WHITE       WHITE ^ 1 == BLACK
				if (pos->pieces[t_sq] != EMPTY) {
					if (PieceCol[pos->pieces[t_sq]] == (side ^ 1)) {
						AddCaptureMove(pos, MOVE(sq, t_sq, pos->pieces[t_sq], EMPTY, 0), list);
					}
					continue;
				}
				AddQuietMove(pos, MOVE(sq, t_sq, EMPTY, EMPTY, 0), list);
			}
		}

		pce = LoopNonSlidePce[pceIndex++];
	}

	//ASSERT(MoveListOk(list, pos));
}
Esempio n. 19
0
int IsSqAttack(int sq,int side,BOARD *board) {

	ASSERT(sq>=0 && sq<120);
	ASSERT(CheckBoard(board));
	int pce,index,t_sq,dir;
	if(board->Pieces[sq]==OFF)
		return FALSE;	
	//make sure that the pce u are looking forward to be attack by is actually present on that square
	//i.e the square is not OFF or EMPTY....
	// pawns	
	if(side == WHITE)
	{
		if(board->Pieces[sq-11]==wP||board->Pieces[sq-9]==wP)
			return TRUE;
	} 
	else 
	{
		if(board->Pieces[sq+11]==bP||board->Pieces[sq+9]==bP)
			return TRUE;	
	}
	// knights
	for(index = 0; index < 8; ++index)
	{		
		pce = board->Pieces[sq + KnDir[index]];
		if(pce>=wP && pce<=bK && IsKnight[pce] && PceCol[pce]==side)
			return TRUE;
	}
	// rooks, queens in rooks(horizontal,vertical) direction
	for(index = 0; index < 4; ++index) 
	{		
		dir = RkDir[index];
		t_sq = sq + dir;
		pce = board->Pieces[t_sq];
		while(pce != OFF) 
		{
			if(pce != EMPTY)
			{
				if(IsRQ[pce] && PceCol[pce] == side)
					return TRUE;
				break;
			}
			t_sq += dir;
			pce = board->Pieces[t_sq];
		}
	}
	// bishops, queens in bishop(diagnol) direction
	for(index = 0; index < 4; ++index) 
	{		
		dir = BiDir[index];
		t_sq = sq + dir;
		pce = board->Pieces[t_sq];
		while(pce != OFF) 
		{
			if(pce != EMPTY)
			{
				if(IsBQ[pce] && PceCol[pce] == side)
					return TRUE;
				break;
			}
			t_sq += dir;
			pce = board->Pieces[t_sq];
		}
	}
	// kings are the same as knights with 8 directions
	for(index = 0; index < 8; ++index) 
	{		
		pce = board->Pieces[sq + KiDir[index]];
		if(pce>=wP && pce<=bK && IsKing[pce] && PceCol[pce]==side)
			return TRUE;
	}
	return FALSE;
}
Esempio n. 20
0
INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_INITDIALOG:
	{
		SetEditsLimit(hwndDlg);

		//SetEntireBoard(hwndDlg); // HACK(Daniel): this will set the entire displayed board to zero since the variable is initialized to zero
		// NOTE(Daniel): if we uncomment it becomes annoying to enter new numbers

		return TRUE;
	} break;
	
	case WM_COMMAND:
	{
		int control_code = HIWORD(wParam);
		int control_identifier = LOWORD(wParam);
		switch (control_identifier)
		{
			case ID_BTN_SOLVE:
			{
				GetEntireBoard(hwndDlg);

				RecursiveBacktrackDS rbds = { 0, 0, true, false, false };
				RecursiveBacktrackFill(&rbds);
				
				if (rbds.impossible)
				{
					MessageBox(0, "Board has no solution...", "Message", 0);
				}
				
				SetEntireBoard(hwndDlg);
				
				if (!CheckBoard())
				{
					MessageBox(0, "Board not Ok!!!", "Message", 0);
				}
				else
				{
					MessageBox(0, "Board Ok!!!", "Message", 0);
				}

				SetFocus(hwndDlg);
			} break;

			case ID_BTN_EXIT:
			{
				running = false;
			} break;
		}

		return TRUE;
	} break;

	case WM_QUIT:
	case WM_CLOSE:
	{
		running = false;
	} break;
	}

	return FALSE;
}
Esempio n. 21
0
void GenerateAllCaps(const CHESS_BOARD *pos, MOVELIST *list) {

	ASSERT(CheckBoard(pos));

	list->count = 0;

	int pce = EMPTY;
	int side = pos->side;
	int sq = 0; int t_sq = 0;
	int pceNum = 0;
	int dir = 0;
	int index = 0;
	int pceIndex = 0;

	if (side == WHITE) {

		for (pceNum = 0; pceNum < pos->pieceNum[wP]; ++pceNum) {
			sq = pos->pList[wP][pceNum];
			ASSERT(SqOnBoard(sq));

			if (!SQOFFBOARD(sq + 9) && PieceCol[pos->pieces[sq + 9]] == BLACK) {
				AddWhitePawnCapMove(pos, sq, sq + 9, pos->pieces[sq + 9], list);
			}
			if (!SQOFFBOARD(sq + 11) && PieceCol[pos->pieces[sq + 11]] == BLACK) {
				AddWhitePawnCapMove(pos, sq, sq + 11, pos->pieces[sq + 11], list);
			}

			if (pos->enPas != NO_SQ) {
				if (sq + 9 == pos->enPas) {
					AddEnPassantMove(pos, MOVE(sq, sq + 9, EMPTY, EMPTY, MFLAGEP), list);
				}
				if (sq + 11 == pos->enPas) {
					AddEnPassantMove(pos, MOVE(sq, sq + 11, EMPTY, EMPTY, MFLAGEP), list);
				}
			}
		}

	}
	else {

		for (pceNum = 0; pceNum < pos->pieceNum[bP]; ++pceNum) {
			sq = pos->pList[bP][pceNum];
			ASSERT(SqOnBoard(sq));

			if (!SQOFFBOARD(sq - 9) && PieceCol[pos->pieces[sq - 9]] == WHITE) {
				AddBlackPawnCapMove(pos, sq, sq - 9, pos->pieces[sq - 9], list);
			}

			if (!SQOFFBOARD(sq - 11) && PieceCol[pos->pieces[sq - 11]] == WHITE) {
				AddBlackPawnCapMove(pos, sq, sq - 11, pos->pieces[sq - 11], list);
			}
			if (pos->enPas != NO_SQ) {
				if (sq - 9 == pos->enPas) {
					AddEnPassantMove(pos, MOVE(sq, sq - 9, EMPTY, EMPTY, MFLAGEP), list);
				}
				if (sq - 11 == pos->enPas) {
					AddEnPassantMove(pos, MOVE(sq, sq - 11, EMPTY, EMPTY, MFLAGEP), list);
				}
			}
		}
	}

	/* Loop for slide pieces */
	pceIndex = LoopSlideIndex[side];
	pce = LoopSlidePce[pceIndex++];
	while (pce != 0) {
		ASSERT(PieceValid(pce));

		for (pceNum = 0; pceNum < pos->pieceNum[pce]; ++pceNum) {
			sq = pos->pList[pce][pceNum];
			ASSERT(SqOnBoard(sq));

			for (index = 0; index < NumDir[pce]; ++index) {
				dir = PceDir[pce][index];
				t_sq = sq + dir;

				while (!SQOFFBOARD(t_sq)) {
					// BLACK ^ 1 == WHITE       WHITE ^ 1 == BLACK
					if (pos->pieces[t_sq] != EMPTY) {
						if (PieceCol[pos->pieces[t_sq]] == (side ^ 1)) {
							AddCaptureMove(pos, MOVE(sq, t_sq, pos->pieces[t_sq], EMPTY, 0), list);
						}
						break;
					}
					t_sq += dir;
				}
			}
		}

		pce = LoopSlidePce[pceIndex++];
	}

	/* Loop for non slide */
	pceIndex = LoopNonSlideIndex[side];
	pce = LoopNonSlidePce[pceIndex++];

	while (pce != 0) {
		ASSERT(PieceValid(pce));

		for (pceNum = 0; pceNum < pos->pieceNum[pce]; ++pceNum) {
			sq = pos->pList[pce][pceNum];
			ASSERT(SqOnBoard(sq));

			for (index = 0; index < NumDir[pce]; ++index) {
				dir = PceDir[pce][index];
				t_sq = sq + dir;

				if (SQOFFBOARD(t_sq)) {
					continue;
				}

				// BLACK ^ 1 == WHITE       WHITE ^ 1 == BLACK
				if (pos->pieces[t_sq] != EMPTY) {
					if (PieceCol[pos->pieces[t_sq]] == (side ^ 1)) {
						AddCaptureMove(pos, MOVE(sq, t_sq, pos->pieces[t_sq], EMPTY, 0), list);
					}
					continue;
				}
			}
		}

		pce = LoopNonSlidePce[pceIndex++];
	}
	ASSERT(MoveListOk(list, pos));
}