Java kod, fastnat lite. Hjälp uppskattas!

Permalänk

Java kod, fastnat lite. Hjälp uppskattas!

Hej allihop, jag är nybörjare i JAVA, hållt på i kanske 2-3 månader. Nu är det så att vi till skolan skall skapa en uppgift där vi ska slumpkasta en tärning 100 kast/ggr och resultatet skall visas i en JPanel i form av ett stapeldiagram där det framgår hur många 1,or,2or,3or,4or,5or, och 6or som kommer kastas fram varje gång.

Det jag kodat hittills kan ni se längre ner på sidan. Hittills har det gått bra, jag har fått till designen och så men det sker inget i min loop och switch. Jag får liksom inte fram något resultat. Är det någon som kan ta sig en liten titt och se om jag krånglat till det med variablerna kanske i switchen? Eller harj ag glömt nåt i loopen?
Allt hjälp uppskattas!

Mvh

Här är koden (jag får inget felmeddelande direkt utan det bara funkar inte) det som dyker upp är designen bara, dvs diagrammet men det ser likadant ut varje gång så den slumpar inte fram några siffor och förlänger staplarna(eller fortkortar):

import java.awt.Color; import java.awt.Graphics; import java.util.Random; import javax.swing.JFrame; import javax.swing.JPanel; class DiceRoller extends JPanel { @Override public void paintComponent (Graphics g) { super.paintComponent (g); g.setColor(Color.BLACK); this.setBackground (Color.WHITE); g.drawRect(40, 30, 1, 15); //stapleldiagrammen g.fillRect(40, 30, 1, 15); g.drawString("1or",10,40); g.fillRect(40, 50, 2, 15); g.drawString("2or",10,60); g.fillRect(40, 70, 3, 15); g.drawString("3or",10,80); g.fillRect(40, 90, 4, 15); g.drawString("4or",10,100); g.fillRect(40, 110,5, 15); g.drawString("5or",10,120); g.fillRect(40, 130,6, 15); g.drawString("6or",10,140); g.drawString("Fördelningsstatistik", 10, 20); // Instantiate a Random object "r" Random dice = new Random(6); int h = 1; int i = 2; int j = 3; int k = 4; int l = 5; int m = 6; for (int counter= 1; counter <= 100; counter ++); { switch (6){ case 1: h++; break; case 2: i++; break; case 3: j++; break; case 4: k++; break; case 5: l++; break; case 6: m++; break; } } } public static void main( String args[] ) { DiceRoller panel =new DiceRoller();//anropa DiceRoller JFrame application = new JFrame();//JFrame application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); application.add( panel ); application.setSize( 230, 250 );//storlek på panelen application.setVisible( true ); } }

Permalänk
Medlem
Skrivet av Pannkakan1983:

Ett tips: Använd code-taggen så blir det lättare för oss att läsa.

Varför har du switch(6)? Borde det inte vara switch(dice) eller liknande? Du har också mellanslag mellan counter och ++. Vet inte om det gör nåt men jag brukar alltid ha dom ihop som du har längre ner.

Random dice = new Random(6); borde väl ligga inom din for-loop med annars körs den väl bara en gång?

for (int counter= 1; counter <= 100; counter ++); { switch (6){ case 1: h++; break; case 2: i++; break; case 3: j++; break; case 4: k++; break; case 5: l++; break; case 6: m++; break; }

Permalänk
Medlem

Jag kanske missar något, programmerar bara i C# men det är väldigt likt Java.

Men För det första, din Switch är lite off, då den alltid är 6?

Lägg en Random inuti din For loop, så att för varje gång den loopar slumpas en ny siffra.

for (int counter= 1; counter <= 100; counter ++);
{
int roll = dice.nextInt(6) + 1; // Detta blir ett nummer mellan 1-6.
}

sen ska du nog inte ha ett slut (;) efter din for. Då körs inte koden.
for (int counter= 1; counter <= 100; counter ++); <----

REDIGERAT

Använd sedan roll i din switch.

for (int counter= 1; counter <= 100; counter ++) { int roll = dice.nextInt(6) + 1; // Detta blir ett nummer mellan 1-6. switch (roll){ case 1: h++; break; case 2: i++; break; case 3: j++; break; case 4: k++; break; case 5: l++; break; case 6: m++; break; } }

Du måste ha en +1 i din random, då den kommer slumpa ett tal mellan 0-5.

Permalänk
Medlem

För det första gör som föregående sa då du kör switchen på en konstant vilket kommer ge samma fall hela tiden.

Samt

int h = 1;
int i = 2;
int j = 3;
int k = 4;
int l = 5;
int m = 6;

Denna bit känns ju enormt konstigt tillsamans med
switchen.

I switchen ser det ut som du håller reda på vad det är för tärningsslag du får genom att addera ett till en int som du har som counter för antalet kast som landat på en siffra men dessa counters, h i j k l och m är ju inte densamma från början. Känns som du snarare vill namnge dem dicenr1, dicenr2, dicenr3 etc och låt dem börja på 0.

Permalänk

Hej igen, sorry, det är första gången jag är inne här så är lite vilsen då med hur man svarar och skriver kod här.
Tack för era svar. Jag har försökt följa era råd, och jag vet int varför jag stoppade in 6 i switchen, tror det var för att jag testade skriva dice innan men inget hände, så då försökte jag med alla möjliga metoder.
Men nu iallafall så har jag testat göra som ni sa och då får jag error vid switchen(roll) där de står att "cannot find symbol".
Försökte skapa en variable roll då men ser när jag gör det att det redan finns en variable roll.
Vad kan vara fel nu?

Permalänk
Medlem
Skrivet av Pannkakan1983:

Hej igen, sorry, det är första gången jag är inne här så är lite vilsen då med hur man svarar och skriver kod här.
Tack för era svar. Jag har försökt följa era råd, och jag vet int varför jag stoppade in 6 i switchen, tror det var för att jag testade skriva dice innan men inget hände, så då försökte jag med alla möjliga metoder.
Men nu iallafall så har jag testat göra som ni sa och då får jag error vid switchen(roll) där de står att "cannot find symbol".
Försökte skapa en variable roll då men ser när jag gör det att det redan finns en variable roll.
Vad kan vara fel nu?

Skriv hela din kod igen elle gör en pastebin som du uppdaterar.

Permalänk
Medlem
Skrivet av Pannkakan1983:

Hej igen, sorry, det är första gången jag är inne här så är lite vilsen då med hur man svarar och skriver kod här.
Tack för era svar. Jag har försökt följa era råd, och jag vet int varför jag stoppade in 6 i switchen, tror det var för att jag testade skriva dice innan men inget hände, så då försökte jag med alla möjliga metoder.
Men nu iallafall så har jag testat göra som ni sa och då får jag error vid switchen(roll) där de står att "cannot find symbol".
Försökte skapa en variable roll då men ser när jag gör det att det redan finns en variable roll.
Vad kan vara fel nu?

Som ovan använd pastebin eller kopiera i kodklamrar.

Cannot find symbol kan vara att du har något fel mellan source och class filerna. Vad för program använder du för att exekvera javac?

Är detta Eclipse Juno eller Kepler? Försök köra Clean Build om du kör Eclipse.

Visa signatur

Arch - Makepkg, not war -||- Gigabyte X570 Aorus Master -||- GSkill 64GiB DDR4 14-14-15-35-1T 3600Mhz -||- AMD 5900x-||- Gigabyte RX6900XT -||- 2x Adata XPG sx8200 Pro 1TB -||- EVGA G2 750W -||- Corsair 570x -||- O2+ODAC-||- Sennheiser HD-650 -|| Boycott EA,2K,Activision,Ubisoft,WB,EGS
Arch Linux, one hell of a distribution.

Permalänk
Skrivet av BlasteRs:

Jag kanske missar något, programmerar bara i C# men det är väldigt likt Java.

Men För det första, din Switch är lite off, då den alltid är 6?

Lägg en Random inuti din For loop, så att för varje gång den loopar slumpas en ny siffra.

for (int counter= 1; counter <= 100; counter ++);
{
int roll = dice.nextInt(6) + 1; // Detta blir ett nummer mellan 1-6.
}

sen ska du nog inte ha ett slut (;) efter din for. Då körs inte koden.
for (int counter= 1; counter <= 100; counter ++); <----

REDIGERAT

Använd sedan roll i din switch.

for (int counter= 1; counter <= 100; counter ++) { int roll = dice.nextInt(6) + 1; // Detta blir ett nummer mellan 1-6. switch (roll){ case 1: h++; break; case 2: i++; break; case 3: j++; break; case 4: k++; break; case 5: l++; break; case 6: m++; break; } }

Du måste ha en +1 i din random, då den kommer slumpa ett tal mellan 0-5.

Gjorde jag rätt nu? la till nå code taggar

Hursomhelst..jag använder netbeans. Nu har jag ändrat om lite i min kod men får det fortfarande inte att fungera. :/
Står still i huvudet på mig :/
Såhär ser det ut nu :

import java.awt.Color; import java.awt.Graphics; import java.util.Random; import javax.swing.JFrame; import javax.swing.JPanel; class DiceRoller extends JPanel { @Override public void paintComponent (Graphics g) { super.paintComponent (g); g.setColor(Color.BLACK); this.setBackground (Color.WHITE); int ett = 1; int tva = 2; int tre = 3; int fyra = 4; int fem = 5; int sex = 6; g.drawRect(40, 30, 1, 15); //stapleldiagrammen g.fillRect(40, 30, ett, 15); g.drawString("1or",10,40); g.fillRect(40, 50, tva, 15); g.drawString("2or",10,60); g.fillRect(40, 70, tre, 15); g.drawString("3or",10,80); g.fillRect(40, 90, fyra, 15); g.drawString("4or",10,100); g.fillRect(40, 110,fem, 15); g.drawString("5or",10,120); g.fillRect(40, 130,sex, 15); g.drawString("6or",10,140); g.drawString("Fördelningsstatistik", 10, 20); for (int counter= 1; counter <= 100; counter++) { Random dice = new Random(6); int roll = dice.nextInt(6) + 1; switch (roll){ case 1: ett++; break; case 2: tva++; break; case 3: tre++; break; case 4: fyra++; break; case 5: fem++; break; case 6: sex++; break; } } } public static void main( String args[] ) { DiceRoller panel =new DiceRoller();//anropa DiceRoller JFrame application = new JFrame();//JFrame application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); application.add( panel ); application.setSize( 230, 250 );//storlek på panelen application.setVisible( true ); } }

Permalänk
Medlem
Skrivet av Pannkakan1983:

Alltså vad är ditt syfte med de integers du deklarerar från början, alltså ett två tre fyr fem och sex?

Permalänk
Medlem

Antar att du iaf ska deklarera dina integers som följer:

int ett = 0; int tva = 0; int tre = 0; int fyra = 0; int fem = 0; int sex = 0;

Annars blir det helt fel... då alla startar på olika nummer.

Hade nog också deklarerat din Random utanför for-loopen, bara genererat nytt nummer inuti.

Lägg Random dice = new Random(6); innan din for loop

Permalänk
Medlem

Verkar som du saknar en klammer också, du har för lite slutklamrar ( } ), eller ser jag fel?

Ändra till

case 6: sex++; break; } } }

och testa igen

Permalänk
Skrivet av Karazhan:

Alltså vad är ditt syfte med de integers du deklarerar från början, alltså ett två tre fyr fem och sex?

Om du tittar på mitt program i designen så ska dessa integers i g.fillRect utgöra en del av designen. Dvs i staplarna kommer det visas hur många 1or, 2or , 3or osv som slumpats fram av 100 kast. Därför har jag deklarerat dessa som sedan ska implementeras i desginen samt i switchen. Men eftersom jag är nybörjare kan jag ju ha duktigt fel. Frågade en studentkollega som sa att jag var på god väg och inga fel med mina integers så, vad är det du anser fel med dessa?

Permalänk
Skrivet av BlasteRs:

Verkar som du saknar en klammer också, du har för lite slutklamrar ( } ), eller ser jag fel?

Ändra till

case 6: sex++; break; } } }

