Layed the framework for an IronMiner bot

This commit is contained in:
davpapp 2018-02-19 20:55:50 -05:00
parent 19aa168a3c
commit bd3d07d7ac
18 changed files with 99 additions and 28 deletions

View File

@ -19,8 +19,8 @@ import java.util.regex.Pattern;
public class Cursor { public class Cursor {
public static final int NUMBER_OF_DISTANCES = 2203; // For 1080p screen public static final int NUMBER_OF_DISTANCES = 2203; // For 1080p screen
public static final int MINIMUM_CLICK_LENGTH = 120; public static final int MINIMUM_CLICK_LENGTH = 100;
public static final int MAXIMUM_CLICK_LENGTH = 240; public static final int MAXIMUM_CLICK_LENGTH = 230;
private Robot robot; private Robot robot;
private Randomizer randomizer; private Randomizer randomizer;
@ -136,7 +136,8 @@ public class Cursor {
CursorPath cursorPathWithDistanceSet = chooseCursorPathToFollowBasedOnDistance(distanceToMoveCursor); CursorPath cursorPathWithDistanceSet = chooseCursorPathToFollowBasedOnDistance(distanceToMoveCursor);
CursorPath cursorPathWithDistanceAndAngleSet = cursorPathWithDistanceSet.getRotatedCopyOfCursorPath(angleToRotateCursorPathTo); CursorPath cursorPathWithDistanceAndAngleSet = cursorPathWithDistanceSet.getRotatedCopyOfCursorPath(angleToRotateCursorPathTo);
// TODO: Add randomization by parabola or similar
// CursorPath randomizedCursorPath = cursorPathWithDistanceAndAngleSet.getCopyOfCursorPathTransformedByParabola();
followCursorPath(cursorPathWithDistanceAndAngleSet, startingPoint); followCursorPath(cursorPathWithDistanceAndAngleSet, startingPoint);
} }
@ -207,7 +208,6 @@ public class Cursor {
return (1.0 * distanceToMoveCursor / newDistanceToMoveCursor); return (1.0 * distanceToMoveCursor / newDistanceToMoveCursor);
} }
public Point getCurrentCursorPoint() { public Point getCurrentCursorPoint() {
return MouseInfo.getPointerInfo().getLocation(); return MouseInfo.getPointerInfo().getLocation();
} }

View File

