public static long heuristic(FieldContext gameProcess, PlayerCell first, PlayerCell flag) { long score = 0; score = HeuristicHero(gameProcess, first, flag); if (Math.Abs(score) >= 1e12) { return(score); } long oppositeScore = 0; oppositeScore = heuristicAntagonist(gameProcess, first, gameProcess.GetOppositePlayer(flag)); //при этой и нижней строке одинаковый результат // oppositeScore = heuristicUser(n, field, first, getOppositeFlag(flag)); score += oppositeScore; return(score); }
StepScore Minimax(FieldContext gameProcess, PlayerCell first, PlayerCell flag, int deep, int col, Win aWin) { StepScore s = StepScoreZero; if (deep != 0) { gameProcess.Field[gameProcess.FreePositions[col], col] = gameProcess.GetOppositePlayer(flag);//(flag % 2) + 1;-opposite gameProcess.FreePositions[col]++; } int c = gameProcess.EndOfTheGame(gameProcess.GetOppositePlayer(flag)); aWin.W = 0; if (c != -1 && deep == 1) { s.Score = Heuristic.heuristic(gameProcess, first, gameProcess.GetOppositePlayer(flag)); s.Step = col; aWin.W = 1; gameProcess.FreePositions[col]--; gameProcess.Field[gameProcess.FreePositions[col], col] = 0; return(s); } if (c != -1 || deep == 3) { if (col != -1) { s.Score = Heuristic.heuristic(gameProcess, first, gameProcess.GetOppositePlayer(flag)); s.Step = col; gameProcess.FreePositions[col]--;//не работает gameProcess.Field[gameProcess.FreePositions[col], col] = 0; return(s); } } StepScore a = StepScoreZero; a.Step = -1; if ((deep + 1) % 2 == 0) { a.Score = (long)-1e15; } else { a.Score = (long)1e15; } for (int i = 0; i < gameProcess.QuanCols; i++) { if (gameProcess.FreePositions[i] != gameProcess.QuanRows) { StepScore f = Minimax(gameProcess, first, gameProcess.GetOppositePlayer(flag), deep + 1, i, aWin); if (aWin.W != 0) { return(f); } if ((deep + 1) % 2 == 0 && a.Score < f.Score) { a.Score = f.Score; a.Step = i; } if ((deep + 1) % 2 != 0 && a.Score > f.Score) { a.Score = f.Score; a.Step = i; } } } if (deep != 0) { gameProcess.FreePositions[col]--; gameProcess.Field[gameProcess.FreePositions[col], col] = 0; } return(a); }