Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  7 1613
Hei! Driver nå å koder en enkel versjon av "Stein, saks, papir"... Har laget denne uten GUI, og dette fungerer fint. Prøver nå å lage en versjon med en enkel GUI, men det var ikke like enkelt. Når jeg trykker på knappene er det ingenting som skjer... Mistenker at det er for snevert scope på koden som er tenkt å forandre "resultat-labelen". Har jobbet en god stund med det nå, håper det er noen her som kan rette pekefingeren på hva jeg har gjort feil...

Her er koden min:

Kode

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class RockPaperScissorsPanel extends JPanel {
	Scanner scan = new Scanner (System.in);
		Random rand = new Random();
		String choices[] = {"Rock", "Paper", "Scissors"}; // creates the choices
		int numberOfWins = 0, numberOfLosses = 0, numberOfTies = 0; // to count the users 
		int computerChoice, userChoice;
		private JButton rock, paper, scissors;
		private JLabel ties, wins, losses, result;
		
		//sets up the panel with buttons for choices and an ok GUI
		public RockPaperScissorsPanel() {
		rock = new JButton ("Rock");
		paper = new JButton ("Paper");
		scissors = new JButton ("Scissors");
		JPanel buttonPanel, resultPanel, endPanel;
		
		ButtonListener listener = new ButtonListener();
		rock.addActionListener (listener);
		paper.addActionListener (listener);
		scissors.addActionListener (listener);
		
		buttonPanel = new JPanel ();
		buttonPanel.setPreferredSize (new Dimension (500, 40));
		buttonPanel.setBackground (Color.black);
		buttonPanel.add (rock);
		buttonPanel.add (paper);
		buttonPanel.add (scissors);
		
		ties = new JLabel("Ties: " + numberOfTies);
		wins = new JLabel("Wins: " + numberOfWins);
		losses = new JLabel("Losses: " + numberOfLosses);
				
		endPanel = new JPanel();
		endPanel.setPreferredSize (new Dimension(500, 40));
		result = new JLabel ("");
		
		resultPanel = new JPanel();
		resultPanel.setPreferredSize (new Dimension(500, 40));
		resultPanel.add (ties);
		resultPanel.add (wins);
		resultPanel.add (losses);
		
		
		setPreferredSize (new Dimension (500, 120));
		setBackground (Color.cyan);
		add (buttonPanel);
		add (endPanel);
		add (resultPanel);
	}
	
	
public class ButtonListener implements ActionListener {
	public void actionPerformed (ActionEvent event) {
		if (event.getSource() == rock) {
		userChoice = 0;
		// the computers choice
		computerChoice = rand.nextInt(3);
		
			if (computerChoice == 0) {
				result = new JLabel("The user chose " + choices[0] + " and the computer chose " + choices[2] + ", so the user wins.");
				numberOfWins = numberOfWins + 1;}
			if (computerChoice == 1) {
				result = new JLabel("The user chose " + choices[0] + " and the computer chose " + choices[1] + ", so the computer wins.");			
				numberOfLosses = numberOfLosses + 1;}
			if (computerChoice == 2) {
				result = new JLabel("The user chose " + choices[0] + " and the computer chose " + choices[0] + ", so the it is a tie.");
				numberOfTies = numberOfTies+ 1;}				
				}
		if (event.getSource() == paper){
		userChoice = 1;
		// the computers choice
		computerChoice = rand.nextInt(3);
			if (computerChoice == 0) {
				result = new JLabel("The user chose " + choices[1] + " and the computer chose " + choices[0] + ", so the user wins.");
				numberOfWins = numberOfWins + 1;}
			if (computerChoice == 1) {
				result = new JLabel("The user chose " + choices[1] + " and the computer chose " + choices[2] + ", so the computer wins.");			
				numberOfLosses = numberOfLosses+ 1;}
			if (computerChoice == 2) {
				result = new JLabel("The user chose " + choices[1] + " and the computer chose " + choices[1] + ", so the it is a tie.");
				numberOfTies = numberOfTies + 1;}				
				}
		if (event.getSource() == scissors){
		userChoice = 2;
			if (computerChoice == 0) {
				result = new JLabel("The user chose " + choices[2] + " and the computer chose " + choices[1] + ", so the user wins.");
				numberOfWins = numberOfWins + 1;}
			if (computerChoice == 1) {
				result = new JLabel("The user chose " + choices[2] + " and the computer chose " + choices[0] + ", so the computer wins.");			
				numberOfLosses = numberOfLosses + 1;}
			if (computerChoice == 2) {
				result = new JLabel("The user chose " + choices[2] + " and the computer chose " + choices[2] + ", so the it is a tie.");
				numberOfTies = numberOfTies + 1;}				
				}
					
			}
		
	}
}

Kode

