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; } }
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; }