Turtle
Kommer snart bli skallig. Någon som kan ge mig någon hint om vad jag ska göra?
man ska alltså implementera en klass - men jag får inte till det... man har också i samma labbpaket ett program som testar vad man skrivit - men jag lyckas bara få fler och fler fel...
import se.lth.cs.pt.window.SimpleWindow;
//du kan använda simple window, line to, etc!
public class Turtle {
private SimpleWindow w;
private double x;
private double y;
private double degrees;
private boolean isPenDown;
//private double alpha - behöver inte deklareras här?
/**
* Skapar en sköldpadda som ritar i ritfönstret w. Från början befinner sig
* sköldpaddan i punkten x, y med pennan lyft och huvudet pekande rakt uppåt
* i fönstret (i negativ y-riktning).
*/
public Turtle(SimpleWindow w, int x, int y) {
this.w = w;
this.x = x;
this.y = y;
degrees = 90;
isPenDown = false;
}
/** Sänker pennan. */
public void penDown() {
if (isPenDown) {//om pennan INTE är nere
isPenDown = false; // boolean isPenDown = true
}
}
/** Lyfter pennan. */
public void penUp() {
if (!isPenDown) {//om pennan ÄR nere
isPenDown = true; // boolean isPenDown = false
}
}
/** Går rakt framåt n pixlar i den riktning huvudet pekar. */
public void forward(int n) {
x = w.getX();
y = w.getY();
double alpha = ((Math.PI/180))*degrees; //degrees blir i radianer som placeras i alpha
x = (x + (n * (Math.cos(alpha)))); //degrees ska anges i radianer för Math.cos/sin ska fungera
y = (y - (n * (Math.sin(alpha))));
//fattas det något beroende på åt vilket håll som sköldpaddan pekar???????????
w.moveTo(w.getX(), w.getY());
if(!isPenDown){
w.moveTo(w.getX(), w.getY());
w.lineTo(w.getX(), w.getY());
}
}
/** Vrider beta grader åt vänster runt pennan. */
public void left(int beta) {
double alpha = (beta*((Math.PI)/180)); //alpha tilldelas beta men i radianer
degrees = ((degrees*(Math.PI/180)) + (alpha));
}
/**
* Går till punkten newX, newY utan att rita. Pennans läge (sänkt eller
* lyft) och huvudets riktning påverkas inte.
*/
public void jumpTo(int newX, int newY) {
x = newX;
y = newY;
w.moveTo(w.getX(), w.getY());
}
/** Återställer huvudriktningen till den ursprungliga. */
public void turnNorth() {
this.degrees = 90;
}
/** Tar reda på x-koordinaten för sköldpaddans aktuella position. */
public int getX() {
return ((int) Math.round(x));
}
/** Tar reda på y-koordinaten för sköldpaddans aktuella position. */
public int getY() {
return ((int) Math.round(y));
}
/**
* Tar reda på sköldpaddans riktning, i grader från den positiva X-axeln.
*/
public int getDirection() {
return (int) Math.round(degrees);
}
}
För att sänka pennan ska du förstås sätta isPenDown=true. Varför gör du tvärtom?
Det är lite svårt att veta exakt var dina fel uppstår då du inte angett uppgiftsbeskrivning och vi inte har tillgång till testprogrammet. Men jag tror jag sett några saker som kan vara orsaken till att din kod inte fungerar som den ska.
1) Du har rätt i att alpha inte behöver deklareras som en klassvariabel.
2) Som Henrik skriver verkar du ha förväxlat metoderna penDown() och penUp(). Rimligtvis ska penDown() sätta isPenDown = true medan penUp() ska sätta isPenDown = false.
3) I metoden forward() räknar du ut de nya koordinaterna dit turtle ska flytta och sparar dem i dina klassvariabler x och y. Men när du sedan anropar w.moveTo() för att utföra själva förflyttningen gör du det med w.getX() och w.getY() som jag misstänker är de aktuella koordinaterna (tagna från fönstret w)? Alltså flyttar du aldrig på turtle.
4) Vidare i metoden forward() så gissar jag att om pennan är nere så ska en linje dras och då ska du använda w.lineTo() medan du när pennan är uppe ska använda w.moveTo()
5) Angående din fråga: "fattas det något beroende på åt vilket håll som sköldpaddan pekar???????????" så vet jag inte. Det beror på vad ni har fått för instruktioner angående hur turtle ska röra sig.
6) Det verkar som att degrees ska anges i grader (eftersom du måste göra om det till radianer i metoden forward()). Därför blir det antagligen jättefel i metoden left() där du tillskriver degree ett värde i radianer istället för grader. Det kan sedan bli hur fel som helst när du på nytt anropar forward(), gör om grader som nu har värde i radianer till radianer igen…
7) I metoden jumpTo() verkar du igen ha missat att verkligen göra en förflyttning till de nya koordinaterna.
Hoppas något av det jag skrivit kan stämma och att du kommer längre med uppgiften. Som sagt så gissar jag lite och antar en del grejer. Sitter du fortfarande fast får du gärna förklara mer om hur w.getX(), w.moveTo(), w.lineTo() etc fungerar så blir det lättare att hjälpa dig.
Henrik Eriksson skrev :För att sänka pennan ska du förstås sätta isPenDown=true. Varför gör du tvärtom?
Men hur vet den att den ska sänka pennan för jag skriver så? Behövs det inget dr som säger att man ska rita? Typ w.lineTo(x,y)?
Låter som en korkad fråga men jag r "smått" förvirrad av hur man skriver i Java, vad man kan anta att java vet (som att x-axeln är 0 grader och att graderna ökar åt vänster), mm...
annlu skrev :Det är lite svårt att veta exakt var dina fel uppstår då du inte angett uppgiftsbeskrivning och vi inte har tillgång till testprogrammet. Men jag tror jag sett några saker som kan vara orsaken till att din kod inte fungerar som den ska.
1) Du har rätt i att alpha inte behöver deklareras som en klassvariabel.
2) Som Henrik skriver verkar du ha förväxlat metoderna penDown() och penUp(). Rimligtvis ska penDown() sätta isPenDown = true medan penUp() ska sätta isPenDown = false.
3) I metoden forward() räknar du ut de nya koordinaterna dit turtle ska flytta och sparar dem i dina klassvariabler x och y. Men när du sedan anropar w.moveTo() för att utföra själva förflyttningen gör du det med w.getX() och w.getY() som jag misstänker är de aktuella koordinaterna (tagna från fönstret w)? Alltså flyttar du aldrig på turtle.
4) Vidare i metoden forward() så gissar jag att om pennan är nere så ska en linje dras och då ska du använda w.lineTo() medan du när pennan är uppe ska använda w.moveTo()
5) Angående din fråga: "fattas det något beroende på åt vilket håll som sköldpaddan pekar???????????" så vet jag inte. Det beror på vad ni har fått för instruktioner angående hur turtle ska röra sig.
6) Det verkar som att degrees ska anges i grader (eftersom du måste göra om det till radianer i metoden forward()). Därför blir det antagligen jättefel i metoden left() där du tillskriver degree ett värde i radianer istället för grader. Det kan sedan bli hur fel som helst när du på nytt anropar forward(), gör om grader som nu har värde i radianer till radianer igen…
7) I metoden jumpTo() verkar du igen ha missat att verkligen göra en förflyttning till de nya koordinaterna.
Hoppas något av det jag skrivit kan stämma och att du kommer längre med uppgiften. Som sagt så gissar jag lite och antar en del grejer. Sitter du fortfarande fast får du gärna förklara mer om hur w.getX(), w.moveTo(), w.lineTo() etc fungerar så blir det lättare att hjälpa dig.
Tack ska kolla igenom detta innan jag ev frågar igen :)
annlu skrev :Det är lite svårt att veta exakt var dina fel uppstår då du inte angett uppgiftsbeskrivning och vi inte har tillgång till testprogrammet. Men jag tror jag sett några saker som kan vara orsaken till att din kod inte fungerar som den ska.
1) Du har rätt i att alpha inte behöver deklareras som en klassvariabel.
2) Som Henrik skriver verkar du ha förväxlat metoderna penDown() och penUp(). Rimligtvis ska penDown() sätta isPenDown = true medan penUp() ska sätta isPenDown = false.
3) I metoden forward() räknar du ut de nya koordinaterna dit turtle ska flytta och sparar dem i dina klassvariabler x och y. Men när du sedan anropar w.moveTo() för att utföra själva förflyttningen gör du det med w.getX() och w.getY() som jag misstänker är de aktuella koordinaterna (tagna från fönstret w)? Alltså flyttar du aldrig på turtle.
4) Vidare i metoden forward() så gissar jag att om pennan är nere så ska en linje dras och då ska du använda w.lineTo() medan du när pennan är uppe ska använda w.moveTo()
5) Angående din fråga: "fattas det något beroende på åt vilket håll som sköldpaddan pekar???????????" så vet jag inte. Det beror på vad ni har fått för instruktioner angående hur turtle ska röra sig.
6) Det verkar som att degrees ska anges i grader (eftersom du måste göra om det till radianer i metoden forward()). Därför blir det antagligen jättefel i metoden left() där du tillskriver degree ett värde i radianer istället för grader. Det kan sedan bli hur fel som helst när du på nytt anropar forward(), gör om grader som nu har värde i radianer till radianer igen…
7) I metoden jumpTo() verkar du igen ha missat att verkligen göra en förflyttning till de nya koordinaterna.
Hoppas något av det jag skrivit kan stämma och att du kommer längre med uppgiften. Som sagt så gissar jag lite och antar en del grejer. Sitter du fortfarande fast får du gärna förklara mer om hur w.getX(), w.moveTo(), w.lineTo() etc fungerar så blir det lättare att hjälpa dig.
Tack så jättemycket för hintarna och tiden du tog till att kolla igenom så mycket av vad jag skrivit! Sköldpaddorna vandrar :)
Yeah, du lyckades!
Let the turtles loose! :)