import java.util.*;
import javax.swing.JFrame;

public class RockPaperScissors {
	public static void main (String[] args) {
		//creates the main frame
		JFrame frame = new JFrame ("Rock, Paper, Scissors");
		frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		
		//creates the games panel
		RockPaperScissorsPanel panel = new RockPaperScissorsPanel();
		frame.getContentPane().add (panel);
		
		frame.pack();
		frame.setVisible(true);
		}
	}
Bea
Big Bad Wolf
Bea's Avatar
Etter du har funnet ut hva computerChoice er, så lager du en ny JLabel, men JFramen din blir aldri oppdatert med denne. Prøv å refresh etter du har lagt til denne nye JLabelen.

En bedre måte å gjøre dette på vil også være å lage JLabelen når JFramen blir opprettet, også bare gjøre .setText("") på labelen istedet for å lage et nytt object vær gang.
Sist endret av Bea; 23. februar 2013 kl. 11:48.
Du har gjort et par små feil.

For det første har du glemt å legge result-objektet til noe panel, så det vil aldri bli synlig.

Feil nummer to er at du oppretter et nytt result-objekt hver gang. Det er ikke en feil i seg selv, men problemet er at dette objektet heller ikke blir lagt til et panel. I tillegg er det unødvendig å bruke minne på å opprette nye objekter på den måten, når du heller kan kalle metoden setText som finnes i result-objektet.

I tillegg bør du vurdere å optimalisere koden din og gjøre den mer lesbar.
For eksempel:
- userChoise = 0. Hva betyr det? Om du går tilbake i koden om 5 dager, husker du om 0 tilsvarer stein, saks eller papir? For andre som leser koden din er det uansett helt umulig å forstå. Her kan det være en fordel å opprette variabler som du kaller for choise_rock og tilordne verdien 0 etc. Da blir koden userChoise = choise_rock, og blir enklere å lese.
Tusen takk for gode tips, skal forsøke de når jeg kommer hjem fra jobb!
Sitat av hosjmeister Vis innlegg
Du har gjort et par små feil.
I tillegg bør du vurdere å optimalisere koden din og gjøre den mer lesbar.
For eksempel:
- userChoise = 0. Hva betyr det? Om du går tilbake i koden om 5 dager, husker du om 0 tilsvarer stein, saks eller papir? For andre som leser koden din er det uansett helt umulig å forstå. Her kan det være en fordel å opprette variabler som du kaller for choise_rock og tilordne verdien 0 etc. Da blir koden userChoise = choise_rock, og blir enklere å lese.
Vis hele sitatet...
En fin måte å gjøre akkurat det du foreslår her er å benytte Enums.

Kode

public enum Move {
    ROCK, SCISSORS, PAPER
}
så refererer du til de ulike tingene ved å bruke Move.ROCK, osv. Internt er det kun en mapping mellom alt i en Enum og et inkrementerende tall, men verdiene er faste og opprettelsen er ganske oversiktlig.

Derimot åpner det for litt mer triksing om man vet hvilke tall som er assignet til hva, spesielt om programmet skal utvides til en av de alternative variantene uten altfor mye arbeid med å finne ut hva som slår hva.
Sist endret av Dyret; 23. februar 2013 kl. 18:48.
Takk for hjelpen alle sammen, nå fungerer programmet akkurat som det skal! Kommer nok til å renskrive koden i løpet av de nærmeste dagene også, så er det litt mer lettlest om jeg tilfeldigvis trenger denne øvingen til eksamen... Man vet jo aldri!
Veldig greit tips er å lage koden på en slik måte at du selv kan forstå hva du har gjort senere, spesielt når du skal øve til eksamen eller hvis du en gang skal videreutvikle programmet. Ingenting er verre en å gå inn i koden å se følgende kode

Kode

int aNumber = 0;
if (test)
    aNumber=1;

doSomething(aNumber);
Greit nok hvis koden er kort, eller ellers bra dokumentert, men vet av egen erfaring at det er vanskelig å dokumentere koden godt nok. Derfor lurt å benytte enkle triks, som for eksempel enum som dyret nevnet, for å gjøre koden ryddigere og mer lettleselig.

Også greit å tenke på hvor mye repetisjon du har i koden. I ditt eksempel er hele klassen 'ButtonListener' mye copy/paste, som fører til mye kluss hvis du ønsker å endre en liten verdi, for eksempel teksten som skal vises i resultat labelen din. I tillegg blir det verre å legge til ekstra funksjonalitet. Det kan være lurt å lage seg gode vaner på kodeoptimalisering og lettleselig kode i starten, før koden blir ekstremt kompleks.

Just a tip!
Skal ha det i bakhodet, jeg vil nok bli flinkere til dette med tiden (håper jeg :P)! Men det er et godt tips!