Slumpade rektanglar och ovaler i Java

Permalänk
Medlem

Slumpade rektanglar och ovaler i Java

Ska rita ut rektanglar och ovaler i Java som har en slumpad position. Antalet rektanglar och ovaler vill jag ska vara 50 st sammanlagt, men hur får jag en ny position slumpad för varje rektangel eller oval som visas ut.

I nuläget lyckas jag endast rita ut en rektangel och en oval på slumpad position. Vill alltså att programmet ska välja om det ska ritas en rektangel eller en oval på slumpad position.

public void paintComponent(Graphics g) { super.paintComponent(g); Random random = new Random(); setBackground(Color.white);//Sätter bakgrunden på panelen till vit. for (int val = 0; val < 50; val++){ int b = 10; int h = 10; int x = random.nextInt(300); int y = random.nextInt(300); switch (val){ case 1: g.drawRect(x,y,b,h); break; case 2: g.drawOval(x,y,b,h); break; }//Slut switch sats. }//Slut for loop. }//Slut paintComponent.

Permalänk
Medlem

Du gör nästan rätt, men fundera lite på vad det egentligen är du vill switcha på så löser du det nog.

Permalänk
Medlem
Skrivet av perost:

Du gör nästan rätt, men fundera lite på vad det egentligen är du vill switcha på så löser du det nog.

Hur menar du? Det är ju det jag inte förstår...

Permalänk
Medlem
Skrivet av radera:

Hur menar du? Det är ju det jag inte förstår...

Vad gör din switch? Läs den och beskriv för oss.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av radera:

Hur menar du? Det är ju det jag inte förstår...

Just nu så switchar du på loop-variabeln. Dvs. första iterationen av loopen så kommer du rita ut en rektangel, andra iterationen en oval, och resten av iterationerna ingenting. Du vill nog istället slumpa fram ett värde som bestämmer om du ska rita en rektangel eller oval istället för att använda loop-variabeln.

Permalänk
Medlem

Just nu ritar du ut en rektangel för runda 2 i loopen och en oval i runda 3 i loopen.
Du behöver ett till slumptal och sedan en if-sats/switch som kontrollerar vad värdet blev och rita ut rektangeln eller ovalen beroende på det värdet.
Något i stil med:

int i = random.nextInt(2); if(i >= 1) { drawRect(x, y, b, h); } else { drawOval(x, y, b, h); }

Permalänk
Medlem
Skrivet av Garret:

Just nu ritar du ut en rektangel för runda 2 i loopen och en oval i runda 3 i loopen.
Du behöver ett till slumptal och sedan en if-sats/switch som kontrollerar vad värdet blev och rita ut rektangeln eller ovalen beroende på det värdet.
Något i stil med:

int i = random.nextInt(2); if(i >= 1) { drawRect(x, y, b, h); } else { drawOval(x, y, b, h); }

Förstår inte hur du menar, är nybörjare och hänger faktiskt inte med alls.

Permalänk
Medlem
Skrivet av radera:

...

public void paintComponent(Graphics g) { super.paintComponent(g); Random random = new Random(); setBackground(Color.white);//Sätter bakgrunden på panelen till vit. for (int val = 0; val < 50; val++) { int b = 10; int h = 10; int x = random.nextInt(300); int y = random.nextInt(300); int i = random.nextInt(2); switch (i) { case 1: g.drawRect(x,y,b,h); break; default: g.drawOval(x,y,b,h); break; }//Slut switch sats. }//Slut for loop. }//Slut paintComponent.

På rad "switch (val) {" använder du dig av samma variabel du itererar igenom i fin for-loop "for (int val = 0; val < 50; val++){".
Byt ut val mot en ny variabel som du slumpar fram, likt du gör med höjd och bredd för formerna.

Notera att koden inte är testat så den fungerar förmodligen inte.

En liten fråga bara. Har du någon koll på vad koden du skrivit nu gör eller har du bara kopierat den av någon? Ett tips är att du förstår vad koden gör innan du börjar ändra i den för mycket.

Permalänk
Medlem
Skrivet av Garret:

På rad "switch (val) {" använder du dig av samma variabel du itererar igenom i fin for-loop "for (int val = 0; val < 50; val++){".
Byt ut val mot en ny variabel som du slumpar fram, likt du gör med höjd och bredd för formerna.

Notera att koden inte är testat så den fungerar förmodligen inte.

En liten fråga bara. Har du någon koll på vad koden du skrivit nu gör eller har du bara kopierat den av någon? Ett tips är att du förstår vad koden gör innan du börjar ändra i den för mycket.

Jag har någorlunda koll på den och jag har skrivit den själv. Det är just det som jag tog upp som jag har svårt att förstå och därför behöver hjälp för att förstå.

Permalänk
Medlem

Fick du någon klarhet efter våra förklaringar?

För att bygga vidare...testa att byta ut din switch mot:

if(val % 2 == 0) { drawText(x, y, b, h); } else { drawOval(x, y, b, h); }

Då kommer du att rita ut en rektangel eller oval om vartannat.
Dock så kanske modulo är den bästa starten, men testa att byta ut det som står i din if för att testa dig fram.

Permalänk
Medlem
Skrivet av Garret:

Fick du någon klarhet efter våra förklaringar?

För att bygga vidare...testa att byta ut din switch mot:

if(val % 2 == 0) { drawText(x, y, b, h); } else { drawOval(x, y, b, h); }

Då kommer du att rita ut en rektangel eller oval om vartannat.
Dock så kanske modulo är den bästa starten, men testa att byta ut det som står i din if för att testa dig fram.

Så, nu har jag fått kläm på de och förstår vad satser och loop gör osv. Det jag däremot inte förstår är vad "beräkningen" i if satsen gör riktigt, alltså vad den betyder.

(val % 2 == 0)

Permalänk
Medlem
Skrivet av radera:

Så, nu har jag fått kläm på de och förstår vad satser och loop gör osv. Det jag däremot inte förstår är vad "beräkningen" i if satsen gör riktigt, alltså vad den betyder.

(val % 2 == 0)

Som jag skrev så är nog inte modulo det bästa att börja med då det är lite klurigt att förstå. I sin enkelhet fungerar det som så att du i exemplet ovan delat värdet val med 2 och kontrollerar om restvärdet är 0.
T.ex:
1 / 2 = 0,5 (restvärde 0,5)
2 / 2 = 1 (inget restvärde)
3 / 2 = 1,5 (restvärde 0,5)
4 / 2 = 2 (inget restvärde)
Du kan läsa mer här om du vill, men börja försiktigt och skippa modulo är mitt förslag.

Byt ut kontrollen i if-satsen mot något enklare.

Permalänk
Medlem
Skrivet av radera:

Så, nu har jag fått kläm på de och förstår vad satser och loop gör osv. Det jag däremot inte förstår är vad "beräkningen" i if satsen gör riktigt, alltså vad den betyder.

(val % 2 == 0)

När du ska räkna modulo kan det vara en hjälp att tänka på klockan.. den är modulo 24 t.ex, för att få fram timmen på dygnet.
Om du t.ex har 47 timmar, och du vill veta vilken timme på ett dygn detta motsvarar (vi bryr oss inte om hur många dagar som passerar, för vi vill ju bara veta vilken timme det motsvarar), då kör du 47 % 24 och får fram 23.
För på två dygn går det 48 timmar, men när man använde 47 nu, så kom inte timvisaren hela vägen fram till midnatt. Resultatet är allså resten som blir kvar, när du subtraherar bort så många av dina modulo-tal du kan från ursprungstalet.

I ditt fall så har din klocka bara 2 timmar på sitt dygn, och du vill bara veta om det är "midnatt eller lunch".

Detta kanske inte gjorde det alls så tydligt som jag hoppades göra det.. men, ibland kan det vara lättare att "leka" fram en förklaring.

Visa signatur

WS: Asus P8Z77-I Deluxe mITX | Intel 3770K@4.6 | NH-U12P | Asus 780 GTX | Corsair 2x8GB 1600Mhz CL9 | Samsung 840 512GB | Ubuntu 16.04.3 x86_64 | Corsair AX750 | 2x Dell U2412M | Puppe.se | NAS: i7 860, 16GB DDR3, GA-P55M-UD4, FD Define R3, 8x2TB Samsung F4EG, Serveraid M1015, EVGA 750W G2 PSU, FreeBSD x64

Permalänk
Medlem
Skrivet av radera:

Så, nu har jag fått kläm på de och förstår vad satser och loop gör osv. Det jag däremot inte förstår är vad "beräkningen" i if satsen gör riktigt, alltså vad den betyder.

(val % 2 == 0)

Den kollar om "val" dividerat med två går jämnt ut, dvs. att det inte blir någonting kvar (edit: glömde ett ord) efter utförd division, som Garret och Schrimp beskrivit så fint ovan. Och endast då detta villkor är uppfyllt körs din if-sats.