Advertisement
Guest User

Untitled

a guest
Jun 21st, 2018
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.42 KB | None | 0 0
  1. package JB;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import java.util.Random;
  6. import java.util.Scanner;
  7.  
  8. import sac.StateFunction;
  9. import sac.game.AlphaBetaPruning;
  10. import sac.game.GameSearchAlgorithm;
  11. import sac.game.GameState;
  12. import sac.game.GameStateImpl;
  13. import sac.State;
  14.  
  15. public class connect4 extends GameStateImpl {
  16.  
  17.     public static final int m = 10;
  18.     public static final int n = 10;
  19.     public static final Random rand = new Random();
  20.  
  21.     private char[][] board;
  22.  
  23.     static char emptyChar = 'E';
  24.     static char playerChar = 'X';
  25.     static char oppositeChar = 'O';
  26.     String s = ""; // string trzymajacy wynik
  27.  
  28.     // KONSTRUKTORY:
  29.     public connect4() {
  30.         board = new char[m][n];
  31.  
  32.         for (int i = 0; i < m; i++)
  33.             for (int j = 0; j < n; j++)
  34.                 board[i][j] = 'E';
  35.     }
  36.  
  37.     public connect4(connect4 parent) {
  38.         board = new char[m][n];
  39.  
  40.         for (int i = 0; i < m; i++)
  41.             for (int j = 0; j < n; j++)
  42.                 board[i][j] = parent.board[i][j];
  43.  
  44.         setMaximizingTurnNow(parent.isMaximizingTurnNow());
  45.     }
  46.  
  47.     @Override
  48.     public List<GameState> generateChildren() {
  49.  
  50.         List<GameState> children = new ArrayList<GameState>();
  51.  
  52.         for (int i = 0; i < n; i++) {
  53.             moveName = String.valueOf(i);
  54.             connect4 child = new connect4(this);
  55.             child.setMoveName(moveName);
  56.             child.makeMove(i + 1);
  57.             children.add(child);
  58.         }
  59.         return children;
  60.     }
  61.  
  62.     @Override
  63.     public String toString() // pokaz planszy:
  64.     {
  65.         StringBuilder builder = new StringBuilder();
  66.  
  67.        
  68.         for (int i = m - 1; i > -1; i--) {
  69.             for (int j = 0; j < n; j++)
  70.                 builder.append(board[i][j] + "  ");
  71.             builder.append("\n");
  72.         }
  73.  
  74.         return builder.toString();
  75.     }
  76.  
  77.     public char[][] getBoard() {
  78.         return board;
  79.     }
  80.  
  81.     public boolean makeMove(int column) {
  82.         int i = 0;
  83.  
  84.         death: for (i = 0; i < m; i++)
  85.             if (board[i][column-1] == 'E')
  86.                 break death;
  87.  
  88.         if (isMaximizingTurnNow())
  89.             board[i][column-1] = 'X';
  90.         else
  91.             board[i][column-1] = 'O';
  92.        
  93.         setMaximizingTurnNow(!isMaximizingTurnNow());
  94.  
  95.         return true;
  96.     }
  97.    
  98.    
  99.      public double heuristic()
  100.       {
  101.           PRICE aktualneO, maksymalneO, aktualneX, maksymalneX;
  102.           aktualneO = new PRICE();
  103.           aktualneX = new PRICE();
  104.           maksymalneO = new PRICE();
  105.           maksymalneX = new PRICE();
  106.          
  107.           for(int i=0; i < m; i++)
  108.           {
  109.               aktualneO = new PRICE();
  110.               aktualneX = new PRICE();
  111.               for(int j=0; j < n; j++)
  112.               {
  113.                   if(board[i][j] == 'E')
  114.                   {
  115.                       if(aktualneO.length > 0)
  116.                           aktualneO.right++;
  117.                       else
  118.                           aktualneO.left++;
  119.                      
  120.                       if(aktualneX.length > 0)
  121.                           aktualneX.right++;
  122.                       else
  123.                           aktualneX.left++;
  124.                   }
  125.                  
  126.                   if(board[i][j] == 'O')
  127.                   {
  128.                       aktualneO.length++;
  129.                   }
  130.                  
  131.                   if(board[i][j] == 'X')
  132.                   {
  133.                       aktualneX.length++;
  134.                   }
  135.                  
  136.                   if(aktualneX.ocen() > maksymalneX.ocen())
  137.                       maksymalneX = new PRICE(aktualneX);
  138.                  
  139.                   if(aktualneO.ocen() > maksymalneO.ocen())
  140.                       maksymalneO = new PRICE(aktualneO);
  141.                  
  142.                   if(board[i][j] == 'O')
  143.                   {
  144.                       aktualneX = new PRICE();
  145.                   }
  146.                  
  147.                   if(board[i][j] == 'X')
  148.                   {
  149.                       aktualneO = new PRICE();
  150.                   }
  151.                  
  152.               }
  153.           }
  154.          
  155.           for(int i=0; i < n; i++)
  156.           {
  157.               aktualneO = new PRICE();
  158.               aktualneX = new PRICE();
  159.               for(int j=0; j < m; j++)
  160.               {
  161.                   if(board[i][j] == 'E')
  162.                   {
  163.                       if(aktualneO.length > 0)
  164.                           aktualneO.right++;
  165.                       else
  166.                           aktualneO.left++;
  167.                      
  168.                       if(aktualneX.length > 0)
  169.                           aktualneX.right++;
  170.                       else
  171.                           aktualneX.left++;
  172.                   }
  173.                  
  174.                   if(board[i][j] == 'O')
  175.                   {
  176.                       aktualneO.length++;
  177.                   }
  178.                  
  179.                   if(board[i][j] == 'X')
  180.                   {
  181.                       aktualneX.length++;
  182.                   }
  183.                  
  184.                   if(aktualneX.ocen() > maksymalneX.ocen())
  185.                       maksymalneX = new PRICE(aktualneX);
  186.                  
  187.                   if(aktualneO.ocen() > maksymalneO.ocen())
  188.                       maksymalneO = new PRICE(aktualneO);
  189.                  
  190.                   if(board[i][j] == 'O')
  191.                   {
  192.                       aktualneX = new PRICE();
  193.                   }
  194.                  
  195.                   if(board[i][j] == 'X')
  196.                   {
  197.                       aktualneO = new PRICE();
  198.                   }
  199.                  
  200.               }
  201.           }
  202.           if(this.isMaximizingTurnNow())
  203.               return maksymalneX.ocen()*-1.0;
  204.           else
  205.               return maksymalneO.ocen();
  206.       }
  207.      
  208.  
  209.    
  210.     static {
  211.         setHFunction(new StateFunction() {
  212.             @Override
  213.             public double calculate(State state) {
  214.                 connect4 hwgs = (connect4) state;
  215.                 if (!hwgs.still())
  216.                     return (hwgs.isMaximizingTurnNow()) ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
  217.                 else {
  218.                     return hwgs.heuristic();
  219.                 }
  220.             }
  221.         });
  222.     }
  223.    
  224.    
  225.     public boolean still() {
  226.         for (int i = 0; i < m; i++) {
  227.             if (board[m - 1][i] != 'E')
  228.                 return false;
  229.         }
  230.  
  231.  
  232.         // POZIOME:
  233.  
  234.         int x = 0;
  235.         int o = 0;
  236.         for (int i = 0; i < m; i++) {
  237.             for (int j = 0; j < n; j++) {
  238.                 if (board[i][j] == 'X') {
  239.                     x++;
  240.                     o = 0;
  241.                 }
  242.                 if (board[i][j] == 'O') {
  243.                     o++;
  244.                     x = 0;
  245.                 }
  246.                 if (board[i][j] == 'E') {
  247.                     o = 0;
  248.                     x = 0;
  249.                 }
  250.                 if (x == 4 || o == 4)
  251.                     return false;
  252.             }
  253.         }
  254.  
  255.         // PIONOWE:
  256.         x = 0;
  257.         o = 0;
  258.         for (int i = 0; i < n; i++) {
  259.             for (int j = 0; j < m; j++) {
  260.                 if (board[j][i] == 'X') {
  261.                     x++;
  262.                     o = 0;
  263.                 }
  264.                 if (board[j][i] == 'O') {
  265.                     o++;
  266.                     x = 0;
  267.                 }
  268.                 if (board[j][i] == 'E') {
  269.                     o = 0;
  270.                     x = 0;
  271.                 }
  272.                 if (x == 4 || o == 4)
  273.                     return false;
  274.             }
  275.         }
  276.        
  277.        
  278.         //SKOSNE W PRAWO:
  279.         for (int i = 0; i < n-3; i++) {
  280.             for (int j = 0; j < m-3; j++) {
  281.                 x = 0;
  282.                 o = 0;
  283.                 prawyskos: for(int k = 0; k < 4; k++)
  284.                 {
  285.                     if (board[j+k][i+k] == 'X') {
  286.                         if(o>0) break prawyskos;
  287.                         x++;
  288.                     }
  289.                     if (board[j+k][i+k] == 'O') {
  290.                         if(x>0) break prawyskos;
  291.                         o++;
  292.                     }
  293.                     if (board[j+k][i+k] == 'E') {
  294.                         break prawyskos;
  295.                     }
  296.                 }
  297.                
  298.                 if (x == 4 || o == 4)
  299.                     return false;
  300.             }
  301.         }
  302.        
  303.         //SKOSNE W LEWO:
  304.                 for (int i = 3; i < n; i++) {
  305.                     for (int j = 0; j < m-3; j++) {
  306.                         x = 0;
  307.                         o = 0;
  308.                         lewyskos: for(int k = 0; k < 4; k++)
  309.                         {
  310.                             if (board[j+k][i-k] == 'X') {
  311.                                 if(o>0) break lewyskos;
  312.                                 x++;
  313.                             }
  314.                             if (board[j+k][i-k] == 'O') {
  315.                                 if(x>0) break lewyskos;
  316.                                 o++;
  317.                             }
  318.                             if (board[j+k][i-k] == 'E') {
  319.                                 break lewyskos;
  320.                             }
  321.                         }
  322.                        
  323.                         if (x == 4 || o == 4)
  324.                             return false;
  325.                     }
  326.                 }
  327.          
  328.  
  329.         return true;
  330.     }
  331.  
  332.     public static void main(String[] args) {
  333.  
  334.         connect4 connect = new connect4();
  335.  
  336.         int move;
  337.         boolean whetherFurther=true;
  338.         int start=1;
  339.         boolean turn = true;
  340.        
  341.        
  342.         Scanner read = new Scanner(System.in);
  343.  
  344.        
  345.  
  346.         System.out.println("\nKto zaczyna?\n'0' - Komputer\n'1' - Gracz\nPodaj cyfrę:\n");
  347.         start=read.nextInt();
  348.         if(start==1) turn = true;
  349.         else turn = false;
  350.        
  351.  
  352.         connect.setMaximizingTurnNow(turn);
  353.         System.out.println(connect);
  354.        
  355.         while (whetherFurther) {
  356.             if (turn) {
  357.                 move = read.nextInt();
  358.                 connect.makeMove(move);
  359.                 System.out.println(connect);
  360.                 turn = !turn;
  361.             } else {
  362.                 GameSearchAlgorithm algorithm = new AlphaBetaPruning(connect);
  363.  
  364.                 algorithm.execute();
  365.                 System.out.println(algorithm.getMovesScores());
  366.                
  367.                 connect.makeMove(Integer.valueOf(algorithm.getFirstBestMove()));
  368.  
  369.                 System.out.println(connect);
  370.                 turn = !turn;
  371.  
  372.             }
  373.            
  374.             whetherFurther = connect.still();
  375.         }
  376.  
  377.         if (!connect.isMaximizingTurnNow())
  378.             System.out.println("Zwyciezyl GRACZ!!!");
  379.         else
  380.             System.out.println("Zwyciezyl KOMPUTER!!!");
  381.         read.close();
  382.  
  383.     }
  384. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement