Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package JB;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Random;
- import java.util.Scanner;
- import sac.StateFunction;
- import sac.game.AlphaBetaPruning;
- import sac.game.GameSearchAlgorithm;
- import sac.game.GameState;
- import sac.game.GameStateImpl;
- import sac.State;
- public class connect4 extends GameStateImpl {
- public static final int m = 10;
- public static final int n = 10;
- public static final Random rand = new Random();
- private char[][] board;
- static char emptyChar = 'E';
- static char playerChar = 'X';
- static char oppositeChar = 'O';
- String s = ""; // string trzymajacy wynik
- // KONSTRUKTORY:
- public connect4() {
- board = new char[m][n];
- for (int i = 0; i < m; i++)
- for (int j = 0; j < n; j++)
- board[i][j] = 'E';
- }
- public connect4(connect4 parent) {
- board = new char[m][n];
- for (int i = 0; i < m; i++)
- for (int j = 0; j < n; j++)
- board[i][j] = parent.board[i][j];
- setMaximizingTurnNow(parent.isMaximizingTurnNow());
- }
- @Override
- public List<GameState> generateChildren() {
- List<GameState> children = new ArrayList<GameState>();
- for (int i = 0; i < n; i++) {
- moveName = String.valueOf(i);
- connect4 child = new connect4(this);
- child.setMoveName(moveName);
- child.makeMove(i + 1);
- children.add(child);
- }
- return children;
- }
- @Override
- public String toString() // pokaz planszy:
- {
- StringBuilder builder = new StringBuilder();
- for (int i = m - 1; i > -1; i--) {
- for (int j = 0; j < n; j++)
- builder.append(board[i][j] + " ");
- builder.append("\n");
- }
- return builder.toString();
- }
- public char[][] getBoard() {
- return board;
- }
- public boolean makeMove(int column) {
- int i = 0;
- death: for (i = 0; i < m; i++)
- if (board[i][column-1] == 'E')
- break death;
- if (isMaximizingTurnNow())
- board[i][column-1] = 'X';
- else
- board[i][column-1] = 'O';
- setMaximizingTurnNow(!isMaximizingTurnNow());
- return true;
- }
- public double heuristic()
- {
- PRICE aktualneO, maksymalneO, aktualneX, maksymalneX;
- aktualneO = new PRICE();
- aktualneX = new PRICE();
- maksymalneO = new PRICE();
- maksymalneX = new PRICE();
- for(int i=0; i < m; i++)
- {
- aktualneO = new PRICE();
- aktualneX = new PRICE();
- for(int j=0; j < n; j++)
- {
- if(board[i][j] == 'E')
- {
- if(aktualneO.length > 0)
- aktualneO.right++;
- else
- aktualneO.left++;
- if(aktualneX.length > 0)
- aktualneX.right++;
- else
- aktualneX.left++;
- }
- if(board[i][j] == 'O')
- {
- aktualneO.length++;
- }
- if(board[i][j] == 'X')
- {
- aktualneX.length++;
- }
- if(aktualneX.ocen() > maksymalneX.ocen())
- maksymalneX = new PRICE(aktualneX);
- if(aktualneO.ocen() > maksymalneO.ocen())
- maksymalneO = new PRICE(aktualneO);
- if(board[i][j] == 'O')
- {
- aktualneX = new PRICE();
- }
- if(board[i][j] == 'X')
- {
- aktualneO = new PRICE();
- }
- }
- }
- for(int i=0; i < n; i++)
- {
- aktualneO = new PRICE();
- aktualneX = new PRICE();
- for(int j=0; j < m; j++)
- {
- if(board[i][j] == 'E')
- {
- if(aktualneO.length > 0)
- aktualneO.right++;
- else
- aktualneO.left++;
- if(aktualneX.length > 0)
- aktualneX.right++;
- else
- aktualneX.left++;
- }
- if(board[i][j] == 'O')
- {
- aktualneO.length++;
- }
- if(board[i][j] == 'X')
- {
- aktualneX.length++;
- }
- if(aktualneX.ocen() > maksymalneX.ocen())
- maksymalneX = new PRICE(aktualneX);
- if(aktualneO.ocen() > maksymalneO.ocen())
- maksymalneO = new PRICE(aktualneO);
- if(board[i][j] == 'O')
- {
- aktualneX = new PRICE();
- }
- if(board[i][j] == 'X')
- {
- aktualneO = new PRICE();
- }
- }
- }
- if(this.isMaximizingTurnNow())
- return maksymalneX.ocen()*-1.0;
- else
- return maksymalneO.ocen();
- }
- static {
- setHFunction(new StateFunction() {
- @Override
- public double calculate(State state) {
- connect4 hwgs = (connect4) state;
- if (!hwgs.still())
- return (hwgs.isMaximizingTurnNow()) ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
- else {
- return hwgs.heuristic();
- }
- }
- });
- }
- public boolean still() {
- for (int i = 0; i < m; i++) {
- if (board[m - 1][i] != 'E')
- return false;
- }
- // POZIOME:
- int x = 0;
- int o = 0;
- for (int i = 0; i < m; i++) {
- for (int j = 0; j < n; j++) {
- if (board[i][j] == 'X') {
- x++;
- o = 0;
- }
- if (board[i][j] == 'O') {
- o++;
- x = 0;
- }
- if (board[i][j] == 'E') {
- o = 0;
- x = 0;
- }
- if (x == 4 || o == 4)
- return false;
- }
- }
- // PIONOWE:
- x = 0;
- o = 0;
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) {
- if (board[j][i] == 'X') {
- x++;
- o = 0;
- }
- if (board[j][i] == 'O') {
- o++;
- x = 0;
- }
- if (board[j][i] == 'E') {
- o = 0;
- x = 0;
- }
- if (x == 4 || o == 4)
- return false;
- }
- }
- //SKOSNE W PRAWO:
- for (int i = 0; i < n-3; i++) {
- for (int j = 0; j < m-3; j++) {
- x = 0;
- o = 0;
- prawyskos: for(int k = 0; k < 4; k++)
- {
- if (board[j+k][i+k] == 'X') {
- if(o>0) break prawyskos;
- x++;
- }
- if (board[j+k][i+k] == 'O') {
- if(x>0) break prawyskos;
- o++;
- }
- if (board[j+k][i+k] == 'E') {
- break prawyskos;
- }
- }
- if (x == 4 || o == 4)
- return false;
- }
- }
- //SKOSNE W LEWO:
- for (int i = 3; i < n; i++) {
- for (int j = 0; j < m-3; j++) {
- x = 0;
- o = 0;
- lewyskos: for(int k = 0; k < 4; k++)
- {
- if (board[j+k][i-k] == 'X') {
- if(o>0) break lewyskos;
- x++;
- }
- if (board[j+k][i-k] == 'O') {
- if(x>0) break lewyskos;
- o++;
- }
- if (board[j+k][i-k] == 'E') {
- break lewyskos;
- }
- }
- if (x == 4 || o == 4)
- return false;
- }
- }
- return true;
- }
- public static void main(String[] args) {
- connect4 connect = new connect4();
- int move;
- boolean whetherFurther=true;
- int start=1;
- boolean turn = true;
- Scanner read = new Scanner(System.in);
- System.out.println("\nKto zaczyna?\n'0' - Komputer\n'1' - Gracz\nPodaj cyfrę:\n");
- start=read.nextInt();
- if(start==1) turn = true;
- else turn = false;
- connect.setMaximizingTurnNow(turn);
- System.out.println(connect);
- while (whetherFurther) {
- if (turn) {
- move = read.nextInt();
- connect.makeMove(move);
- System.out.println(connect);
- turn = !turn;
- } else {
- GameSearchAlgorithm algorithm = new AlphaBetaPruning(connect);
- algorithm.execute();
- System.out.println(algorithm.getMovesScores());
- connect.makeMove(Integer.valueOf(algorithm.getFirstBestMove()));
- System.out.println(connect);
- turn = !turn;
- }
- whetherFurther = connect.still();
- }
- if (!connect.isMaximizingTurnNow())
- System.out.println("Zwyciezyl GRACZ!!!");
- else
- System.out.println("Zwyciezyl KOMPUTER!!!");
- read.close();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement