/// <summary> /// Funkce minimaxu /// </summary> /// <param name="gb">instance tridy hraci desky</param> /// <param name="depth">hloubka minimaxu</param> /// <returns></returns> private double minimax(Gameboard gb, int depth) { // pokud je na tahu bily hrac if (gb.PlayingWhite) { // a vitez je nastaven na bileho hrace vrat MAX if (gb.Winner == status.whitePlayer) { return(-GlobalVariables.MAX); } // a vitez je nastaven na cerneho hrace vrat -MAX if (gb.Winner == status.blackPlayer) { return(GlobalVariables.MAX); } // a je remiza, vrat 0 if (gb.Winner == status.draw) { return(0); } } // pokud je na tahu cerny hrac else { // a je vitez nastaven na cerneho hrace, vrat MAX if (gb.Winner == status.blackPlayer) { return(-GlobalVariables.MAX); } // a je vitez nastaven na bileho hrace, vrat -MAX if (gb.Winner == status.whitePlayer) { return(GlobalVariables.MAX); } // a je remiza, vrat 0 if (gb.Winner == status.draw) { return(0); } } if (depth == 0) { return(evalFunction(gb)); } else { List <Fairway> moves = generateMoves(gb); double rank = -GlobalVariables.MAX; for (int i = 0; i < moves.Count; i += 2) { // potomek <- zahraj(pozice, tah) Gameboard potomek = gb.gameboardCopy(); rules.makeMove(moves[i], moves[i + 1], potomek, true); rank = Math.Max(rank, -minimax(potomek, depth - 1)); } return(rank); } }
private void fw_2ndClick(object sender, EventArgs e) { var form = Form.ActiveForm as Friska_dama; BackgroundWorker bw = form.bw; var fwClicked = (Fairway)sender; List <Fairway> playersFigures = rules.choosableFigures(this); List <string> posMoves = possibleMoves(From); if (fwClicked == From) { foreach (var fw in Board) { fw.Click -= fw_2ndClick; fw.Click += fw_1stClick; } if (ShowMoveHelp) { colorUp(); } From = null; form.statusBarLabel.Text = "Vyberte figurku, kterou chcete táhnout"; } else if (fwClicked != From && playersFigures.Contains(fwClicked)) { From = fwClicked; fairwayColorUp(this, From); } else if (posMoves.Contains(fwClicked.Name)) { addHistory(From, fwClicked); rules.makeMove(From, fwClicked, this, false); Winner = rules.checkWinner(this); from = null; foreach (var fw in Board) { fw.Click -= fw_2ndClick; fw.Click += fw_1stClick; } if (ShowMoveHelp) { colorUp(); } form.Activate(); form.FriskaDama_Activated(sender, e); } }
/// <summary> /// Funkce provadejici nacteni hry a zkontrolovani, zda se jedna o korektni ulozeni /// </summary> /// <param name="filePath">cesta k souboru</param> /// <param name="gb">Hraci deska, na niz maji byt zmeny provedeny</param> /// <returns>Hraci desku s odehratou hrou</returns> public Gameboard loadGame(string filePath, Gameboard gb) { string from = ""; string to = ""; Fairway fwFrom; Fairway fwTo; var rules = new Rules(); gb.Board = gb.newBoard(); using (XmlReader reader = XmlReader.Create(filePath)) { while (reader.Read()) { if (reader.IsStartElement()) { switch (reader.Name) { // nacteme si obtiznost bileho hrace a nastavime case "WHITE": if (reader.Read()) { int whitePlayer = Convert.ToInt32(reader.Value.Trim()); gb.WhitePlayer = whitePlayer; } break; // nacteme si obtiznost cerneho hrace a nastavime case "BLACK": if (reader.Read()) { int blackPlayer = Convert.ToInt32(reader.Value.Trim()); gb.BlackPlayer = blackPlayer; } break; // nacteme si zacinajiciho hrace a nastavime case "STARTS": if (reader.Read()) { bool startsWhite = Convert.ToBoolean(reader.Value.Trim()); gb.StartsWhite = startsWhite; } break; // case "SHOWHELP": if (reader.Read()) { bool showHelp = Convert.ToBoolean(reader.Value.Trim()); gb.ShowMoveHelp = showHelp; } break; case "FROM": if (reader.Read()) { from = reader.Value.Trim(); } break; case "TO": if (reader.Read()) { to = reader.Value.Trim(); } fwFrom = gb.getFigure(from); fwTo = gb.getFigure(to); rules.generateMoves(gb); rules.makeMove(fwFrom, fwTo, gb, false); gb.addHistory(fwFrom, fwTo); break; default: break; } } } } return(gb); }
/// <summary> /// Funkce provadejici nacteni hry a zkontrolovani, zda se jedna o korektni ulozeni /// </summary> /// <param name="filePath">cesta k souboru</param> /// <param name="gb">Hraci deska, na niz maji byt zmeny provedeny</param> /// <returns>Hraci desku s odehratou hrou</returns> public Gameboard loadGame(string filePath, Gameboard gb) { string from = ""; string to = ""; Fairway fwFrom; Fairway fwTo; Rules rules = new Rules(); gb.Board = gb.newBoard(); using (XmlReader reader = XmlReader.Create(filePath)) { while (reader.Read()) { if (reader.IsStartElement()) { switch (reader.Name) { // nacteme si obtiznost bileho hrace a nastavime case "WHITE": if (reader.Read()) { int whitePlayer = Convert.ToInt32(reader.Value.Trim()); gb.WhitePlayer = whitePlayer; } break; // nacteme si obtiznost cerneho hrace a nastavime case "BLACK": if (reader.Read()) { int blackPlayer = Convert.ToInt32(reader.Value.Trim()); gb.BlackPlayer = blackPlayer; } break; // nacteme si zacinajiciho hrace a nastavime case "STARTS": if (reader.Read()) { bool startsWhite = Convert.ToBoolean(reader.Value.Trim()); gb.StartsWhite = startsWhite; } break; // case "SHOWHELP": if (reader.Read()) { bool showHelp = Convert.ToBoolean(reader.Value.Trim()); gb.ShowMoveHelp = showHelp; } break; case "FROM": if (reader.Read()) from = (string)reader.Value.Trim(); break; case "TO": if (reader.Read()) to = (string)reader.Value.Trim(); fwFrom = gb.getFigure(from); fwTo = gb.getFigure(to); rules.generateMoves(gb); rules.makeMove(fwFrom, fwTo, gb, false); gb.addHistory(fwFrom, fwTo); break; default: break; } } } } return gb; }