19 svar
308 visningar
Laura2002 är nöjd med hjälpen
Laura2002 440
Postad: 6 dec 2022 16:50

Implementera klass

Hejsan, jag har fått i uppgift att skriva in alla attribut som saknas i en klass. Min kod klagar på att jag skriver w.moveTo, w.getX osv ( "w:et" är rödmarkerat). Fönstret som jag använder kallas w, men ändå blir det något fel. Jag lägger in några bilder nedan på hur det ser ut. Ser någon vad det är som blir fel och hur jag kan lösa detta? Tack på förhand!

Laura2002 440
Postad: 6 dec 2022 16:52

Laura2002 440
Postad: 6 dec 2022 16:54

Som man kan se högst upp har jag tre filer till som tillhör programmet och är säker på att det inte är något fel i dessa. Undrar ni något om dessa så kan jag lägga in bild på dem med 

Fermatrix 7841 – Fd. Medlem
Postad: 6 dec 2022 17:31 Redigerad: 6 dec 2022 18:13

I din konstruktor tar du emot SimpleWindow w, men du gör ingenting med den. Du försöker kalla på den sedan som en global variabel i klassen. Det du har missat är att lägga till

SimpleWindow sw;

public Turle(....){
	this.sw = w;
	.
	.
	.
}

För övrigt säger jag samma sak som igår, lägg gärna in källkoden med {:}. Det blir mycket enklare att hjälpa dig felsöka eller till och med poängtera eventuella buggar.


Tillägg: 6 dec 2022 17:34

Din konstruktor överlag ser extremt sus ut. Vad är det du egentligen försöker göra?

Laura2002 440
Postad: 7 dec 2022 18:24

Hmm, blir inte rätt när jag lägger till SimpleWindow :( Testade att lägga till "private SimpleWindow sw;" under kontruktorn och får då inga felmeddelanden på "this.sw=w;" vilket jag fick om jag satte "SimpleWindow sw;" utanför. Jag lägger in en till bild nedan så det blir tydligare.

Vad menar du med att jag ska lägga in källkoden med {:}?

Och vad är det som ser sus ut i konstruktorn? Det finns text ovanför som förklarar vad jag försöker göra men om det är oklart får du gärna utveckla.

Laura2002 440
Postad: 7 dec 2022 18:25

Fermatrix 7841 – Fd. Medlem
Postad: 7 dec 2022 18:31 Redigerad: 7 dec 2022 18:41

Vi tar det ett steg i taget! 

Jag menade att det är mycket enklare att hjälpa dig om vi har din källkod. Att du får fel vet jag inte vad det beror på.

Men ett steg i taget. 

Är du med på vad som är din konstruktor?

Din konstruktor tar meot 3 arugment, en x-koordinat och en y-koordiant. Det du gör i din konstruktör är att du ser till att din Turtle alltid börjar på punkten (0,0) men du ska ju börja i punkten (x,y). 

Att dina globala variabler är privata är helt rätt. Notera att x och y 0per default är 0 eftersom de aldrig blir satta. 

Hänger du med så långt?

Laura2002 440
Postad: 7 dec 2022 18:59

Yes, hänger med på vad min konstruktor är. Nu har jag skrivit 

this.w=w;
this.w=x;
this.w=y;

vilket gör så att vi börjar i punkten (x,y) om jag tänker rätt. Jag har även testat att skriva "this.sw=x" osv men får då fel. Varför behöver jag ett nytt fönster? Hänger annars med än så länge.

Fermatrix 7841 – Fd. Medlem
Postad: 7 dec 2022 19:04

Har du skrivit fel här? 

Yes, hänger med på vad min konstruktor är. Nu har jag skrivit 

this.w=w;
this.w=x;
this.w=y;

Om inte, så får vi nog ta en liten stund att diskutera vad 'this' betyder. :)

Laura2002 440
Postad: 7 dec 2022 19:10
Dracaena skrev:

Har du skrivit fel här? 

Yes, hänger med på vad min konstruktor är. Nu har jag skrivit 

this.w=w;
this.w=x;
this.w=y;

Om inte, så får vi nog ta en liten stund att diskutera vad 'this' betyder. :)

Yes, ska vara

this.sw=w;
this.x=x;
this.y=y;

men kanske har missuppfattat vad this gör?

anders_k Online 234
Postad: 7 dec 2022 19:13

