Advertisement
Guest User

PossibleRotationFinder2

a guest
Mar 30th, 2017
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 27.43 KB | None | 0 0
  1. package jpp.infinityloop.basics;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5.  
  6. public class PossibleRotationFinder2 {
  7.  
  8.     private Tile[][] tileArr;
  9.  
  10.     public PossibleRotationFinder2(Tile [][] tileArr){
  11.         this.tileArr = tileArr;
  12.     }
  13.  
  14.     public ArrayList<Tile> getPossibleRotations(Tile tile, int row, int col){
  15.         ArrayList<Tile> tileList = new ArrayList<Tile>();
  16.         if(row == 0){
  17.             if(isEdges(row,col,tileArr.length-1,tileArr[0].length-1)){
  18.                 return getPossibleRotationsOnEdgesFirstLine(tile, tileArr,row, col);
  19.             }
  20.             if(isCorner(row,col,tileArr.length-1,tileArr[0].length-1)){
  21.                 return getPossibleRotationsOnCornerFirstLine(tile, tileArr,row, col);
  22.             }
  23.         }else if(row > 0 && row < tileArr.length-1){
  24.             if(isEdges(row,col,tileArr.length-1,tileArr[0].length-1)){
  25.                 return getPossibleRotationsOnEdgesMiddleLines(tile, tileArr,row, col);
  26.             }
  27.             if(isCenter(row,col,tileArr.length-1,tileArr[0].length-1)){
  28.                 return getPossibleRotationsOnCenterMiddleLines(tile, tileArr,row, col);
  29.             }
  30.         }else{
  31.             if(isEdges(row,col,tileArr.length-1,tileArr[0].length-1)){
  32.                 return getPossibleRotationsOnEdgesLastLine(tile, tileArr,row, col);
  33.             }
  34.             if(isCorner(row,col,tileArr.length-1,tileArr[0].length-1)){
  35.                 return getPossibleRotationsOnCornerLastLine(tile, tileArr,row, col);
  36.             }
  37.         }
  38.         return tileList;
  39.     }
  40.  
  41.     public ArrayList<Tile> getPossibleRotationsOnCornerLastLine(Tile tile, Tile [][] tileArr, int row, int col){
  42.         ArrayList<Tile> tileList = new ArrayList<Tile>();
  43.         BlobCoder coder = new BlobCoder();
  44.         Tile firstRotated = new Tile(new CoordinatesOfTile(row,col),tile.getType(),tile.getRotatedTile().getOrientation());
  45.         Tile secondRotated = new Tile(new CoordinatesOfTile(row,col),tile.getType(),firstRotated.getRotatedTile().getOrientation());
  46.         Tile thirdRotated = new Tile(new CoordinatesOfTile(row,col),tile.getType(),secondRotated.getRotatedTile().getOrientation());
  47.         if(col == 0){
  48.             if(coder.getHexaDecimal(tile).equals("0") || coder.getHexaDecimal(tile).equals("2")
  49.                     || coder.getHexaDecimal(tile).equals("4") || coder.getHexaDecimal(tile).equals("6")){
  50.                 tileList.add(tile);
  51.             }
  52.             if(!firstRotated.getType().equals(TileType.EMPTY) && !firstRotated.getType().equals(TileType.CROSS)){
  53.                 if(coder.getHexaDecimal(firstRotated).equals("0") || coder.getHexaDecimal(firstRotated).equals("2")
  54.                         || coder.getHexaDecimal(firstRotated).equals("4") || coder.getHexaDecimal(firstRotated).equals("6")){
  55.                     tileList.add(firstRotated);
  56.                 }
  57.                 if(!secondRotated .getType().equals(TileType.STRAIGHT)){
  58.                     if(coder.getHexaDecimal(secondRotated ).equals("0") || coder.getHexaDecimal(secondRotated ).equals("2")
  59.                             || coder.getHexaDecimal(secondRotated ).equals("4") || coder.getHexaDecimal(secondRotated ).equals("6")){
  60.                         tileList.add(secondRotated );
  61.                     }
  62.                     if(coder.getHexaDecimal(thirdRotated).equals("0") || coder.getHexaDecimal(thirdRotated).equals("2")
  63.                             || coder.getHexaDecimal(thirdRotated).equals("4") || coder.getHexaDecimal(thirdRotated).equals("6")){
  64.                         tileList.add(thirdRotated);
  65.                     }
  66.                 }
  67.             }
  68.             return tileList;
  69.         }else{
  70.             if(coder.getHexaDecimal(tile).equals("0") || coder.getHexaDecimal(tile).equals("4")
  71.                     || coder.getHexaDecimal(tile).equals("8") || coder.getHexaDecimal(tile).equals("C")){
  72.                 tileList.add(tile);
  73.             }
  74.             if(!firstRotated.getType().equals(TileType.EMPTY) && !firstRotated.getType().equals(TileType.CROSS)){
  75.                 if(coder.getHexaDecimal(firstRotated).equals("0") || coder.getHexaDecimal(firstRotated).equals("4")
  76.                         || coder.getHexaDecimal(firstRotated).equals("8") || coder.getHexaDecimal(firstRotated).equals("C")){
  77.                     tileList.add(firstRotated);
  78.                 }
  79.                 if(!secondRotated .getType().equals(TileType.STRAIGHT)){
  80.                     if(coder.getHexaDecimal(secondRotated ).equals("0") || coder.getHexaDecimal(secondRotated ).equals("4")
  81.                             || coder.getHexaDecimal(secondRotated ).equals("8") || coder.getHexaDecimal(secondRotated ).equals("C")){
  82.                         tileList.add(secondRotated );
  83.                     }
  84.                     if(coder.getHexaDecimal(thirdRotated).equals("0") || coder.getHexaDecimal(thirdRotated).equals("4")
  85.                             || coder.getHexaDecimal(thirdRotated).equals("8") || coder.getHexaDecimal(thirdRotated).equals("C")){
  86.                         tileList.add(thirdRotated);
  87.                     }
  88.                 }
  89.             }
  90.             return tileList;
  91.         }
  92.     }
  93.  
  94.  
  95.     public ArrayList<Tile> getPossibleRotationsOnEdgesLastLine(Tile tile, Tile [][] tileArr, int row, int col){
  96.         ArrayList<Tile> tileList = new ArrayList<Tile>();
  97.         BlobCoder coder = new BlobCoder();
  98.         Tile firstRotated = new Tile(new CoordinatesOfTile(row,col),tile.getType(),tile.getRotatedTile().getOrientation());
  99.         Tile secondRotated = new Tile(new CoordinatesOfTile(row,col),tile.getType(),firstRotated.getRotatedTile().getOrientation());
  100.         Tile thirdRotated = new Tile(new CoordinatesOfTile(row,col),tile.getType(),secondRotated.getRotatedTile().getOrientation());
  101.         if(coder.getHexaDecimal(tile).equals("0") || coder.getHexaDecimal(tile).equals("2")
  102.                 ||  coder.getHexaDecimal(tile).equals("4") || coder.getHexaDecimal(tile).equals("6")
  103.                 || coder.getHexaDecimal(tile).equals("8") || coder.getHexaDecimal(tile).equals("A")
  104.                 || coder.getHexaDecimal(tile).equals("C") || coder.getHexaDecimal(tile).equals("E")){
  105.             tileList.add(tile);
  106.         }
  107.         if(!firstRotated.getType().equals(TileType.EMPTY) && !firstRotated.getType().equals(TileType.CROSS)){
  108.             if(coder.getHexaDecimal(firstRotated).equals("0") || coder.getHexaDecimal(firstRotated).equals("2")
  109.                     ||coder.getHexaDecimal(firstRotated).equals("4") || coder.getHexaDecimal(firstRotated).equals("6")
  110.                     ||coder.getHexaDecimal(firstRotated).equals("8") || coder.getHexaDecimal(firstRotated).equals("A")
  111.                     || coder.getHexaDecimal(firstRotated).equals("C") || coder.getHexaDecimal(firstRotated).equals("E")){
  112.                 tileList.add(firstRotated);
  113.             }
  114.             if(!secondRotated.getType().equals(TileType.STRAIGHT)){
  115.                 if(coder.getHexaDecimal(secondRotated).equals("0") || coder.getHexaDecimal(secondRotated).equals("2")
  116.                         ||coder.getHexaDecimal(secondRotated).equals("4") || coder.getHexaDecimal(secondRotated).equals("6")
  117.                         ||coder.getHexaDecimal(secondRotated).equals("8") || coder.getHexaDecimal(secondRotated).equals("A")
  118.                         ||coder.getHexaDecimal(secondRotated).equals("C") || coder.getHexaDecimal(secondRotated).equals("E")){
  119.                     tileList.add(secondRotated);
  120.                 }
  121.                 if(coder.getHexaDecimal(thirdRotated).equals("0") || coder.getHexaDecimal(thirdRotated).equals("2")
  122.                         || coder.getHexaDecimal(thirdRotated).equals("4") || coder.getHexaDecimal(thirdRotated).equals("6")
  123.                         || coder.getHexaDecimal(thirdRotated).equals("8") || coder.getHexaDecimal(thirdRotated).equals("A")
  124.                         ||coder.getHexaDecimal(thirdRotated).equals("C") || coder.getHexaDecimal(thirdRotated).equals("E")){
  125.                     tileList.add(thirdRotated);
  126.                 }
  127.             }
  128.         }
  129.         return tileList;
  130.     }
  131.  
  132.  
  133.  
  134.     public ArrayList<Tile> getPossibleRotationsOnCornerFirstLine(Tile tile, Tile [][] tileArr, int row, int col){
  135.         ArrayList<Tile> tileList = new ArrayList<Tile>();
  136.         BlobCoder coder = new BlobCoder();
  137.         Tile firstRotated = new Tile(new CoordinatesOfTile(row,col),tile.getType(),tile.getRotatedTile().getOrientation());
  138.         Tile secondRotated = new Tile(new CoordinatesOfTile(row,col),tile.getType(),firstRotated.getRotatedTile().getOrientation());
  139.         Tile thirdRotated = new Tile(new CoordinatesOfTile(row,col),tile.getType(),secondRotated.getRotatedTile().getOrientation());
  140.         if(col == 0){
  141.             if(coder.getHexaDecimal(tile).equals("0") || coder.getHexaDecimal(tile).equals("1")
  142.                     || coder.getHexaDecimal(tile).equals("2") || coder.getHexaDecimal(tile).equals("3")){
  143.                 tileList.add(tile);
  144.             }
  145.             if(!firstRotated.getType().equals(TileType.EMPTY) && !firstRotated.getType().equals(TileType.CROSS)){
  146.                 if(coder.getHexaDecimal(firstRotated).equals("0") || coder.getHexaDecimal(firstRotated).equals("1")
  147.                         || coder.getHexaDecimal(firstRotated).equals("2") || coder.getHexaDecimal(firstRotated).equals("3")){
  148.                     tileList.add(firstRotated);
  149.                 }
  150.                 if(!secondRotated.getType().equals(TileType.STRAIGHT)){
  151.                     if(coder.getHexaDecimal(secondRotated).equals("0") || coder.getHexaDecimal(secondRotated).equals("1")
  152.                             || coder.getHexaDecimal(secondRotated).equals("2") || coder.getHexaDecimal(secondRotated).equals("3")){
  153.                         tileList.add(secondRotated);
  154.                     }
  155.                     if(coder.getHexaDecimal(thirdRotated).equals("0") || coder.getHexaDecimal(thirdRotated).equals("1")
  156.                             || coder.getHexaDecimal(thirdRotated).equals("2") || coder.getHexaDecimal(thirdRotated).equals("3")){
  157.                         tileList.add(thirdRotated);
  158.                     }
  159.                 }
  160.             }
  161.             return tileList;
  162.         }else{
  163.             if(coder.getHexaDecimal(tile).equals("0") || coder.getHexaDecimal(tile).equals("1")
  164.                     || coder.getHexaDecimal(tile).equals("8") || coder.getHexaDecimal(tile).equals("9")){
  165.                 tileList.add(tile);
  166.             }
  167.             if(!firstRotated.getType().equals(TileType.EMPTY) && !firstRotated.getType().equals(TileType.CROSS)){
  168.                 if(coder.getHexaDecimal(firstRotated).equals("0") || coder.getHexaDecimal(firstRotated).equals("1")
  169.                         || coder.getHexaDecimal(firstRotated).equals("8") || coder.getHexaDecimal(firstRotated).equals("9")){
  170.                     tileList.add(firstRotated);
  171.                 }
  172.                 if(!secondRotated.getType().equals(TileType.STRAIGHT)){
  173.                     if(coder.getHexaDecimal(secondRotated).equals("0") || coder.getHexaDecimal(secondRotated).equals("1")
  174.                             || coder.getHexaDecimal(secondRotated).equals("8") || coder.getHexaDecimal(secondRotated).equals("9")){
  175.                         tileList.add(secondRotated);
  176.                     }
  177.                     if(coder.getHexaDecimal(thirdRotated).equals("0") || coder.getHexaDecimal(thirdRotated).equals("1")
  178.                             || coder.getHexaDecimal(thirdRotated).equals("8") || coder.getHexaDecimal(thirdRotated).equals("9")){
  179.                         tileList.add(thirdRotated);
  180.                     }
  181.                 }
  182.             }
  183.             return tileList;
  184.         }
  185.     }
  186.  
  187.     public ArrayList<Tile> getPossibleRotationsOnEdgesFirstLine(Tile tile, Tile [][] tileArr, int row, int col){
  188.         ArrayList<Tile> tileList = new ArrayList<Tile>();
  189.         BlobCoder coder = new BlobCoder();
  190.         Tile firstRotated = new Tile(new CoordinatesOfTile(row,col),tile.getType(),tile.getRotatedTile().getOrientation());
  191.         Tile secondRotated = new Tile(new CoordinatesOfTile(row,col),tile.getType(),firstRotated.getRotatedTile().getOrientation());
  192.         Tile thirdRotated = new Tile(new CoordinatesOfTile(row,col),tile.getType(),secondRotated.getRotatedTile().getOrientation());
  193.         if(coder.getHexaDecimal(tile).equals("0") || coder.getHexaDecimal(tile).equals("1")
  194.                 ||  coder.getHexaDecimal(tile).equals("2") || coder.getHexaDecimal(tile).equals("3")
  195.                 || coder.getHexaDecimal(tile).equals("8") || coder.getHexaDecimal(tile).equals("9")
  196.                 || coder.getHexaDecimal(tile).equals("A") || coder.getHexaDecimal(tile).equals("B")){
  197.             tileList.add(tile);
  198.         }
  199.         if(!firstRotated.getType().equals(TileType.EMPTY) && !firstRotated.getType().equals(TileType.CROSS)){
  200.             if(coder.getHexaDecimal(firstRotated).equals("0") || coder.getHexaDecimal(firstRotated).equals("1")
  201.                     ||coder.getHexaDecimal(firstRotated).equals("2") || coder.getHexaDecimal(firstRotated).equals("3")
  202.                     ||coder.getHexaDecimal(firstRotated).equals("8") || coder.getHexaDecimal(firstRotated).equals("9")
  203.                     || coder.getHexaDecimal(firstRotated).equals("A") || coder.getHexaDecimal(firstRotated).equals("B")){
  204.                 tileList.add(firstRotated);
  205.             }
  206.             if(!secondRotated.getType().equals(TileType.STRAIGHT)){
  207.                 if(coder.getHexaDecimal(secondRotated).equals("0") || coder.getHexaDecimal(secondRotated).equals("1")
  208.                         ||coder.getHexaDecimal(secondRotated).equals("2") || coder.getHexaDecimal(secondRotated).equals("3")
  209.                         ||coder.getHexaDecimal(secondRotated).equals("8") || coder.getHexaDecimal(secondRotated).equals("9")
  210.                         ||coder.getHexaDecimal(secondRotated).equals("A") || coder.getHexaDecimal(secondRotated).equals("B")){
  211.                     tileList.add(secondRotated);
  212.                 }
  213.                 if(coder.getHexaDecimal(thirdRotated).equals("0") || coder.getHexaDecimal(thirdRotated).equals("1")
  214.                         || coder.getHexaDecimal(thirdRotated).equals("2") || coder.getHexaDecimal(thirdRotated).equals("3")
  215.                         || coder.getHexaDecimal(thirdRotated).equals("8") || coder.getHexaDecimal(thirdRotated).equals("9")
  216.                         ||coder.getHexaDecimal(thirdRotated).equals("A") || coder.getHexaDecimal(thirdRotated).equals("B")){
  217.                     tileList.add(thirdRotated);
  218.                 }
  219.             }
  220.         }
  221.         return tileList;
  222.     }
  223.  
  224.     public ArrayList<Tile> getPossibleRotationsOnEdgesMiddleLines(Tile tile, Tile [][]tileArr, int row, int col){
  225.         ArrayList<Tile> tileList = new ArrayList<Tile>();
  226.         BlobCoder coder = new BlobCoder();
  227.         Tile firstRotated = new Tile(new CoordinatesOfTile(row,col),tile.getType(),tile.getRotatedTile().getOrientation());
  228.         Tile secondRotated = new Tile(new CoordinatesOfTile(row,col),tile.getType(),firstRotated.getRotatedTile().getOrientation());
  229.         Tile thirdRotated = new Tile(new CoordinatesOfTile(row,col),tile.getType(),secondRotated.getRotatedTile().getOrientation());
  230.         if(col == 0){
  231.             if(coder.getHexaDecimal(tile).equals("0") || coder.getHexaDecimal(tile).equals("1")
  232.                     ||  coder.getHexaDecimal(tile).equals("2") || coder.getHexaDecimal(tile).equals("3")
  233.                     || coder.getHexaDecimal(tile).equals("4") || coder.getHexaDecimal(tile).equals("5")
  234.                     || coder.getHexaDecimal(tile).equals("6") || coder.getHexaDecimal(tile).equals("7")){
  235.                 tileList.add(tile);
  236.             }
  237.             if(!firstRotated.getType().equals(TileType.EMPTY) && !firstRotated.getType().equals(TileType.CROSS)){
  238.                 if(coder.getHexaDecimal(firstRotated).equals("0") || coder.getHexaDecimal(firstRotated).equals("1")
  239.                         ||coder.getHexaDecimal(firstRotated).equals("2") || coder.getHexaDecimal(firstRotated).equals("3")
  240.                         ||coder.getHexaDecimal(firstRotated).equals("4") || coder.getHexaDecimal(firstRotated).equals("5")
  241.                         || coder.getHexaDecimal(firstRotated).equals("6") || coder.getHexaDecimal(firstRotated).equals("7")){
  242.                     tileList.add(firstRotated);
  243.                 }
  244.                 if(!secondRotated.getType().equals(TileType.STRAIGHT)){
  245.                     if(coder.getHexaDecimal(secondRotated).equals("0") || coder.getHexaDecimal(secondRotated).equals("1")
  246.                             ||coder.getHexaDecimal(secondRotated).equals("2") || coder.getHexaDecimal(secondRotated).equals("3")
  247.                             ||coder.getHexaDecimal(secondRotated).equals("4") || coder.getHexaDecimal(secondRotated).equals("5")
  248.                             ||coder.getHexaDecimal(secondRotated).equals("6") || coder.getHexaDecimal(secondRotated).equals("7")){
  249.                         tileList.add(secondRotated);
  250.                     }
  251.                     if(coder.getHexaDecimal(thirdRotated).equals("0") || coder.getHexaDecimal(thirdRotated).equals("1")
  252.                             || coder.getHexaDecimal(thirdRotated).equals("2") || coder.getHexaDecimal(thirdRotated).equals("3")
  253.                             || coder.getHexaDecimal(thirdRotated).equals("4") || coder.getHexaDecimal(thirdRotated).equals("5")
  254.                             ||coder.getHexaDecimal(thirdRotated).equals("6") || coder.getHexaDecimal(thirdRotated).equals("7")){
  255.                         tileList.add(thirdRotated);
  256.                     }
  257.                 }
  258.             }
  259.             return tileList;
  260.         }else{
  261.             if(coder.getHexaDecimal(tile).equals("0") || coder.getHexaDecimal(tile).equals("1")
  262.                     ||  coder.getHexaDecimal(tile).equals("4") || coder.getHexaDecimal(tile).equals("5")
  263.                     || coder.getHexaDecimal(tile).equals("8") || coder.getHexaDecimal(tile).equals("9")
  264.                     || coder.getHexaDecimal(tile).equals("C") || coder.getHexaDecimal(tile).equals("D")){
  265.                 tileList.add(tile);
  266.             }
  267.             if(!firstRotated.getType().equals(TileType.EMPTY) && !firstRotated.getType().equals(TileType.CROSS)){
  268.                 if(coder.getHexaDecimal(firstRotated).equals("0") || coder.getHexaDecimal(firstRotated).equals("1")
  269.                         ||coder.getHexaDecimal(firstRotated).equals("4") || coder.getHexaDecimal(firstRotated).equals("5")
  270.                         ||coder.getHexaDecimal(firstRotated).equals("8") || coder.getHexaDecimal(firstRotated).equals("9")
  271.                         || coder.getHexaDecimal(firstRotated).equals("C") || coder.getHexaDecimal(firstRotated).equals("D")){
  272.                     tileList.add(firstRotated);
  273.                 }
  274.                 if(!secondRotated.getType().equals(TileType.STRAIGHT)){
  275.                     if(coder.getHexaDecimal(secondRotated).equals("0") || coder.getHexaDecimal(secondRotated).equals("1")
  276.                             ||coder.getHexaDecimal(secondRotated).equals("4") || coder.getHexaDecimal(secondRotated).equals("5")
  277.                             ||coder.getHexaDecimal(secondRotated).equals("8") || coder.getHexaDecimal(secondRotated).equals("9")
  278.                             ||coder.getHexaDecimal(secondRotated).equals("C") || coder.getHexaDecimal(secondRotated).equals("D")){
  279.                         tileList.add(secondRotated);
  280.                     }
  281.                     if(coder.getHexaDecimal(thirdRotated).equals("0") || coder.getHexaDecimal(thirdRotated).equals("1")
  282.                             || coder.getHexaDecimal(thirdRotated).equals("4") || coder.getHexaDecimal(thirdRotated).equals("5")
  283.                             || coder.getHexaDecimal(thirdRotated).equals("8") || coder.getHexaDecimal(thirdRotated).equals("9")
  284.                             ||coder.getHexaDecimal(thirdRotated).equals("C") || coder.getHexaDecimal(thirdRotated).equals("D")){
  285.                         tileList.add(thirdRotated);
  286.                     }
  287.                 }
  288.             }
  289.             return tileList;
  290.         }
  291.     }
  292.  
  293.     public ArrayList<Tile> getPossibleRotationsOnCenterMiddleLines(Tile tile, Tile [][] tileArr, int row, int col){
  294.         ArrayList<Tile> tileList = new ArrayList<Tile>();
  295.         Tile firstRotated = new Tile(new CoordinatesOfTile(row,col),tile.getType(),tile.getRotatedTile().getOrientation());
  296.         Tile secondRotated = new Tile(new CoordinatesOfTile(row,col),tile.getType(),firstRotated.getRotatedTile().getOrientation());
  297.         Tile thirdRotated = new Tile(new CoordinatesOfTile(row,col),tile.getType(),secondRotated.getRotatedTile().getOrientation());
  298.         tileList.add(tile);
  299.         if(!firstRotated.getType().equals(TileType.EMPTY) && !firstRotated.getType().equals(TileType.CROSS)){
  300.             tileList.add(firstRotated);
  301.             if(!secondRotated.getType().equals(TileType.STRAIGHT)){
  302.                 tileList.add(secondRotated);
  303.                 tileList.add(thirdRotated);
  304.             }
  305.         }
  306.         return tileList;
  307.     }
  308.  
  309.     public boolean isCorner(int i, int j, int height, int width){
  310.         if(i == 0 || i == height){
  311.             if(j == 0 || j == width){
  312.                 return true;
  313.             }else{
  314.                 return false;
  315.             }
  316.         }else{
  317.             return false;
  318.         }
  319.     }
  320.  
  321.     public boolean isEdges(int i, int j, int height, int width){
  322.         if(i == 0 || i == height){
  323.             if(j!= 0 && j!= width){
  324.                 return true;
  325.             }else{
  326.                 return false;
  327.             }
  328.         }else{
  329.             if(j == 0 || j == width){
  330.                 return true;
  331.             }else{
  332.                 return false;
  333.             }
  334.         }
  335.     }
  336.  
  337.     public boolean isCenter(int i, int j, int width, int height){
  338.         if(isEdges(i, j, width, height) == false && isCorner(i, j, width, height) == false){
  339.             return true;
  340.         }else{
  341.             return false;
  342.         }
  343.     }
  344.    
  345.     public ArrayList<Tile> rotationByNeighbourhood(Tile[][] field, int x, int y, int neighbourhood){
  346.         boolean left = false, up = false, right = false, down = false;
  347.         boolean leftN = false, upN = false, rightN = false, downN = false;
  348.         if(neighbourhood-8 >= 0){
  349.             leftN = true;
  350.             neighbourhood -= 8;
  351.         }
  352.         if(neighbourhood-4 >= 0){
  353.             upN = true;
  354.             neighbourhood -= 4;
  355.         }
  356.         if(neighbourhood-2 >= 0){
  357.             rightN = true;
  358.             neighbourhood -= 2;
  359.         }
  360.         if(neighbourhood-1 >= 0){
  361.             downN = true;
  362.         }
  363.         ArrayList<Tile> returningList = new ArrayList<>();
  364.         if(leftN){
  365.             left=field[x][y-1].hasConnectionTo(Orientation.LEFT);
  366.         }
  367.         if(upN){
  368.             up=field[x-1][y].hasConnectionTo(Orientation.UP);
  369.         }
  370.         if(rightN){
  371.             right=field[x][y+1].hasConnectionTo(Orientation.RIGHT);
  372.         }
  373.         if(downN){
  374.             down=field[x+1][y].hasConnectionTo(Orientation.DOWN);
  375.         }
  376.         TileType type = field[x][y].getType();
  377.         if((left && up && right && down && type != TileType.CROSS) ||
  378.                 (!left && up && right && down && type == TileType.CROSS) ||
  379.                 (left && !up && right && down && type == TileType.CROSS) ||
  380.                 (left && up && !right && down && type == TileType.CROSS) ||
  381.                 (left && up && right && !down && type == TileType.CROSS)){
  382.             return returningList;
  383.         } else if(type == TileType.CROSS){
  384.             Orientation[] or = {Orientation.DOWN, Orientation.LEFT, Orientation.UP, Orientation.RIGHT};
  385.             returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.CROSS, or));
  386.             return returningList;
  387.         }
  388.         if(type == TileType.DEAD_END){
  389.             // Wenn mindestens zwei Nachbarn eine Verbindung haben, funktioniert das Feld so nicht.
  390.             if(!((left && up) || (left && right) || (left && down) || (up && down) || (up && right) || (down && right))){
  391.                 Orientation[] or = new Orientation[1];
  392.                 if(left){
  393.                     or[0] = Orientation.LEFT;
  394.                 }
  395.                 if(up){
  396.                     or[0] = Orientation.UP;
  397.                 }
  398.                 if(right){
  399.                     or[0] = Orientation.RIGHT;
  400.                 }
  401.                 if(down){
  402.                     or[0] = Orientation.DOWN;
  403.                 }
  404.                 if(or[0] != null){
  405.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.DEAD_END, or));
  406.                 }else{
  407.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.DEAD_END, Orientation.DOWN));
  408.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.DEAD_END, Orientation.UP));
  409.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.DEAD_END, Orientation.LEFT));
  410.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.DEAD_END, Orientation.RIGHT));
  411.                 }
  412.             }
  413.             return returningList;
  414.         }
  415.         if(type == TileType.BEND){
  416.             int connection = 0 + (left?1:0) + (up?1:0) + (right?1:0) + (down?1:0);
  417.             switch(connection){
  418.             case 0:
  419.                 returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.BEND, Orientation.DOWN));
  420.                 returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.BEND, Orientation.UP));
  421.                 returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.BEND, Orientation.LEFT));
  422.                 returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.BEND, Orientation.RIGHT));
  423.                 return returningList;
  424.             case 1:
  425.                 if(left){
  426.                     if(!down)
  427.                         returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.BEND, Orientation.LEFT));
  428.                     if(!up)
  429.                         returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.BEND, Orientation.DOWN));
  430.                     return returningList;
  431.                 }else if(up){
  432.                     if(!left)
  433.                         returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.BEND, Orientation.UP));
  434.                     if(!right)
  435.                         returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.BEND, Orientation.LEFT));
  436.                     return returningList;                  
  437.                 }else if(down){
  438.                     if(!right)
  439.                         returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.BEND, Orientation.DOWN));
  440.                     if(!left)
  441.                         returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.BEND, Orientation.RIGHT));
  442.                     return returningList;                  
  443.                 }else{
  444.                     if(!down)
  445.                         returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.BEND, Orientation.UP));
  446.                     if(!left)
  447.                         returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.BEND, Orientation.RIGHT));
  448.                     return returningList;                  
  449.                 }
  450.             case 2:
  451.                 if(left && up){
  452.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.BEND, Orientation.LEFT));
  453.                 }
  454.                 if(right && up){
  455.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.BEND, Orientation.UP));
  456.                 }
  457.                 if(left && down){
  458.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.BEND, Orientation.DOWN));
  459.                 }
  460.                 if(right && down){
  461.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.BEND, Orientation.RIGHT));
  462.                 }
  463.                 return returningList;
  464.             default:
  465.                 return returningList;
  466.             }
  467.         }
  468.         if(type == TileType.STRAIGHT){
  469.             Orientation[] or = new Orientation[2];
  470.             if((left && right && !up && !down) || (right && !up && !down) ||
  471.                 (left && !up && !down) || (left && right && !up) ||
  472.                 (left && right && !down) || (left && right) || (left && !up) ||
  473.                 (right && !up) || (left && !down) || (right && !down) || (!up && !down)){
  474.                 or[0] = Orientation.LEFT;
  475.                 or[1] = Orientation.RIGHT;
  476.                 returningList.add(new Tile(new CoordinatesOfTile(x,y), TileType.STRAIGHT, or));
  477.             }
  478.             if((!left && !right && up && down) || (!right && up && down) ||
  479.                 (!left && up && down) || (!left && !right && up) ||
  480.                 (!left && !right && down)|| (!left && !right) || (!left && up) ||
  481.                 (!right && up) || (!left && down) || (!right && down) || (up && down)){
  482.                 or[0] = Orientation.UP;
  483.                 or[1] = Orientation.DOWN;
  484.                 returningList.add(new Tile(new CoordinatesOfTile(x,y), TileType.STRAIGHT, or));
  485.             }
  486.             return returningList;
  487.         }
  488.         if(type == TileType.TEE){
  489.             int connection = 0 + (left?1:0) + (up?1:0) + (right?1:0) + (down?1:0);
  490.             int known = 0 + (leftN?1:0) + (upN?1:0) + (rightN?1:0) + (downN?1:0);
  491.             if(known >= connection + 2) return returningList;
  492.             switch(connection){
  493.             case 3:
  494.                 if(left && up && right){
  495.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.LEFT));
  496.                 }
  497.                 if(down && up && right){
  498.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.UP));
  499.                 }
  500.                 if(left && down && right){
  501.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.RIGHT));
  502.                 }
  503.                 if(left && down && up){
  504.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.DOWN));
  505.                 }
  506.                 return returningList;
  507.             case 2:
  508.                 if(left && up){
  509.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.LEFT));
  510.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.DOWN));
  511.                 }
  512.                 if(left && down){
  513.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.DOWN));
  514.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.RIGHT));
  515.                 }
  516.                 if(up && right){
  517.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.UP));
  518.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.LEFT));
  519.                 }
  520.                 if(down && right){
  521.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.RIGHT));
  522.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.UP));                
  523.                 }
  524.                 if(left && right){
  525.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.RIGHT));
  526.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.LEFT));                  
  527.                 }
  528.                 if(up && down){
  529.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.DOWN));
  530.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.UP));                
  531.                 }
  532.                 return returningList;
  533.             case 1:
  534.                 if(left){
  535.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.RIGHT));
  536.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.LEFT));      
  537.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.DOWN));                  
  538.                 }
  539.                 if(right){
  540.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.RIGHT));
  541.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.LEFT));  
  542.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.UP));                
  543.                 }
  544.                 if(up){
  545.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.LEFT));      
  546.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.DOWN));
  547.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.UP));
  548.                 }
  549.                 if(down){
  550.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.RIGHT)); 
  551.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.DOWN));
  552.                     returningList.add(new Tile(new CoordinatesOfTile(x, y), TileType.TEE, Orientation.UP));
  553.                 }
  554.             default:
  555.                 return returningList;
  556.             }
  557.         }
  558.         return returningList;
  559.     }
  560.  
  561. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement