Permalänk

Java sax sten påse med GUI

Hej
Först jag vill att säga ursäkta med mitt språk eftersom jag är inte svensk man

Jag har skapat ett sax sten påse program i java med GUI
Jag har tre JButton med namn "Sten" "Sax" "Påse"
När man trycker på JButton, datorn ska ge ett slumptal mellan intervallet 1~3
Resultatet ska visas i JTextArea

Mitt kod ses ut så:

package Kapitel6; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Uppgift6_7 extends JFrame implements ActionListener{ JButton sten = new JButton("Sten"); JButton sax = new JButton("Sax"); JButton påse = new JButton("Påse"); JPanel p = new JPanel(); JPanel p2 = new JPanel(); JTextArea area = new JTextArea(10,60); public Uppgift6_7(){ area.setFont(new Font("Monospaced", Font.PLAIN, 12)); p.setLayout(new FlowLayout()); p.add(sten); p.add(sax); p.add(påse); p2.add(area); sten.addActionListener(this); sax.addActionListener(this); påse.addActionListener(this); add(p, BorderLayout.NORTH); add(p2, BorderLayout.SOUTH); pack(); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e){ int slumptal; int SAX = 1; int STEN = 2; int PÅSE =3; int förlora = 0; int vinna = 0; if(e.getSource()==sax){ slumptal = ((int) Math.random()*3+1); if(slumptal == STEN){ förlora++; area.setText("Du har förlorat" + förlora + "gånger respektive" + vinna + "gånger"); } if(slumptal == PÅSE){ vinna++; area.setText("Du har vunnit" + vinna + "gånger respektive" + förlora + "gånger"); } else area.setText("DRAW!"); } if(e.getSource()==sten){ slumptal = ((int) Math.random()*3+1); if(slumptal == PÅSE){ förlora++; area.setText("Du har förlorat" + förlora + "gånger respektive" + vinna + "gånger"); } if(slumptal == SAX){ vinna++; area.setText("Du har vunnit" + vinna + "gånger respektive" + förlora + "gånger"); } else area.setText("DRAW!"); } if(e.getSource()==påse){ slumptal = ((int) Math.random()*3+1); if(slumptal == SAX){ förlora++; area.setText("Du har förlorat" + förlora + "gånger respektive" + vinna + "gånger"); } if(slumptal == STEN){ vinna++; area.setText("Du har vunnit" + vinna + "gånger respektive" + förlora + "gånger"); } else area.setText("DRAW!"); } } public static void main (String[] args){ Uppgift6_7 Upp = new Uppgift6_7(); } }

Jag har två problem..

Första är antal vinna går inte högre än 1
Andra är när man trycker knappen Sten, program alltid visar att jag vann
Men när man trycker på påse eller sax, jag ser alltid!!!!! "Draw!"

Första problem det är inte så viktig, men andra problem jag måste lösa. Jag har tänkt kanske 2 timmar och fortfarande förstår inte varför visar det så???

Det blir jätte jätte jätte stor tack om någon hjälper mig!!

Permalänk
Medlem
Skrivet av ProgrammeringElev:

Hej
Först jag vill att säga ursäkta med mitt språk eftersom jag är inte svensk man

Jag har skapat ett sax sten påse program i java med GUI
Jag har tre JButton med namn "Sten" "Sax" "Påse"
När man trycker på JButton, datorn ska ge ett slumptal mellan intervallet 1~3
Resultatet ska visas i JTextArea

Mitt kod ses ut så:

package Kapitel6; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Uppgift6_7 extends JFrame implements ActionListener{ JButton sten = new JButton("Sten"); JButton sax = new JButton("Sax"); JButton påse = new JButton("Påse"); JPanel p = new JPanel(); JPanel p2 = new JPanel(); JTextArea area = new JTextArea(10,60); public Uppgift6_7(){ area.setFont(new Font("Monospaced", Font.PLAIN, 12)); p.setLayout(new FlowLayout()); p.add(sten); p.add(sax); p.add(påse); p2.add(area); sten.addActionListener(this); sax.addActionListener(this); påse.addActionListener(this); add(p, BorderLayout.NORTH); add(p2, BorderLayout.SOUTH); pack(); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e){ int slumptal; int SAX = 1; int STEN = 2; int PÅSE =3; int förlora = 0; int vinna = 0; if(e.getSource()==sax){ slumptal = ((int) Math.random()*3+1); if(slumptal == STEN){ förlora++; area.setText("Du har förlorat" + förlora + "gånger respektive" + vinna + "gånger"); } if(slumptal == PÅSE){ vinna++; area.setText("Du har vunnit" + vinna + "gånger respektive" + förlora + "gånger"); } else area.setText("DRAW!"); } if(e.getSource()==sten){ slumptal = ((int) Math.random()*3+1); if(slumptal == PÅSE){ förlora++; area.setText("Du har förlorat" + förlora + "gånger respektive" + vinna + "gånger"); } if(slumptal == SAX){ vinna++; area.setText("Du har vunnit" + vinna + "gånger respektive" + förlora + "gånger"); } else area.setText("DRAW!"); } if(e.getSource()==påse){ slumptal = ((int) Math.random()*3+1); if(slumptal == SAX){ förlora++; area.setText("Du har förlorat" + förlora + "gånger respektive" + vinna + "gånger"); } if(slumptal == STEN){ vinna++; area.setText("Du har vunnit" + vinna + "gånger respektive" + förlora + "gånger"); } else area.setText("DRAW!"); } } public static void main (String[] args){ Uppgift6_7 Upp = new Uppgift6_7(); } }

Jag har två problem..

Första är antal vinna går inte högre än 1
Andra är när man trycker knappen Sten, program alltid visar att jag vann
Men när man trycker på påse eller sax, jag ser alltid!!!!! "Draw!"

Första problem det är inte så viktig, men andra problem jag måste lösa. Jag har tänkt kanske 2 timmar och fortfarande förstår inte varför visar det så???

Det blir jätte jätte jätte stor tack om någon hjälper mig!!

Din vinna blir aldrig mer än 1 eftersom du deklarerar den i funktionen public void actionPerformed(ActionEvent e) och sätter värdet till 0. Detta betyder att varje gång sätter du värdet till 0.

Ditt andra problem tror jag ligger i din Math.random(). För det första skulle jag flytta ut detta så du endast gör det en gång istället för 3. Och sen kan du ju logga vad du får för siffra så vet du ifall den koden fungerar.
Jag har för mig (kan dock ha fel) att du ska ha 1+(int) (Math.random()*3 +1).
Alternativt så använder du funktionen Random istället så får du int direkt.

'Random ran = new Random();
int x = ran.nextInt(3) + 1;'
Du kan kolla och testa ändra lite i koden samt logga detta. Hör av dig om resultat

Sen ett tips är att kolla elseif satser istället för att rada massor av if satser efter varandra.

Visa signatur

Corsair Air 540 | Asus strix x470-f gaming | AMD Ryzen 7 3700x| 2x8gb 3200mhz RAM | Asus GTX 2070 |2xSSD 512GB(boot) | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK, Benq 27" 144hz | Win 11 pro N 64-bit

Permalänk
Skrivet av Nollan:

Din vinna blir aldrig mer än 1 eftersom du deklarerar den i funktionen public void actionPerformed(ActionEvent e) och sätter värdet till 0. Detta betyder att varje gång sätter du värdet till 0.

Ditt andra problem tror jag ligger i din Math.random(). För det första skulle jag flytta ut detta så du endast gör det en gång istället för 3. Och sen kan du ju logga vad du får för siffra så vet du ifall den koden fungerar.
Jag har för mig (kan dock ha fel) att du ska ha 1+(int) (Math.random()*3 +1).
Alternativt så använder du funktionen Random istället så får du int direkt.

'Random ran = new Random();
int x = ran.nextInt(3) + 1;'
Du kan kolla och testa ändra lite i koden samt logga detta. Hör av dig om resultat

Sen ett tips är att kolla elseif satser istället för att rada massor av if satser efter varandra.

Tack! Jag har löst problem 1
Men jag förstår inte hur ska jag göra med funktionen Random
Ska jag skriva int slumptal = ........ i metoden Random och sen anropa den metod

Random ran = new Random();
int x = ran.nextInt(3) + 1;
så?
Men min java visar error när jag gör så

Permalänk
Medlem
Skrivet av ProgrammeringElev:

Tack! Jag har löst problem 1
Men jag förstår inte hur ska jag göra med funktionen Random
Ska jag skriva int slumptal = ........ i metoden Random och sen anropa den metod

Random ran = new Random();
int x = ran.nextInt(3) + 1;
så?
Men min java visar error när jag gör så

Bra att det löste problem 1.

Jo det är en random funktion som returnerar en int.
Du deklarerar först en variabel genom

Random ran = new Random();

Denna variabel använder du sen för att randomisera ett värde. Den fungerar såhär:

slumptal = ran.nextInt(3) + 1 ;
(din variabel) = (din randomvariabel).nextInt(hur många siffror som ska randomiseras) + (det du vill att den ska börja på)

Hoppas det löser sig. Annars får du fråga mera

Visa signatur

Corsair Air 540 | Asus strix x470-f gaming | AMD Ryzen 7 3700x| 2x8gb 3200mhz RAM | Asus GTX 2070 |2xSSD 512GB(boot) | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK, Benq 27" 144hz | Win 11 pro N 64-bit