extern void ShowMove(hintdata * phd, const int f) { char *sz; TanBoard anBoard; if (f) { move *pm; GList *plSelList = MoveListGetSelectionList(phd); if (!plSelList) return; /* the button is toggled */ pm = MoveListGetMove(phd, plSelList); MoveListFreeSelectionList(plSelList); memcpy(anBoard, msBoard(), sizeof(TanBoard)); ApplyMove(anBoard, pm->anMove, FALSE); UpdateMove((BOARD(pwBoard))->board_data, anBoard); } else { sz = g_strdup("show board"); UserCommand(sz); g_free(sz); } #if USE_BOARD3D RestrictiveRedraw(); #endif }
void MinMaxAlgorithm::GetTopFromStackAndApplyMove() { // get the top graphNode from stack this->aGraphNode = this->aStack.top(); // apply the move of this current aGraphNode ApplyMove(); }
static void MoveListTempMapClicked(GtkWidget * pw, hintdata * phd) { GList *pl; char szMove[100]; matchstate *ams; int i, c; gchar **asz; GList *plSelList = MoveListGetSelectionList(phd); if (!plSelList) return; c = g_list_length(plSelList); ams = (matchstate *) g_malloc(c * sizeof(matchstate)); asz = (char **) g_malloc(c * sizeof(char *)); for (i = 0, pl = plSelList; pl; pl = pl->next, ++i) { move *m = MoveListGetMove(phd, pl); /* Apply move to get board */ memcpy(&ams[i], &ms, sizeof(matchstate)); FormatMove(szMove, (ConstTanBoard) ams[i].anBoard, m->anMove); ApplyMove(ams[i].anBoard, m->anMove, FALSE); /* Swap sides */ SwapSides(ams[i].anBoard); ams[i].fMove = !ams[i].fMove; ams[i].fTurn = !ams[i].fTurn; /* Show temp map dialog */ asz[i] = g_strdup(szMove); } MoveListFreeSelectionList(plSelList); GTKSetCurrentParent(pw); GTKShowTempMap(ams, c, (const gchar **) asz, TRUE); g_free(ams); for (i = 0; i < c; ++i) g_free(asz[i]); g_free(asz); }
/* Build the list of games in the open file f. * Returns 0 for success or error number. */ int GameListBuild (FILE *f) { ChessMove cm, lastStart; int gameNumber; ListGame *currentListGame = NULL; int error, scratch=100, plyNr=0, fromX, fromY, toX, toY; int offset; char lastComment[MSG_SIZ], buf[MSG_SIZ]; TimeMark t, t2; GetTimeMark(&t); GameListFree(&gameList); yynewfile(f); gameNumber = 0; movePtr = 0; lastStart = (ChessMove) 0; yyskipmoves = FALSE; do { yyboardindex = scratch; offset = yyoffset(); quickFlag = plyNr + 1; cm = (ChessMove) Myylex(); switch (cm) { case GNUChessGame: if ((error = GameListNewGame(¤tListGame))) { rewind(f); yyskipmoves = FALSE; return(error); } currentListGame->number = ++gameNumber; currentListGame->offset = offset; if(1) { CopyBoard(boards[scratch], initialPosition); plyNr = 0; currentListGame->moves = PackGame(boards[scratch]); } if (currentListGame->gameInfo.event != NULL) { free(currentListGame->gameInfo.event); } currentListGame->gameInfo.event = StrSave(yy_text); lastStart = cm; break; case XBoardGame: lastStart = cm; break; case MoveNumberOne: switch (lastStart) { case GNUChessGame: break; /* ignore */ case PGNTag: lastStart = cm; break; /* Already started */ case (ChessMove) 0: case MoveNumberOne: case XBoardGame: if ((error = GameListNewGame(¤tListGame))) { rewind(f); yyskipmoves = FALSE; return(error); } currentListGame->number = ++gameNumber; currentListGame->offset = offset; if(1) { CopyBoard(boards[scratch], initialPosition); plyNr = 0; currentListGame->moves = PackGame(boards[scratch]); } lastStart = cm; break; default: break; /* impossible */ } break; case PGNTag: lastStart = cm; if ((error = GameListNewGame(¤tListGame))) { rewind(f); yyskipmoves = FALSE; return(error); } currentListGame->number = ++gameNumber; currentListGame->offset = offset; ParsePGNTag(yy_text, ¤tListGame->gameInfo); do { yyboardindex = 1; offset = yyoffset(); cm = (ChessMove) Myylex(); if (cm == PGNTag) { ParsePGNTag(yy_text, ¤tListGame->gameInfo); } } while (cm == PGNTag || cm == Comment); if(1) { int btm=0; if(currentListGame->gameInfo.fen) ParseFEN(boards[scratch], &btm, currentListGame->gameInfo.fen, FALSE); else CopyBoard(boards[scratch], initialPosition); plyNr = (btm != 0); currentListGame->moves = PackGame(boards[scratch]); } if(cm != NormalMove) break; case IllegalMove: if(appData.testLegality) break; case NormalMove: /* Allow the first game to start with an unnumbered move */ yyskipmoves = FALSE; if (lastStart == (ChessMove) 0) { if ((error = GameListNewGame(¤tListGame))) { rewind(f); yyskipmoves = FALSE; return(error); } currentListGame->number = ++gameNumber; currentListGame->offset = offset; if(1) { CopyBoard(boards[scratch], initialPosition); plyNr = 0; currentListGame->moves = PackGame(boards[scratch]); } lastStart = MoveNumberOne; } case WhiteCapturesEnPassant: case BlackCapturesEnPassant: case WhitePromotion: case BlackPromotion: case WhiteNonPromotion: case BlackNonPromotion: case WhiteKingSideCastle: case WhiteQueenSideCastle: case BlackKingSideCastle: case BlackQueenSideCastle: case WhiteKingSideCastleWild: case WhiteQueenSideCastleWild: case BlackKingSideCastleWild: case BlackQueenSideCastleWild: case WhiteHSideCastleFR: case WhiteASideCastleFR: case BlackHSideCastleFR: case BlackASideCastleFR: fromX = currentMoveString[0] - AAA; fromY = currentMoveString[1] - ONE; toX = currentMoveString[2] - AAA; toY = currentMoveString[3] - ONE; plyNr++; ApplyMove(fromX, fromY, toX, toY, currentMoveString[4], boards[scratch]); if(currentListGame && currentListGame->moves) PackMove(fromX, fromY, toX, toY, boards[scratch][toY][toX]); break; case WhiteWins: // [HGM] rescom: save last comment as result details case BlackWins: case GameIsDrawn: case GameUnfinished: if(!currentListGame) break; if(currentListGame->gameInfo.result == GameUnfinished) currentListGame->gameInfo.result = cm; // correct result tag with actual result if (currentListGame->gameInfo.resultDetails != NULL) { free(currentListGame->gameInfo.resultDetails); } if(yy_text[0] == '{') { char *p; safeStrCpy(lastComment, yy_text+1, sizeof(lastComment)/sizeof(lastComment[0])); if((p = strchr(lastComment, '}'))) *p = 0; currentListGame->gameInfo.resultDetails = StrSave(lastComment); } break; default: break; } if(gameNumber % 1000 == 0) { snprintf(buf, MSG_SIZ, _("Reading game file (%d)"), gameNumber); DisplayTitle(buf); DoEvents(); } } while (cm != (ChessMove) 0); if(currentListGame) { if(!currentListGame->moves) DisplayError("Game cache overflowed\nPosition-searching might not work properly", 0); if (appData.debugMode) { for (currentListGame = (ListGame *) gameList.head; currentListGame->node.succ; currentListGame = (ListGame *) currentListGame->node.succ) { fprintf(debugFP, "Parsed game number %d, offset %ld:\n", currentListGame->number, currentListGame->offset); PrintPGNTags(debugFP, ¤tListGame->gameInfo); } } } if(appData.debugMode) { GetTimeMark(&t2);printf("GameListBuild %ld msec\n", SubtractTimeMarks(&t2,&t)); } quickFlag = 0; PackGame(boards[scratch]); // for appending end-of-game marker. DisplayTitle("WinBoard"); rewind(f); yyskipmoves = FALSE; return 0; }
unsigned short MinMaxAlgorithm::DepthFirstSearch() { // create first node this->aGraphNode = new GraphNode<u_int8_t>; // add it in the graph this->aGraph->Add(this->aGraphNode); // push it to stack this->aStack.push(this->aGraphNode); // while stack is not empty while (!this->aStack.empty()) { // get the top graphNode from stack this->aGraphNode = this->aStack.top(); // if it has no children and // not reach the maxDepth and not full, then develop children if (this->aGraphNode->Edges->empty() && this->aGraphNode->depth < maxDepth && !this->aPuzzle.IsFull()) { // apply the move of this current aGraphNode ApplyMove(); // check if it's not done yet if (!this->aPuzzle.IsDone()) { // check if need to develop children based on Alpha-Beta Alorithm if (IsNeedToDevelopChildren()) // develop children DevelopChildren(); else PopOutOfStackAndRevertMove(); // else if done } else { // just calculate the minMaxValue CalculateMinMaxValue(); PopOutOfStackAndRevertMove(); } } // else if it has no children and // reach the maxDepth (i.e. leaf node), then calculate minMaxValue else if (this->aGraphNode->Edges->empty() && this->aGraphNode->depth >= maxDepth) { // apply the move of this current aGraphNode ApplyMove(); // check if it's done this->aPuzzle.IsDone(); // calculate minMaxValue CalculateMinMaxValue(); PopOutOfStackAndRevertMove(); } // else if it has children and Depth is even, get Max child value else if (!this->aGraphNode->Edges->empty() && (this->aGraphNode->depth % 2) == 0) { // get Max child value this->aGraphNode->minMaxValue = GetMaxChildValue(this->aGraphNode); PopOutOfStackAndRevertMove(); } // else if it has children and Depth is odd, get Min child value else if (!this->aGraphNode->Edges->empty() && (this->aGraphNode->depth % 2) == 1) { // get Min child value this->aGraphNode->minMaxValue = GetMinChildValue(this->aGraphNode); PopOutOfStackAndRevertMove(); } } // end while // get the right play from root's children for (typename vector< GraphNode<u_int8_t>* >::iterator it = this->aGraphNode->Edges->begin(); it != this->aGraphNode->Edges->end(); it++) if (this->aGraphNode->minMaxValue == (*it)->minMaxValue) return (*it)->tokenPosition; return this->aGraphNode->tokenPosition; }