och testa igen

Nej du såg fel Hade redan 3 stycken efter break tack ändå

Permalänk
Medlem

Kanske är helt ute och cyklar då även jag själv är något av en nybörjare på java, men anropar du inte klassen DiceRoller från inuti DiceRoller?

Visa signatur

||NZXT Phantom 410||ASUS P8Z77-V||i7 3770K @ 4.2GHz||8 GB Corsair Vegeance LP 1600MHz||Gigabyte GTX 670 2Gb OC||Corsiar CX600||Intel 520 120GB SSD||

Roses are red, My screen is blue

I sit here wondering, WTF did I do

Permalänk
Skrivet av BlasteRs:

Antar att du iaf ska deklarera dina integers som följer:

int ett = 0; int tva = 0; int tre = 0; int fyra = 0; int fem = 0; int sex = 0;

Annars blir det helt fel... då alla startar på olika nummer.

Hade nog också deklarerat din Random utanför for-loopen, bara genererat nytt nummer inuti.

Lägg Random dice = new Random(6); innan din for loop

Tack , testat det men nada.... blir galen snart... förstår inte vad det är för fel. Men så är det nog att vara nybörjare..man fastnar..

Permalänk
Skrivet av Melle345:

Kanske är helt ute och cyklar då även jag själv är något av en nybörjare på java, men anropar du inte klassen DiceRoller från inuti DiceRoller?

