public Point minimax(int[][] gameState) {//player - true = MAX boolean player = true; int highestScoreDifference = Integer.MIN_VALUE; //highestScoreDifference = player1Score - player2Score; Point bestMove = null;//best move returns highest difference (above 0) ArrayList possible = checkPossible(gameState);//all possible moves for NEW STATE //tu był score, gdyby coś przestało działać for(Point move : possible) { int score; int[][] state = copyTab(gameState); state[move.x][move.y] = player ? 2 : 1;//the new state score = game.countScoreAdded(move, state); player = false; score += minimaxRec(player, state); if(score > highestScoreDifference) { highestScoreDifference = score; bestMove = move; } } return bestMove; } private int minimaxRec(boolean player, int[][] gameState) { ArrayList possible = checkPossible(gameState); if(possible.size() == 0) { return 0; } int lowestScore = Integer.MAX_VALUE; int highestScore = Integer.MIN_VALUE; //tu był score, gdyby coś przestało działać for(Point move : possible) { int score = 0; int[][] state = copyTab(gameState); state[move.x][move.y] = player ? 2 : 1; //tu był wcześniej zmeiniany newPlayer if(player){//tu był wcześniej newPlayer score += game.countScoreAdded(move, state);//tu wcześniej był gameState } else { score -= game.countScoreAdded(move, state);//tu wcześniej był gameState } boolean newPlayer = !player; score += minimaxRec(newPlayer, state); if(score < lowestScore) { lowestScore = score; } if(score > highestScore) { highestScore = score; } } return player ? highestScore : lowestScore; }