Exemplo n.º 1
0
void KhetState::initBoard(string strBoard) {
    gameOver = false;
    for(int i = 0; i < 80; i++) {
        int file = i % 10;
        int rank = 8 - (i / 10);//rank goes from 1 to 8 not 0 indexed
        rank--;
				board[file][rank].type = EMPTY; 
        string sq = "";
        sq += strBoard[i * 2];
        sq += strBoard[i * 2 + 1];
				board[file][rank] = strToPiece(sq);
    }
    if(strBoard[strBoard.length() - 1] == 'w') {
      ctm = SILVER;
    }
    else {
      ctm = RED;
    }
}
Exemplo n.º 2
0
void CChessGame :: initGame(const char *fenString, BOOL createChessmenList,
                            PLAYER_TYPE white, PLAYER_TYPE black)
{
    INT16 i, j, k, l;
    char FEN[FEN_STRING_LENGTH];
    char *fenToken;

    strncpy(FEN, fenString, FEN_STRING_LENGTH);
    FEN[FEN_STRING_LENGTH-1] = '\0';

    //cleanupLists();

    fenToken = strtok(FEN, " /");
    for(i = MAXY-1; i >= 0; i--)
    {
        for(j = 0, k = 0; j < MAXX; j++, k++)
        {
            if(fenToken[k] >= '1' && fenToken[k] <= '8')
            {
                for(l = 0; l < fenToken[k] - '0'; l++)
                {
                    clearPiece(BOARD_POSITION(i, j + l));
                }
                
                j += (fenToken[k] - '1');
                continue;
            }
            
            if(isalpha(fenToken[k]))
            {
                insertPiece(BOARD_POSITION(i,j), strToPiece(fenToken[k]));
            }
        }
        
        fenToken = strtok(NULL, " /");
    }

    gState.gameProgress = GP_IN_PROGRESS;

    if(createChessmenList == TRUE)
    {
        generateChessmenList();
    }
    
    playerType[MT_WHITE] = white;
    playerType[MT_BLACK] = black;    

    if(fenToken == NULL)
    {
        return;
    }    
    
    if(fenToken[0] == 'w')
        gState.turn = MT_WHITE;
    else
        gState.turn = MT_BLACK;

    // castling and other info forbid castling by default           
    gState.wKingMoved = TRUE;
    gState.bKingMoved = TRUE;
    gState.wRCastleMoved = TRUE;
    gState.wLCastleMoved = TRUE;
    gState.bRCastleMoved = TRUE;
    gState.bLCastleMoved = TRUE;
    
    fenToken = strtok(NULL, " ");
    if(fenToken == NULL)
    {
        return;
    }
    
    
    if(fenToken[0] == '-')
    {
        //all set
    }
    else
    {
        for(i = 0; i < (INT8)strlen(fenToken); i++)
        {
            if(fenToken[i] == 'K')
            {
                if(game.board[0][4] == W_KING && game.board[0][7] == W_CASTLE)
                {
                    gState.wKingMoved = FALSE;
                    gState.wRCastleMoved = FALSE;
                }
            }
            else if(fenToken[i] == 'Q')
            {
                if(game.board[0][4] == W_KING && game.board[0][0] == W_CASTLE)
                {
                    gState.wKingMoved = FALSE;
                    gState.wLCastleMoved = FALSE;            
                }
            }
            else if(fenToken[i] == 'k')
            {
                if(game.board[7][4] == B_KING && game.board[7][7] == B_CASTLE)
                {
                    gState.bKingMoved = FALSE;
                    gState.bRCastleMoved = FALSE;
                }
            }
            else if(fenToken[i] == 'q')
            {
                if(game.board[7][4] == B_KING && game.board[7][0] == B_CASTLE)
                {
                    gState.bKingMoved = FALSE;
                    gState.bLCastleMoved = FALSE;            
                }
            }
        }
    }

    //enp square
    fenToken = strtok(NULL, " ");
    if(fenToken == NULL)
    {
        return;
    }
    else
    {
        //if movelist is empty add the pawn move in the movelist so that enpassent capture can take place
      	while(*fenToken == ' ') fenToken++;
      	
      	if(moveList.getTail() == NULL && fenToken[0] != '-')
        {
            INT8 beginning = (fenToken[1] - '1') > 3 ? 6 : 1;
            INT8 end       = beginning == 6 ? 4 : 3;
            INT8 packPos;
            MOVELIST *mList;
            CZobrist zob;
            
            mList = newMoveListEntry();
            mList->init = BOARD_POSITION(beginning, fenToken[0]-'a');
            mList->dest = BOARD_POSITION(end, fenToken[0]-'a'); 
            strncpy(mList->FEN, fenString, FEN_STRING_LENGTH);
            mList->FEN[FEN_STRING_LENGTH-1] = '\0';
            mList->seqNum = 0;
            mList->status = MOVE_SUCCESS | MOVE_EN_PASSENT_ACTIVE;
            
            packPos = PACKPOS((fenToken[0]-'a'), (fenToken[1]-'1'));
	        mList->status |= (packPos << 24);
            
            zob.updateBoardPosition(fenString);
            zob.calculateZobristHash();
            mList->zobristHash = zob.getZobristHash();
            
            moveList.insertAtTail((DLL_NODE *)mList);
        }

    }
    //half move count
    fenToken = strtok(NULL, " ");
    if(fenToken == NULL)
    {
        return;
    }  
    
    gState.draw50HalfMoveCount = atoi(fenToken);
    
    return;  
}