Hur menar du? För att jag anropat DiceRoller i main?

Permalänk
Medlem
Skrivet av Melle345:

Kanske är helt ute och cyklar då även jag själv är något av en nybörjare på java, men anropar du inte klassen DiceRoller från inuti DiceRoller?

F.Ö. så kan du ju göra variablerna som du räknar antalet gånger ett nummer har slumpats fram till en array för att det ska bli lite prydligare.

Visa signatur

||NZXT Phantom 410||ASUS P8Z77-V||i7 3770K @ 4.2GHz||8 GB Corsair Vegeance LP 1600MHz||Gigabyte GTX 670 2Gb OC||Corsiar CX600||Intel 520 120GB SSD||

Roses are red, My screen is blue

I sit here wondering, WTF did I do

Permalänk
Medlem
Skrivet av Pannkakan1983:

Hur menar du? För att jag anropat DiceRoller i main?

Citat:

DiceRoller panel =new DiceRoller();//anropa DiceRoller

Klassen heter ju DiceRoller

Visa signatur

||NZXT Phantom 410||ASUS P8Z77-V||i7 3770K @ 4.2GHz||8 GB Corsair Vegeance LP 1600MHz||Gigabyte GTX 670 2Gb OC||Corsiar CX600||Intel 520 120GB SSD||