ibland är det lite lättare att se om man använder andra namn för member variabler,  så slipper du "this"

Laura2002 440
Postad: 7 dec 2022 19:22
anders_k skrev:

ibland är det lite lättare att se om man använder andra namn för member variabler,  så slipper du "this"

Så hur ska jag göra?

Fermatrix 7841 – Fd. Medlem
Postad: 7 dec 2022 19:37 Redigerad: 7 dec 2022 19:37

'this' används för att referera till objektet. Exemeplvis:

 

Du har att:

private double x;
private double y;
private SimpleWindow w;

public Turtle(SimpleWindow w, int x, int y){
	x=0;
	y=0;
}

När du skriver x och y så refererar du inte till attributen i klassen x och y utan du refererar till de lokala variablerna x och y. Dvs, x och y som du tar emot som argument. För att referera till din klass-globala attribut måste du säga:

private double x;
private double y;
private SimleWindow w;

public Turtle(SimpleWindow w, int x, int y){
	this.x = x;
	this.y = y;
	this.w = w;
}

Notera dock att du tar emot x och y av typen int i din konstruktor men dina attribut x och y är av typen double. 

Laura2002 440
Postad: 7 dec 2022 19:59

Aah okej, då tror jag att jag hänger med!

Laura2002 440
Postad: 7 dec 2022 20:05

Ytterligare en fråga: vad blir fel här?


Tillägg: 7 dec 2022 20:06

Alltså:

/** Sänker pennan. */
public void penDown() {
if(isPenDown) {
isPenDown=true;
w.lineTo();
}
}

/** Lyfter pennan. */
public void penUp() {
if(isPenDown) {
isPenDown=false;
w.moveTo();
}

}

Fermatrix 7841 – Fd. Medlem
Postad: 9 dec 2022 20:02 Redigerad: 9 dec 2022 20:04

Missade att du hade skrivit.

Vad säger Eclipse att felet är? 

Lägg musen över då borde den säga vad det är en klagar på. Tar lineTo() möjligen något argument? 

Vad jag ser från dina klasser har du ingen klass SimpleWindow, vilket jag skulle ha gissat är ett GUI uppbyggd mha JavaFX eller mer sannolikt Swing.

Kan du visa den klassen också?

anders_k Online 234
Postad: 10 dec 2022 10:34

du skall använda member variabeln sw, w finns inte deklarerad i din klass verkar det som.

/** Sänker pennan. */
public void penDown() {
  if(isPenDown) {
    isPenDown=true;
    sw.lineTo();
  }
}

/** Lyfter pennan. */
public void penUp() {
  if(isPenDown) {
    isPenDown=false;
    sw.moveTo();
  }

}
Laura2002 440
Postad: 12 dec 2022 17:04

Jo, SimpleWindow finns med. Jag lägger in de andra klasserna nedan 

Laura2002 440
Postad: 12 dec 2022 17:06

(klass 1)

import se.lth.cs.pt.window.SimpleWindow;
import java.util.Random;

public class TurtleDrawRandomFigure {
public static void main(String[] args) {
SimpleWindow w = new SimpleWindow(600, 600, "TurtleDrawRandomFigure");
Turtle t = new Turtle(w, 300, 300);
Random rand = new Random();
t.penDown();
for (int i = 1; i <= 4; i++) {
t.forward(rand.nextInt(100));
SimpleWindow.delay(100);
t.left(90);
}
}
}

 

(klass 2)

import se.lth.cs.pt.window.SimpleWindow;

public class TurtleDrawSquare {
public static void main(String[] args) {
SimpleWindow w = new SimpleWindow(600, 600, "TurtleDrawSquare");
Turtle t = new Turtle(w, 300, 300);
t.penDown();
for (int i = 0; i < 4; i++) {
t.forward(100);
t.left(90);
}
}
}

 

(klass 3)

import se.lth.cs.pt.window.SimpleWindow;