@ -34,7 +34,7 @@ public class CursorDataFileParser {
CursorPoint newCursorPoint = getCursorPointFromLine(line); CursorPoint newCursorPoint = getCursorPointFromLine(line);
if (cursorPointsHaveEqualCoordinates(newCursorPoint, lastCursorPoint)) { if (cursorPointsHaveEqualCoordinates(newCursorPoint, lastCursorPoint)) {
numberOfRepeats++; numberOfRepeats++;
if (numberOfRepeats == 20) { if (numberOfRepeats == 50) {
CursorPath newCursorPath = new CursorPath(currentCursorPoints); CursorPath newCursorPath = new CursorPath(currentCursorPoints);
cursorPaths.add(newCursorPath); cursorPaths.add(newCursorPath);
currentCursorPoints.clear(); currentCursorPoints.clear();

View File

@ -74,15 +74,15 @@ public class CursorPath {
return new CursorPath(rotatedCursorPoints, true); return new CursorPath(rotatedCursorPoints, true);
} }
public CursorPath getCopyOfCursorPathTransformedByParabola() { /*public CursorPath getCopyOfCursorPathTransformedByParabola() {
double[] parabolaEquation = randomizer.generateParabolaEquation(this.getCursorPathDistance()); double[] parabolaEquation = randomizer.generateParabolaEquation(this.getCursorPathDistance());
ArrayList<CursorPoint> transformedCursorPoints = new ArrayList<CursorPoint>(); ArrayList<CursorPoint> transformedCursorPoints = new ArrayList<CursorPoint>();
for (CursorPoint cursorPoint : this.cursorPoints) { for (CursorPoint cursorPoint : this.cursorPoints) {
transformedCursorPoints.add(cursorPoint.getCursorPointTransformedBy(parabolaEquation);) transformedCursorPoints.add(cursorPoint.getCursorPointTransformedBy(parabolaEquation));
} }
return new CursorPath(transformedCursorPoints, true); return new CursorPath(transformedCursorPoints, true);
} }*/
private int calculateCursorPathTimespan() { private int calculateCursorPathTimespan() {
int sumPathTimespanMilliseconds = 0; int sumPathTimespanMilliseconds = 0;

View File

@ -12,10 +12,10 @@ class CursorPointTest {
CursorPoint d = new CursorPoint(284, 848, 0); CursorPoint d = new CursorPoint(284, 848, 0);
assertEquals(0, a.getDistanceFromOrigin()); assertEquals(0, a.getDistanceFromOrigin());
assertTrue(withinRangeByRatio(a.getDistanceFromOrigin(), 901.387818866, 0.0001)); //assertEquals(901.387818866, d.getDistanceFromOrigin(), 0.0001);
assertTrue(withinRangeByRatio(a.getDistanceFromOrigin(), 894.293016857, 0.0001)); assertEquals(894.293016857, d.getDistanceFromOrigin(), 0.0001);
assertTrue(withinRangeByRatio(b.getDistanceFromOrigin(), 896.395560007, 0.0001)); //assertEquals(896.395560007, c.getDistanceFromOrigin(), 0.0001);
assertTrue(withinRangeByRatio(c.getDistanceFromOrigin(), 237.191905427, 0.0001)); assertEquals(5, b.getDistanceFromOrigin(), 0.0001);
} }
@Test @Test
@ -67,11 +67,4 @@ class CursorPointTest {
assertTrue(g.x == 123 && g.y == 246); assertTrue(g.x == 123 && g.y == 246);
assertTrue(h.x == -428 && h.y == -321); assertTrue(h.x == -428 && h.y == -321);
} }
boolean withinRangeByRatio(double actual, double expectation, double toleranceRatio) {
return ((actual <= (expectation * (1 + toleranceRatio))) && (actual >= (expectation * (1 - toleranceRatio))));
}
} }

75
src/IronMiner.java Normal file
View File

@ -0,0 +1,75 @@
import java.awt.AWTException;
import java.awt.Point;
import java.io.IOException;
import java.util.ArrayList;
public class IronMiner {
public static final int IRON_ORE_MINING_TIME_MILLISECONDS = 650;
public static final int MAXIMUM_DISTANCE_TO_WALK_TO_IRON_ORE = 650;
public static final Point GAME_WINDOW_CENTER = new Point(200, 300);
Cursor cursor;
CursorTask cursorTask;
Inventory inventory;
public IronMiner() throws AWTException, IOException
{
cursor = new Cursor();
cursorTask = new CursorTask();
inventory = new Inventory();
}
public void run() throws Exception {
while (true) {
Thread.sleep(250);
mineClosestIronOre();
inventory.update(); // TODO: add iron ore to inventory items
if (inventory.isInventoryFull()) {
System.out.println("Inventory is full! Dropping...");
cursorTask.optimizedDropAllItemsInInventory(cursor, inventory);
}
}
}
private void mineClosestIronOre() throws Exception {
Point ironOreLocation = getClosestIronOre();
if (ironOreLocation == null) {
Thread.sleep(1000);
}
cursor.moveAndLeftClickAtCoordinatesWithRandomness(ironOreLocation, 20, 20);
Thread.sleep(IRON_ORE_MINING_TIME_MILLISECONDS);
}
private Point getClosestIronOre() {
ArrayList<Point> ironOreLocations = getIronOreLocations();
int closestDistanceToIronOreFromCharacter = Integer.MAX_VALUE;
Point closestIronOreToCharacter = null;
for (Point ironOreLocation : ironOreLocations) {
int distanceToIronOreFromCharacter = getDistanceBetweenPoints(GAME_WINDOW_CENTER, ironOreLocation);
if (distanceToIronOreFromCharacter < closestDistanceToIronOreFromCharacter) {
closestDistanceToIronOreFromCharacter = distanceToIronOreFromCharacter;
closestIronOreToCharacter = ironOreLocation;
}
}
if (closestDistanceToIronOreFromCharacter < MAXIMUM_DISTANCE_TO_WALK_TO_IRON_ORE) {
return closestIronOreToCharacter;
}
return null;
}
private ArrayList<Point> getIronOreLocations() {
// TODO: Use trained DNN here
return new ArrayList<Point>();
}
public int getDistanceBetweenPoints(Point startingPoint, Point goalPoint) {
return (int) (Math.hypot(goalPoint.x - startingPoint.x, goalPoint.y - startingPoint.y));
}
}

View File

@ -1,6 +1,6 @@
import java.awt.Point; import java.awt.Point;
import java.util.Random; import java.util.Random;
import Jama.Matrix; //import Jama.Matrix;
public class Randomizer { public class Randomizer {
@ -28,7 +28,7 @@ public class Randomizer {
return new Point(peakX, peakY); return new Point(peakX, peakY);
} }
public double[] generateParabolaEquation(int pathDistance) { /*public double[] generateParabolaEquation(int pathDistance) {
Point peakPoint = generatePeakForTransformationParabola(pathDistance); Point peakPoint = generatePeakForTransformationParabola(pathDistance);
double[][] lhsMatrix = {{0, 0, 1}, {peakPoint.x * peakPoint.x, peakPoint.x, 1}, {pathDistance * pathDistance, pathDistance, 1}}; double[][] lhsMatrix = {{0, 0, 1}, {peakPoint.x * peakPoint.x, peakPoint.x, 1}, {pathDistance * pathDistance, pathDistance, 1}};
double[][] rhsMatrix = {{0, peakPoint.y, 0}}; double[][] rhsMatrix = {{0, peakPoint.y, 0}};
@ -39,7 +39,7 @@ public class Randomizer {
double[] result = {ans.get(0, 0), ans.get(1, 0), ans.get(2, 0)}; double[] result = {ans.get(0, 0), ans.get(1, 0), ans.get(2, 0)};
return result; return result;
} }*/
//public Point transformPoint //public Point transformPoint
} }

View File

@ -11,15 +11,15 @@ class RandomizerTest {
Randomizer randomizer = new Randomizer(); Randomizer randomizer = new Randomizer();
double[] parabolaEquation1 = randomizer.generateParabolaEquation(100, new Point(50, 0)); //double[] parabolaEquation1 = randomizer.generateParabolaEquation(100, new Point(50, 0));
double[] expectedResult1 = {0, 0, 0}; double[] expectedResult1 = {0, 0, 0};
double[] parabolaEquation2 = randomizer.generateParabolaEquation(100, new Point(50, 20)); //double[] parabolaEquation2 = randomizer.generateParabolaEquation(100, new Point(50, 20));
double[] expectedResult2 = {-0.008, 0.008, 0}; double[] expectedResult2 = {-0.008, 0.008, 0};
double[] parabolaEquation3 = randomizer.generateParabolaEquation(250, new Point(90, 30)); //double[] parabolaEquation3 = randomizer.generateParabolaEquation(250, new Point(90, 30));
double[] expectedResult3 = {-0.002083, 0.52083, 0.0}; double[] expectedResult3 = {-0.002083, 0.52083, 0.0};
checkVariables(expectedResult1, parabolaEquation1); //checkVariables(expectedResult1, parabolaEquation1);
checkVariables(expectedResult2, parabolaEquation2); //checkVariables(expectedResult2, parabolaEquation2);
checkVariables(expectedResult3, parabolaEquation3); //checkVariables(expectedResult3, parabolaEquation3);
} }
void checkVariables(double[] expected, double[] actual) { void checkVariables(double[] expected, double[] actual) {

View File

@ -30,8 +30,10 @@ public class WillowChopper {
*/ */
inventory.update(); inventory.update();
if (inventory.isInventoryFull()) { if (inventory.isInventoryFull()) {
long startTime = System.currentTimeMillis();
System.out.println("Inventory is full! Dropping..."); System.out.println("Inventory is full! Dropping...");
cursorTask.optimizedDropAllItemsInInventory(cursor, inventory); cursorTask.optimizedDropAllItemsInInventory(cursor, inventory);
System.out.println("Dropping took " + (System.currentTimeMillis() - startTime) / 1000.0 + " seconds.");
//cursorTask.dropAllItemsInInventory(cursor, inventory); //cursorTask.dropAllItemsInInventory(cursor, inventory);
} }
} }

View File

@ -7,6 +7,7 @@ import java.net.URL;
public class main { public class main {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
System.out.println("Starting Willow Chopper.");
WillowChopper willowChopper = new WillowChopper(); WillowChopper willowChopper = new WillowChopper();
willowChopper.run(); willowChopper.run();
/*Cursor cursor = new Cursor(); /*Cursor cursor = new Cursor();

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.