I'm trying to call a method from a separate class in java but it doesn't seem to work, or I'm doing something wrong. What I want to achieve is to call my Race
method which is in the RacingEvent
class to my main program (Check the comment in the main program).
Here is the class:
import java.util.Random;
public class RacingEvent {
private SimpleWindow w;
private RaceTrack track;
private Turtle t1 = new Turtle(w, 200, 400);
private Turtle t2 = new Turtle(w, 300, 400);
public RacingEvent(RaceTrack track, Turtle t1, Turtle t2) {
this.t1 = t1;
this.t2 = t2;
this.track = track;
}
public void Race() {
t1.penDown();
t2.penDown();
Random rand = new Random();
Turtle t1 = new Turtle(w, 200, 400);
Turtle t2 = new Turtle(w, 300, 400);
while (t1.getY() > track.getyFinish() && t2.getY() > track.getyFinish()) {
int turtle1 = rand.nextInt(3);
int turtle2 = rand.nextInt(3);
t1.forward(turtle1);
t2.forward(turtle2);
SimpleWindow.delay(10);
}
int diff1 = t1.getY() - track.getyFinish();
int diff2 = t2.getY() - track.getyFinish();
SimpleWindow w = new SimpleWindow(200, 100, "Winner");
if (t1.getY() <= track.getyFinish()) {
w.moveTo(20, 40);
w.writeText("T1 won with a " + diff2 + " step(s) lead!");
} else if (t2.getY() <= track.getyFinish()) {
w.moveTo(20, 40);
w.writeText("T2 won with a " + diff1 + " step(s) lead!");
}
}
}
And here is the main program where I need to call the method:
public class TurtleRace {
public static void main(String[] args) {
SimpleWindow w = new SimpleWindow(600, 600, "TurtleRace");
int yStart = 400;
int yFinish = 100;
RaceTrack track = new RaceTrack(w, yStart, yFinish);
ColorTurtle t1 = new ColorTurtle(w, 250, yStart, java.awt.Color.RED);
ColorTurtle t2 = new ColorTurtle(w, 350, yStart, java.awt.Color.BLUE);
track.draw(w);
w.waitForMouseClick();
RacingEvent event = new RacingEvent(track, t1, t2);
/*Call Race Method*/
}
}
When you do this
RacingEvent event = new RacingEvent(track, t1, t2);
You are just creating and instantiating an object of the RacingEvent class.
The function call is yet to be made.
You should write this to call the function.
event.Race();
Hope it solves the problem.
RacingEvent
does not initialize its w
field. You might want to pass the value that is available to the caller (called w
there, too) to the constructor and set w
to the argument passed in.
In detail:
Change the constructor to
public RacingEvent(SimpleWindow w, RaceTrack track, Turtle t1, Turtle t2) {
this.w = w;
this.t1 = t1;
this.t2 = t2;
this.track = track;
}
and call it like this:
RacingEvent event = new RacingEvent(w, track, t1, t2);
event.race();
Simplified solution:
import java.awt.*;
import java.util.Random;
class SimpleWindow {
public SimpleWindow(int i, int i1, String winner) {
//To change body of created methods use File | Settings | File Templates.
}
public static void delay(int i) {
//To change body of created methods use File | Settings | File Templates.
}
public void moveTo(int i, int i1) {
//To change body of created methods use File | Settings | File Templates.
}
public void writeText(String s) {
//To change body of created methods use File | Settings | File Templates.
}
public void waitForMouseClick() {
//To change body of created methods use File | Settings | File Templates.
}
}
class ColorTurtle extends Turtle {
public ColorTurtle(SimpleWindow w, int i, int yStart, Color red) {
//To change body of created methods use File | Settings | File Templates.
}
public ColorTurtle(SimpleWindow w, int i, int i1) {
super(w, i, i1);
}
}
class RaceTrack {
private int yFinish;
public RaceTrack(SimpleWindow w, int yStart, int yFinish) {
//To change body of created methods use File | Settings | File Templates.
}
public int getyFinish() {
return yFinish;
}
public void draw(SimpleWindow w) {
//To change body of created methods use File | Settings | File Templates.
}
}
class Turtle {
private int y;
public Turtle(SimpleWindow w, int i, int i1) {
//To change body of created methods use File | Settings | File Templates.
}
Turtle() {
}
public void penDown() {
//To change body of created methods use File | Settings | File Templates.
}
public int getY() {
return y;
}
public void forward(int turtle1) {
//To change body of created methods use File | Settings | File Templates.
}
}
class RacingEvent {
private SimpleWindow w;
private RaceTrack track;
private Turtle t1 = new Turtle(w, 200, 400);
private Turtle t2 = new Turtle(w, 300, 400);
public RacingEvent(RaceTrack track, Turtle t1, Turtle t2) {
this.t1 = t1;
this.t2 = t2;
this.track = track;
}
public void Race() {
t1.penDown();
t2.penDown();
Random rand = new Random();
Turtle t1 = new Turtle(w, 200, 400);
Turtle t2 = new Turtle(w, 300, 400);
while (t1.getY() > track.getyFinish() && t2.getY() > track.getyFinish()) {
int turtle1 = rand.nextInt(3);
int turtle2 = rand.nextInt(3);
t1.forward(turtle1);
t2.forward(turtle2);
SimpleWindow.delay(10);
}
int diff1 = t1.getY() - track.getyFinish();
int diff2 = t2.getY() - track.getyFinish();
SimpleWindow w = new SimpleWindow(200, 100, "Winner");
if (t1.getY() <= track.getyFinish()) {
w.moveTo(20, 40);
w.writeText("T1 won with a " + diff2 + " step(s) lead!");
} else if (t2.getY() <= track.getyFinish()) {
w.moveTo(20, 40);
w.writeText("T2 won with a " + diff1 + " step(s) lead!");
}
}
}
public class TurtleRace {
public static void main(String[] args) {
SimpleWindow w = new SimpleWindow(600, 600, "TurtleRace");
int yStart = 400;
int yFinish = 100;
RaceTrack track = new RaceTrack(w, yStart, yFinish);
ColorTurtle t1 = new ColorTurtle(w, 250, yStart, java.awt.Color.RED);
ColorTurtle t2 = new ColorTurtle(w, 350, yStart, java.awt.Color.BLUE);
track.draw(w);
w.waitForMouseClick();
RacingEvent event = new RacingEvent(track, t1, t2);
/*Call Race Method*/
event.Race();
}
}