/** Enhetstest för Turtle-klassen */
public class TurtleTest {

private int resultY;
private SimpleWindow w;

public TurtleTest(SimpleWindow w) {
this.w = w;
resultY = 150;
}

/** Privat hjälpmetod: skriv ut testresultat. */
private void reportResult(String label, boolean status) {
w.moveTo(30, resultY);
w.setLineColor(status ? java.awt.Color.GREEN.darker() : java.awt.Color.RED);
w.writeText("##");
w.setLineColor(java.awt.Color.BLACK);
w.moveTo(60, resultY);
w.writeText(label + " " + (status ? "JA" : "NEJ"));
resultY += 30;
}

/**
* Ritar en kvadrat med två sköldpaddor. Om det inte ritas en kvadrat
* beror det troligen på att startpositionen i forward() inte sätts
* rätt.
*/
private void testTwoTurtles() {
Turtle t1 = new Turtle(w, 100, 50);
Turtle t2 = new Turtle(w, 150, 100);

w.moveTo(30, 30);
w.writeText("Nedan ska finnas en kvadrat");

t1.penDown();
t2.penDown();

t1.left(-90);
t2.left(90);
t1.forward(50);
t2.forward(50);
t1.left(-90);
t2.left(-90);
t1.forward(50);
t2.forward(50);
}

/**
* Liknande test som testTwoTurtles, men med pennan uppe. Då ska inget ritas.
*/
private void testDrawingWithPenUp() {
Turtle t1 = new Turtle(w, 330, 50);
Turtle t2 = new Turtle(w, 380, 100);
t2.penDown();
t2.penUp();

w.moveTo(280, 30);
w.writeText("Nedan ska vara tomt");

t1.left(-90);
t2.left(90);
t1.forward(50);
t2.forward(50);
t1.left(-90);
t2.left(-90);
t1.forward(50);
t2.forward(50);
}

/** Testar att sköldpaddan inledningsvis är riktad rakt uppåt. */
private void testInitialAngle() {
Turtle t = new Turtle(w, 0, 0);
reportResult("Skapas sköldpaddan med riktning rakt uppåt?", (t.getDirection() == 90));
}

/** Testar att låta sköldpaddan svänga med left och turnNorth. */
private void testAngleCalculations() {
Turtle t = new Turtle(w, 0, 0);
t.left(45);
t.left(-90);
t.left(180);
int angle1 = t.getDirection();
t.turnNorth();
int angle2 = t.getDirection();
reportResult("Kan sköldpaddan svänga åt vänster och höger?", (angle1 == 225 && angle2 == 90));
}

/** Testar att sköldpaddans koordinater beskrivs med double-precision. */
private void testPrecision() {
w.moveTo(530, 30);
w.writeText("Nedan ska finnas en cirkel");

Turtle t = new Turtle(w, 670, 120);
t.penDown();
for (int i = 0; i < 360; i++) {
t.forward(1);
t.left(1);
}
int x = t.getX();
int y = t.getY();
reportResult("Har sköldpaddans koordinater god precision?", (x == 670 && y == 120));
}

/** Testar att jumpTo faktiskt ändrar koordinaterna rätt */
private void testJumpTo() {
Turtle t = new Turtle(w, 123, 234);
t.jumpTo(345, 456);

reportResult("Vet sköldpaddan var den är efter att den hoppat?", (t.getX() == 345 && t.getY() == 456));
}

/** Testar att forward (med penna uppe) faktiskt ändrar koordinaterna */
private void testForwardPenUp() {
Turtle t = new Turtle(w, 0, 345);
t.forward(200);

reportResult("Vet sköldpaddan var den är efter att den gått framåt med pennan uppe?", (t.getX() == 0 && t.getY() == 145));
}


public static void main(String[] args) {
SimpleWindow w = new SimpleWindow(800, 300, "TurtleTest");
TurtleTest tester = new TurtleTest(w);

tester.testTwoTurtles();
tester.testDrawingWithPenUp();
tester.testInitialAngle();
tester.testAngleCalculations();
tester.testPrecision();
tester.testJumpTo();
tester.testForwardPenUp();
}
}

Fermatrix 7841 – Fd. Medlem
Postad: 12 dec 2022 22:21

Utan att Anusara koden så mycket, (jag läser igenom det mer noggrant imorgon ) så verkar det som att du gör ett fel.

Du försöker kalla på metoder som tillhör turtle. SimpleWindow jar inte penup och dylikt, utan det är ju turtle klassen som har dessa metoderna. Du kan alltså inte kalla på Klass Bs funktioner genom Klass A om inte Klass A har en referens av en instans av Klass B, men då är syntaxen lite annorlunda än det du skrivit.

Svara Avbryt
Close