Guest User

Untitled

a guest
Jun 7th, 2014
1,279
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import java.awt.Color;
  2. import java.awt.GraphicsDevice;
  3. import java.awt.GraphicsEnvironment;
  4. import java.awt.MouseInfo;
  5. import java.awt.Point;
  6. import java.awt.Rectangle;
  7. import java.awt.Robot;
  8. import java.awt.Toolkit;
  9. import java.awt.event.InputEvent;
  10. import java.awt.geom.Point2D;
  11. import java.awt.image.BufferedImage;
  12. import java.io.File;
  13. import java.io.FileOutputStream;
  14. import java.io.IOException;
  15. import java.net.MalformedURLException;
  16. import java.net.URL;
  17. import java.nio.channels.Channels;
  18. import java.nio.channels.ReadableByteChannel;
  19. import java.nio.file.Files;
  20. import java.nio.file.Paths;
  21. import java.util.ArrayList;
  22.  
  23.  
  24. import javax.imageio.ImageIO;
  25.  
  26. class Card{
  27.    
  28.     int id;
  29.     String shape;
  30.     String color;
  31.     String infill;
  32.     int shapeCount;
  33.     byte[] fileBytes;
  34.     Point position;
  35.    
  36.     Card(int id, String shape, String color, String infill, int shapeCount) throws Exception{
  37.         this.id = id;
  38.         this.shape = shape;
  39.         this.color = color;
  40.         this.infill = infill;
  41.         this.shapeCount = shapeCount;
  42.         this.fileBytes = Files.readAllBytes(Paths.get(id+".png"));
  43.     }
  44. }
  45.  
  46. public class SetBeater {
  47.  
  48.     public static void main(String[] args) throws Exception {
  49.        
  50.         Card[] allCards = new Card[81];
  51.         allCards[0] = new Card(1, "squiggle", "red", "solid", 1);
  52.         allCards[1] = new Card(2, "squiggle", "red", "solid", 2);
  53.         allCards[2] = new Card(3, "squiggle", "red", "solid", 3);
  54.         allCards[3] = new Card(4, "squiggle", "purple", "solid", 1);
  55.         allCards[4] = new Card(5, "squiggle", "purple", "solid", 2);
  56.         allCards[5] = new Card(6, "squiggle", "purple", "solid", 3);
  57.         allCards[6] = new Card(7, "squiggle", "green", "solid", 1);
  58.         allCards[7] = new Card(8, "squiggle", "green", "solid", 2);
  59.         allCards[8] = new Card(9, "squiggle", "green", "solid", 3);
  60.        
  61.         allCards[9] = new Card(10, "diamond", "red", "solid", 1);
  62.         allCards[10] = new Card(11, "diamond", "red", "solid", 2);
  63.         allCards[11] = new Card(12, "diamond", "red", "solid", 3);
  64.         allCards[12] = new Card(13, "diamond", "purple", "solid", 1);
  65.         allCards[13] = new Card(14, "diamond", "purple", "solid", 2);
  66.         allCards[14] = new Card(15, "diamond", "purple", "solid", 3);
  67.         allCards[15] = new Card(16, "diamond", "green", "solid", 1);
  68.         allCards[16] = new Card(17, "diamond", "green", "solid", 2);
  69.         allCards[17] = new Card(18, "diamond", "green", "solid", 3);
  70.        
  71.         allCards[18] = new Card(19, "oval", "red", "solid", 1);
  72.         allCards[19] = new Card(20, "oval", "red", "solid", 2);
  73.         allCards[20] = new Card(21, "oval", "red", "solid", 3);
  74.         allCards[21] = new Card(22, "oval", "purple", "solid", 1);
  75.         allCards[22] = new Card(23, "oval", "purple", "solid", 2);
  76.         allCards[23] = new Card(24, "oval", "purple", "solid", 3);
  77.         allCards[24] = new Card(25, "oval", "green", "solid", 1);
  78.         allCards[25] = new Card(26, "oval", "green", "solid", 2);
  79.         allCards[26] = new Card(27, "oval", "green", "solid", 3);
  80.        
  81.         allCards[27] = new Card(28, "squiggle", "red", "stripe", 1);
  82.         allCards[28] = new Card(29, "squiggle", "red", "stripe", 2);
  83.         allCards[29] = new Card(30, "squiggle", "red", "stripe", 3);
  84.         allCards[30] = new Card(31, "squiggle", "purple", "stripe", 1);
  85.         allCards[31] = new Card(32, "squiggle", "purple", "stripe", 2);
  86.         allCards[32] = new Card(33, "squiggle", "purple", "stripe", 3);
  87.         allCards[33] = new Card(34, "squiggle", "green", "stripe", 1);
  88.         allCards[34] = new Card(35, "squiggle", "green", "stripe", 2);
  89.         allCards[35] = new Card(36, "squiggle", "green", "stripe", 3);
  90.        
  91.         allCards[36] = new Card(37, "diamond", "red", "stripe", 1);
  92.         allCards[37] = new Card(38, "diamond", "red", "stripe", 2);
  93.         allCards[38] = new Card(39, "diamond", "red", "stripe", 3);
  94.         allCards[39] = new Card(40, "diamond", "purple", "stripe", 1);
  95.         allCards[40] = new Card(41, "diamond", "purple", "stripe", 2);
  96.         allCards[41] = new Card(42, "diamond", "purple", "stripe", 3);
  97.         allCards[42] = new Card(43, "diamond", "green", "stripe", 1);
  98.         allCards[43] = new Card(44, "diamond", "green", "stripe", 2);
  99.         allCards[44] = new Card(45, "diamond", "green", "stripe", 3);
  100.        
  101.         allCards[45] = new Card(46, "oval", "red", "stripe", 1);
  102.         allCards[46] = new Card(47, "oval", "red", "stripe", 2);
  103.         allCards[47] = new Card(48, "oval", "red", "stripe", 3);
  104.         allCards[48] = new Card(49, "oval", "purple", "stripe", 1);
  105.         allCards[49] = new Card(50, "oval", "purple", "stripe", 2);
  106.         allCards[50] = new Card(51, "oval", "purple", "stripe", 3);
  107.         allCards[51] = new Card(52, "oval", "green", "stripe", 1);
  108.         allCards[52] = new Card(53, "oval", "green", "stripe", 2);
  109.         allCards[53] = new Card(54, "oval", "green", "stripe", 3);
  110.        
  111.         allCards[54] = new Card(55, "squiggle", "red", "empty", 1);
  112.         allCards[55] = new Card(56, "squiggle", "red", "empty", 2);
  113.         allCards[56] = new Card(57, "squiggle", "red", "empty", 3);
  114.         allCards[57] = new Card(58, "squiggle", "purple", "empty", 1);
  115.         allCards[58] = new Card(59, "squiggle", "purple", "empty", 2);
  116.         allCards[59] = new Card(60, "squiggle", "purple", "empty", 3);
  117.         allCards[60] = new Card(61, "squiggle", "green", "empty", 1);
  118.         allCards[61] = new Card(62, "squiggle", "green", "empty", 2);
  119.         allCards[62] = new Card(63, "squiggle", "green", "empty", 3);
  120.        
  121.         allCards[63] = new Card(64, "diamond", "red", "empty", 1);
  122.         allCards[64] = new Card(65, "diamond", "red", "empty", 2);
  123.         allCards[65] = new Card(66, "diamond", "red", "empty", 3);
  124.         allCards[66] = new Card(67, "diamond", "purple", "empty", 1);
  125.         allCards[67] = new Card(68, "diamond", "purple", "empty", 2);
  126.         allCards[68] = new Card(69, "diamond", "purple", "empty", 3);
  127.         allCards[69] = new Card(70, "diamond", "green", "empty", 1);
  128.         allCards[70] = new Card(71, "diamond", "green", "empty", 2);
  129.         allCards[71] = new Card(72, "diamond", "green", "empty", 3);
  130.        
  131.         allCards[72] = new Card(73, "oval", "red", "empty", 1);
  132.         allCards[73] = new Card(74, "oval", "red", "empty", 2);
  133.         allCards[74] = new Card(75, "oval", "red", "empty", 3);
  134.         allCards[75] = new Card(76, "oval", "purple", "empty", 1);
  135.         allCards[76] = new Card(77, "oval", "purple", "empty", 2);
  136.         allCards[77] = new Card(78, "oval", "purple", "empty", 3);
  137.         allCards[78] = new Card(79, "oval", "green", "empty", 1);
  138.         allCards[79] = new Card(80, "oval", "green", "empty", 2);
  139.         allCards[80] = new Card(81, "oval", "green", "empty", 3);
  140.        
  141.         GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();  
  142.         GraphicsDevice[] screens = ge.getScreenDevices();  
  143.        
  144.         Rectangle screenBounds = screens[1].getDefaultConfiguration().getBounds();
  145.         BufferedImage image = new Robot().createScreenCapture(screenBounds);
  146.        
  147.         int rows = 3, cols = 4;
  148.         BufferedImage[][] cards = new BufferedImage[rows][cols];
  149.         cards[0][0] = image.getSubimage(245, 499, 95, 62);
  150.         cards[0][1] = image.getSubimage(394, 499, 95, 62);
  151.         cards[0][2] = image.getSubimage(543, 499, 95, 62);
  152.         cards[0][3] = image.getSubimage(693, 499, 95, 62);
  153.        
  154.         cards[1][0] = image.getSubimage(245, 588, 95, 62);
  155.         cards[1][1] = image.getSubimage(394, 588, 95, 62);
  156.         cards[1][2] = image.getSubimage(543, 588, 95, 62);
  157.         cards[1][3] = image.getSubimage(693, 588, 95, 62);
  158.        
  159.         cards[2][0] = image.getSubimage(245, 677, 95, 62);
  160.         cards[2][1] = image.getSubimage(394, 677, 95, 62);
  161.         cards[2][2] = image.getSubimage(543, 677, 95, 62);
  162.         cards[2][3] = image.getSubimage(693, 677, 95, 62);
  163.        
  164.         ArrayList<Byte> [][] cardBytes = new ArrayList[rows][cols];
  165.         for(int i=0; i<rows; i++)
  166.             for(int j=0; j<cols; j++){
  167.                 cardBytes[i][j] = new ArrayList<Byte>();
  168.                 ImageIO.write(cards[i][j], "png", new File("card-"+i+","+j+".png"));
  169.                 byte[] bytes = Files.readAllBytes(Paths.get("card-"+i+","+j+".png"));
  170.                 for(int k=0; k<bytes.length; k++)
  171.                     cardBytes[i][j].add(bytes[k]);
  172.             }
  173.        
  174.         int checkBoxSides = 12;
  175.         Point checkBoxes[][] = new Point[rows][cols];
  176.         for(int i=0; i<rows; i++)
  177.             for(int j=0; j<cols; j++)
  178.                 checkBoxes[i][j] = new Point();
  179.        
  180.         int xOffset = -1600;
  181.         checkBoxes[0][0].setLocation(xOffset+292,575);
  182.         checkBoxes[0][1].setLocation(xOffset+441,575);
  183.         checkBoxes[0][2].setLocation(xOffset+591,575);
  184.         checkBoxes[0][3].setLocation(xOffset+741,575);
  185.        
  186.         checkBoxes[1][0].setLocation(xOffset+292,663);
  187.         checkBoxes[1][1].setLocation(xOffset+441,663);
  188.         checkBoxes[1][2].setLocation(xOffset+591,663);
  189.         checkBoxes[1][3].setLocation(xOffset+741,663);
  190.        
  191.         checkBoxes[2][0].setLocation(xOffset+292,752);
  192.         checkBoxes[2][1].setLocation(xOffset+441,752);
  193.         checkBoxes[2][2].setLocation(xOffset+591,752);
  194.         checkBoxes[2][3].setLocation(xOffset+741,752);
  195.        
  196.         ArrayList<Card> dealtCards = new ArrayList<Card>();
  197.         for(int i=0; i<rows; i++)
  198.             for(int j=0; j<cols; j++)
  199.                 for(int k=0; k<allCards.length; k++)
  200.                     if (cardBytes[i][j].size() == allCards[k].fileBytes.length){
  201.                         //System.out.println("Same length detected");
  202.                         boolean matched = true;
  203.                         for(int l=0; l<allCards[k].fileBytes.length; l++)
  204.                             if (cardBytes[i][j].get(l) != allCards[k].fileBytes[l]){
  205.                                 matched = false;
  206.                                 break;
  207.                             }
  208.  
  209.                         if (matched){
  210.                             allCards[k].position = new Point(i,j);
  211.                             dealtCards.add(allCards[k]);
  212.                         }
  213.                     }
  214.        
  215.         ArrayList<ArrayList<Card>> setsFound;
  216.         setsFound = new ArrayList<ArrayList<Card>>();
  217.        
  218.         for(int i=0; i<dealtCards.size(); i++)
  219.             for(int j=i+1; j<dealtCards.size(); j++)
  220.                 for(int k=j+1; k<dealtCards.size(); k++){
  221.                     boolean sameColor = (dealtCards.get(i).color == dealtCards.get(j).color && dealtCards.get(i).color == dealtCards.get(k).color && dealtCards.get(j).color == dealtCards.get(k).color);
  222.                     boolean sameInfill = (dealtCards.get(i).infill == dealtCards.get(j).infill && dealtCards.get(i).infill == dealtCards.get(k).infill && dealtCards.get(j).infill == dealtCards.get(k).infill);
  223.                     boolean sameShape = (dealtCards.get(i).shape == dealtCards.get(j).shape && dealtCards.get(i).shape == dealtCards.get(k).shape && dealtCards.get(j).shape == dealtCards.get(k).shape);
  224.                     boolean sameShapeCount = (dealtCards.get(i).shapeCount == dealtCards.get(j).shapeCount && dealtCards.get(i).shapeCount == dealtCards.get(k).shapeCount && dealtCards.get(j).shapeCount == dealtCards.get(k).shapeCount);
  225.                    
  226.                     int sameTotal = 0;
  227.                     if (sameColor)
  228.                         sameTotal++;
  229.                     if (sameInfill)
  230.                         sameTotal++;
  231.                     if (sameShape)
  232.                         sameTotal++;
  233.                     if (sameShapeCount)
  234.                         sameTotal++;
  235.                    
  236.                     boolean allDifferentColor = (dealtCards.get(i).color != dealtCards.get(j).color && dealtCards.get(i).color != dealtCards.get(k).color && dealtCards.get(j).color != dealtCards.get(k).color);
  237.                     boolean allDifferentInfill = (dealtCards.get(i).infill != dealtCards.get(j).infill && dealtCards.get(i).infill != dealtCards.get(k).infill && dealtCards.get(j).infill != dealtCards.get(k).infill);
  238.                     boolean allDifferentShape = (dealtCards.get(i).shape != dealtCards.get(j).shape && dealtCards.get(i).shape != dealtCards.get(k).shape && dealtCards.get(j).shape != dealtCards.get(k).shape);
  239.                     boolean allDifferentShapeCount = (dealtCards.get(i).shapeCount != dealtCards.get(j).shapeCount && dealtCards.get(i).shapeCount != dealtCards.get(k).shapeCount && dealtCards.get(j).shapeCount != dealtCards.get(k).shapeCount);
  240.                    
  241.                     int allDifferentTotal = 0;
  242.                     if (allDifferentColor)
  243.                         allDifferentTotal++;
  244.                     if (allDifferentInfill)
  245.                         allDifferentTotal++;
  246.                     if (allDifferentShape)
  247.                         allDifferentTotal++;
  248.                     if (allDifferentShapeCount)
  249.                         allDifferentTotal++;
  250.                    
  251.                     boolean setFound = false;
  252.                    
  253.                     if (allDifferentTotal == 4)
  254.                         setFound = true;
  255.                     else if (allDifferentTotal == 3 && sameTotal == 1)
  256.                         setFound = true;
  257.                     else if (allDifferentTotal == 2 && sameTotal == 2)
  258.                         setFound = true;
  259.                     /*
  260.                     if (sameShape && sameColor && allDifferentInfill && allDifferentShapeCount)
  261.                         setFound = true;
  262.                     else if (sameShape && allDifferentColor && sameInfill && allDifferentShapeCount)
  263.                         setFound = true;
  264.                     else if (sameShape && allDifferentColor && allDifferentInfill && sameShapeCount)
  265.                         setFound = true;
  266.                     else if (sameShape && allDifferentColor && allDifferentInfill && allDifferentShapeCount)
  267.                         setFound = true;
  268.                     else if (allDifferentShape && sameColor && allDifferentInfill && allDifferentShapeCount)
  269.                         setFound = true;
  270.                     else if (allDifferentShape && allDifferentColor && sameInfill && allDifferentShapeCount)
  271.                         setFound = true;
  272.                     else if (allDifferentShape && allDifferentColor && allDifferentInfill && sameShapeCount)
  273.                         setFound = true;
  274.                     else if (allDifferentShape && allDifferentColor && allDifferentInfill && allDifferentShapeCount)
  275.                         setFound = true;
  276.                     */
  277.                     if (setFound == true){
  278.                         ArrayList<Card> set = new ArrayList<Card>();
  279.                         set.add(dealtCards.get(i));
  280.                         set.add(dealtCards.get(j));
  281.                         set.add(dealtCards.get(k));
  282.                    
  283.                         setsFound.add(set);
  284.                     }
  285.                 }
  286.         System.out.println(setsFound.size());
  287.        
  288.         Point okButtonShort = new Point(xOffset+926,182);
  289.         Point okButtonLong = new Point(xOffset+926,213);
  290.         boolean clickedOkButtonSimple = false;
  291.        
  292.         Robot robot = new Robot();
  293.         int checked = 0;
  294.        
  295.         int mouseActionDelay = 500;
  296.        
  297.         for(int i=0; i<setsFound.size(); i++){
  298.             ArrayList<Card> cardSet = setsFound.get(i);
  299.            
  300.             for(int j=0; j<cardSet.size(); j++){
  301.                 robot.mouseMove((int) checkBoxes[(int) cardSet.get(j).position.getX()][(int) cardSet.get(j).position.getY()].getX(), (int) checkBoxes[(int) cardSet.get(j).position.getX()][(int) cardSet.get(j).position.getY()].getY());
  302.                 robot.mousePress(InputEvent.BUTTON1_MASK);
  303.                 robot.mouseRelease(InputEvent.BUTTON1_MASK);
  304.                 checked++;
  305.                 Thread.sleep(mouseActionDelay);
  306.                
  307.                 if (checked == 3){
  308.                     if (clickedOkButtonSimple == false || mouseActionDelay >= 250){
  309.                         robot.mouseMove((int) okButtonShort.getX(), (int) okButtonShort.getY());
  310.                         clickedOkButtonSimple = true;
  311.                     }
  312.                     else
  313.                         robot.mouseMove((int) okButtonLong.getX(), (int) okButtonLong.getY());
  314.                
  315.                     robot.mousePress(InputEvent.BUTTON1_MASK);
  316.                     robot.mouseRelease(InputEvent.BUTTON1_MASK);
  317.                     Thread.sleep(mouseActionDelay);
  318.                     checked = 0;
  319.                 }
  320.             }
  321.         }
  322.     }
  323.    
  324.     static void downloadAllSetCards() throws Exception{
  325.         for(int i=1; i<=3*3*3*3; i++){
  326.             String filename = "";
  327.             if (i < 10)
  328.                 filename = "0"+i;
  329.             else
  330.                 filename = i+"";
  331.            
  332.             filename += ".gif";
  333.             URL website = new URL("http://www.puzzles.setgame.com/images/setcards/small/"+filename);
  334.             ReadableByteChannel rbc = Channels.newChannel(website.openStream());
  335.             FileOutputStream fos = new FileOutputStream(i+".gif");
  336.             fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
  337.         }
  338.     }
  339.    
  340.     void convertCards() throws Exception{
  341.         for(int i=1; i<82; i++){
  342.             BufferedImage bufferedImage = ImageIO.read(new File(i+".gif"));
  343.             BufferedImage newBufferedImage = new BufferedImage(bufferedImage.getWidth(), bufferedImage.getHeight(), BufferedImage.TYPE_INT_RGB);
  344.             newBufferedImage.createGraphics().drawImage(bufferedImage, 0, 0, Color.WHITE, null);
  345.             ImageIO.write(newBufferedImage, "png", new File(i+".png"));
  346.         }
  347.     }
  348.    
  349. }
RAW Paste Data