View Single Post
  #13   Spotlight this post!  
Unread 04-05-2011, 21:20
efoote868 efoote868 is offline
foote stepped in
AKA: E. Foote
FRC #0868
Team Role: Mentor
 
Join Date: Mar 2006
Rookie Year: 2005
Location: Noblesville, IN
Posts: 1,391
efoote868 has a reputation beyond reputeefoote868 has a reputation beyond reputeefoote868 has a reputation beyond reputeefoote868 has a reputation beyond reputeefoote868 has a reputation beyond reputeefoote868 has a reputation beyond reputeefoote868 has a reputation beyond reputeefoote868 has a reputation beyond reputeefoote868 has a reputation beyond reputeefoote868 has a reputation beyond reputeefoote868 has a reputation beyond repute
Re: Please help Wave Robotics earn $1,000!!!

Quote:
Originally Posted by Andrew Schreiber View Post
Actually yes, I'm curious how you tell where the coins are.

(Hey, it is a really cool application and I'm curious!)
It took me about ~30 minutes to write this (I wrote something similar for a different thing oh so long ago).

I apologize for using magic numbers for pixel locations. Also, do not run this if you're not willing to give up the use of your computer for a minute.



Code:
/*
 Copyright (C) 2011  Evan Foote

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Robot;

public void robotRunner()
{
  try
  {
    Robot myRobot = new Robot();
    myRobot.delay(4000);

    //get the current system time for reference on how long to run
    long time = System.currentTimeMillis();

    int loops = 0;

    int x = 560; //coordinate of the screen in pixels where the coins appear
    int y = 560;             
    int dx = 0; //or offset, where we're sampling
    int dy = 0;                
    int xmax = 240; //size of the rectangle we're sampling
    int ymax = 150;                
    int xsamp = 40; //AKA the step size between samples
    int ysamp = 20;

    Color c; //the sampled color

    int cnt = 0; //The number of coins we've found

    //run main loop for about 1 minute
    while (System.currentTimeMillis() - time < 1*60*1000) 
    {
      //iterate through each coordiante in the sample space
      for (dx = 0; dx < xmax; dx += xsamp)
      {
        for (dy = 0; dy < ymax; dy += ysamp)
        {
          //snag the color where we're sampling
          c = myRobot.getPixelColor(x + dx, y + dy);

          //check and see if the color is something other than white (like yellow)
          if (notWhite(c))
          {
            //move the mouse to that location
            myRobot.mouseMove(x + dx, y + dy);
            //increment the count so we know when to stop
            cnt++;

            //subtract this sample so we can check again
            dy -= ysamp;

            //left click the mouse, wait, drag it to the piggy bank, wait,
            //release it, wait.
            myRobot.mousePress(16);
            myRobot.delay(50);
            myRobot.mouseMove(448, 537);
            myRobot.delay(50);
            myRobot.mouseRelease(16);
            myRobot.delay(50);

            //TODO: CAN BETTER THIS CODE by:
            //checking that the coin traveled with the mouse. If it didn't,
            //subtract 1 from the cnt and try again.

            //alright, grabbed 5 coins. click on the refresh button
            if(cnt == 5)
            {
              myRobot.mouseMove(1109, 87);
              myRobot.delay(50);
              myRobot.mousePress(16);
              myRobot.delay(50);
              myRobot.mouseRelease(16);

              //wait a second for the page to refresh. Slower internet speeds
              //should wait longer.
              myRobot.delay(1000);
              break;
            }//if count is at 5
          }//if sample is not white
        }//for each y pixel

        //Putting this in the outer for loop so we can break from it
        //as well.
        if (cnt == 5)
        {
          //reset the count and the iteration
          cnt = 0;
          break;
        }
      }//for each x row

      //if dy >= ymax, it means that we've traveled all the way and didn't
      //spot 5 coins. something went bad, refresh the page.
      if (dy >= ymax)
      {
        myRobot.mouseMove(1109, 87);
        myRobot.delay(50);
        myRobot.mousePress(16);
        myRobot.delay(50);
        myRobot.mouseRelease(16);

        myRobot.delay(1000);

        cnt = 0;
      }

    loops++;
    }//while loop

    System.out.println("Number of loops run: " + loops);
  }//try
  catch(Exception e)
  {
    //not sure what would cause above code to be more than exceptional, but
    //if it is, I don't care and we can stop running here.
  }
}

private boolean notWhite (Color c)
{
  return (c.getRed() + c.getBlue() + c.getGreen() < 255*3);
}
__________________
Be Healthy. Never Stop Learning. Say It Like It Is. Own It.

Like our values? Flexware Innovation is looking for Automation Engineers. Check us out!
Reply With Quote