Roses are red, My screen is blue

I sit here wondering, WTF did I do

Permalänk
Skrivet av Melle345:

F.Ö. så kan du ju göra variablerna som du räknar antalet gånger ett nummer har slumpats fram till en array för att det ska bli lite prydligare.

Om array inte är högst nödvändigt utan om det fungerar bra som jag gjort så undviker jag gärna att ändra för mycket i koden. Har en deadline. Men jag tackar för tipset

Permalänk
Skrivet av Melle345:

Klassen heter ju DiceRoller, är du säker på att det inte ska vara metoden PaintComponent du ska anropa?

Nej det ska vara DiceRoller.
Men nu är problemet löst. Jag var tvungen att flytta upp switchsatsen och dessutom ta bort 6 från random. Såhär är resultatet. Jag tackar er för allt hjälp ändå!

import java.awt.Color; import java.awt.Graphics; import java.util.Random; import javax.swing.JFrame; import javax.swing.JPanel; class DiceRoller extends JPanel { @Override public void paintComponent (Graphics g) { super.paintComponent (g); g.setColor(Color.BLACK); this.setBackground (Color.WHITE); int ett = 0; int tva = 0; int tre = 0; int fyra = 0; int fem = 0; int sex = 0; Random dice = new Random(); for (int counter= 1; counter <= 100; counter++) { int roll = dice.nextInt(6) + 1; switch (roll){ case 1: ett++; break; case 2: tva++; break; case 3: tre++; break; case 4: fyra++; break; case 5: fem++; break; case 6: sex++; break; } } g.drawRect(40, 30, 1, 15); //stapleldiagrammen g.fillRect(40, 30, ett, 15); g.drawString("1or",10,40); g.fillRect(40, 50, tva, 15); g.drawString("2or",10,60); g.fillRect(40, 70, tre, 15); g.drawString("3or",10,80); g.fillRect(40, 90, fyra, 15); g.drawString("4or",10,100); g.fillRect(40, 110,fem, 15); g.drawString("5or",10,120); g.fillRect(40, 130,sex, 15); g.drawString("6or",10,140); g.drawString("Fördelningsstatistik", 10, 20); } public static void main( String args[] ) { DiceRoller panel =new DiceRoller();//anropa DiceRoller JFrame application = new JFrame();//JFrame application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); application.add( panel ); application.setSize( 230, 250 );//storlek på panelen application.setVisible( true ); } }

Permalänk
Medlem
Skrivet av Pannkakan1983:

Om du tittar på mitt program i designen så ska dessa integers i g.fillRect utgöra en del av designen. Dvs i staplarna kommer det visas hur många 1or, 2or , 3or osv som slumpats fram av 100 kast. Därför har jag deklarerat dessa som sedan ska implementeras i desginen samt i switchen. Men eftersom jag är nybörjare kan jag ju ha duktigt fel. Frågade en studentkollega som sa att jag var på god väg och inga fel med mina integers så, vad är det du anser fel med dessa?

Alltså problemet är ju att du sätter int ett som 1 int 2 som 2 .. int 6 som 6. Sen när du rullar tärning och får tex en 6a så adderar du på int sex 1 vilket är rätt men eftersom int sex börjar på 6 så kommer du efter första kastet om du rullat 6 visa att du fått 7st 6or

Permalänk
Medlem

Du skapar ju panelen med storlekar före du slumpar fördelningsstatistiken. Det är ju helt ologiskt. Du vill ju skapa panelen efter du har dina utfall (initiera dom till 0 också, inte 1,2,3,4,5). Gör for-loopen i en egen method, inte rakt i paintComponent.

Sen blir det enklare att fråga om hjälp. Gör om gör rätt, förstå vad du själv gör också.

Visa signatur

AMD 7700X (EK 240mm AIO) | ROG Strix B650E-F Gaming | Gigabyte RX 6800 XT 16GB OC | Kingston Fury 32GB DDR5 5600mhz | Kingston Fury Renegade M2 2TB | Alienware AW2723DF 280hz

Permalänk
Skrivet av Oggelito:

Du skapar ju panelen med storlekar före du slumpar fördelningsstatistiken. Det är ju helt ologiskt. Du vill ju skapa panelen efter du har dina utfall (initiera dom till 0 också, inte 1,2,3,4,5). Gör for-loopen i en egen method, inte rakt i paintComponent.

Sen blir det enklare att fråga om hjälp. Gör om gör rätt, förstå vad du själv gör också.

Vet inte när du svarade på detta... här står kl 14.45 vilket är konstigt men hursomhelst..skrev för en stund sen att jag fixat det.
Jag förstår vad jag gör men ibland tänker man fel, speciellt om man bara hållt på med detta i 3månader...
men jag tackar för dina synpunkter. Ytterst hjälpsamt