webForumDet fria alternativet

Kan någon vara gullig och hjälpa mig?

Java

35 svar · 1 963 visningar · startad av PollyJuice · sida 2 av 2

Frågan, av PollyJuice

Hej! Jag håller på att utveckla ett memoryspel för ett projekt i skolan, och jag har kört fast. Jag försöker att skapa en ArrayList där man slumpar fram siffrorna 0-15. Varje siffra läggs i ett index i en array. Själva spelet ser ut som en tvådimensionell array, med 4\4 rutor. Varje ruta har en button med en icon som ser ut som baksidan på ett spelkort, och varje button tilldelas ett värde uti

Läs frågan i sin helhet →
Medlem sedan mars 2006124 inlägg
#21

1 & 2: Ändrade till:

public class MemoryKort extends javax.swing.JPanel {
enum Kort{bla, rod, gron, gul, vit, svart, lila, rosa, baksida};
public Kort farg;
}

Hoppas det tar hand om 1 och 2.

3. Tog bort klassen och lade till baksida i enum hos MemoryKort istället..?
4. Jag antar att du menar att det finns ett smidigare sätt än att skriva

farger.add(bla);
farger.add(bla);
farger.add(rod);
farger.add(rod);
osv

men jag förstår inte riktigt hur du menar. Ska jag skapa en metod direkt under

java.util.ArrayList farger = new java.util.ArrayList(16);

?
Metoden för Collections.shuffle, den ska väl stå i MemoryKort?
Tagit bort list, som du föreslog.

5. Anledningen till att allt ser så rörigt ut är dels att jag är rätt så dålig på Java - två projekt till, och sen hoppas jag att jag slipper fler programkonstruktioner i java på den här utbildningen :r - dels att det här stackars programmet började skapas i Flash, därefter blev det Dreamweaver, sen blev det Java med en kort snabbis in på Visual Editor, samt att jag har fått goda råd från 3 mycket duktiga och kunniga javaprogrammerare som alla haft utmärkta ideer som inte varit en och samma ide, vilket ökat på den här blondinens förvirring ytterligare...

Jag är hemskt tacksam för att du vill hjälpa mig, för själv har jag kört fast. Jag HAR i designläget en 4x4 gridlayout i en JPanel, jag har bara inte den blekaste aning om hur jag ska få värdena i arraylist (när jag väl lyckats få dem dit) att bli till button icons.

Medlem sedan mars 20007 896 inlägg
#22

4. Visst finns det ett smidigare sätt att skriva;

for(Kort memoryKort : Kort.values()) {
     farger.add(memoryKort);
     farger.add(memoryKort);
}

En for each-loop som går igenom hela din enum Kort och lägger till två av varje färg till ArrayList farger.

Collections.shuffle() bör finnas i en metod i klassen MemoryForm, inte i MemoryKort.

En liten påpekan bara: Enumererbara värden brukar deklareras med enbart versaler för att inte förvirra/försvåra om någon läser din kod. :)
Exempel:

public class Demo {
     public enum Card { RED, GREEN, BLUE, YELLOW, BLACK, WHITE }
...

Det gör det hela lite mer lättläst och förståeligt. :)

Medlem sedan mars 2006124 inlägg
#23
 public class MemoryImage {
        public MemoryImage(string kortfarg) {
            this.kortfarg = kortfarg;
            initComponents();
            
            URL bildUrl = getClass().getResource("memory/images/"+ Memorykort.Kort.farg);
            button.setIcon( new ImageIcon( bildUrl ));
            
            URL baksideURL = getClass().getResource("memory/images/baksida.gif" );
            button.setIcon( new ImageIcon( bildUrl ));
        }
        public void showBaksida(){
            button.setIcon( new ImageIcon( baksideUrl ));
        }
        public void showImage(){
            button.setIcon( new ImageIcon( bildUrl ));
        }
    }
    {
        MemoryImage mi = new MemoryImage( tabellen[i] );
        Spelplan.add( mi );
        mi.button.addActionListener( new ButtonActionListener(mi) );
    }
}
MemoryImage clickedFirst;
MemoryImage clickedSecond;
MemoryImage clickedThird;

class ButtonActionListener implements ActionListener{
    MemoryImage memoryImage;
    ButtonActionListener(MemoryImage mi){
        this.memoryImage = mi;
    }
    public void actionPerformed(ActionEvent e) {
        if ( clickedFirst == null ) {
            clickedFirst = memoryImage;
            memoryImage.showImage();
            return;
        }
        if ( clickedSecond == null ){
            clickedSecond = memoryImage;
            memoryImage.showImage();
            return;
        }
        if(clickedThird==null){
            if(clicked.First.farg==clickedSecond.farg){
                memoryImage.setVisible(false);
            }
            if(!clicked.First.farg==clickedSecond.farg){
                memoryImage.showBaksida();
                
            }
        }
    }

Man närmar sig! Klasserna verkar ha blivit ok sen jag flyttade for-satsen rätt, men nu är det knapparna som ska åtgärdas. NetBeans vill ha en class eller en interface för clickedSecond och clickedThird, men inte för clickedFirst, konstigt nog.
Bör jag stryka hela den delen och börja om på nåt nytt, smart sätt, eller går det att rädda den här röran?

Medlem sedan mars 2006124 inlägg
#24

*bump*

Medlem sedan mars 20007 896 inlägg
#25

Du får flytta in deklareringen (deklarationen?) av clickedFirst, Second och Third in till klassen ButtonActionListener.

Medlem sedan mars 2006124 inlägg
#26

OK, det här är hela koden. Enda felet nu är att privata variablerna längst ner vill ha en class eller itnerface, samt att det inte går att köra programmet för att den inte hittar någon main class.

Känns som om jag näääästan lyckats, bortsett från den lilla detaljen att det inte funkar. :l ;)
Redovisning klockan 13.00.

17 också!!! Hjälp, hjälp, snälla!

(Om ingen hinner läsa det här före 13, svara gärna ändå, jag kan få godkänt om jag lämnar in det överhuvudtaget; jag har för länge sen gett upp tanken på höga betyg och satsar bara på att få godkänt.)

package memory;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.*;
import java.math.*;
import java.awt.*;
import javax.swing.ImageIcon;
import java.net.URL;

public class MemoryForm extends javax.swing.JFrame {
    /** Creates new form MemoryForm */
    public class MemoryKort extends javax.swing.JPanel {
    enum Kort{BLA, ROD, GRON, GUL, VIT, SVART, LILA, ROSA, BAKSIDA};
    public Kort farg;  
}
    
    public MemoryForm() {
        java.util.ArrayList farger = new java.util.ArrayList(16);
           for(Kort memoryKort : Kort.values()) {
            farger.add(memoryKort);
            farger.add(memoryKort);
    }
    }
    public void blanda(string blandning){
        farger = java.util.Collections.shuffle(farger);
    }
}

public class MemoryImage {
    public MemoryImage(string kortfarg) {
        this.kortfarg = kortfarg;
        initComponents();
        
        URL bildUrl = getClass().getResource("memory/images/"+ Memorykort.Kort.farg);
        button.setIcon( new ImageIcon( bildUrl ));
        
        URL baksideURL = getClass().getResource("memory/images/baksida.gif" );
        button.setIcon( new ImageIcon( bildUrl ));
    }
    public void showBaksida(){
        button.setIcon( new ImageIcon( baksideUrl ));
    }
    public void showImage(){
        button.setIcon( new ImageIcon( bildUrl ));
    }
    {
        MemoryImage mi = new MemoryImage( tabellen[i] );
        Spelplan.add( mi );
        mi.button.addActionListener( new ButtonActionListener(mi) );
    }
}

class ButtonActionListener implements ActionListener{
    MemoryImage memoryImage;
    MemoryImage clickedFirst;
    MemoryImage clickedSecond;
    MemoryImage clickedThird;
    ButtonActionListener(MemoryImage mi){
        this.memoryImage = mi;
    }
    public void actionPerformed(ActionEvent e) {
        if ( clickedFirst == null ) {
            clickedFirst = memoryImage;
            memoryImage.showImage();
            return;
        }
        if ( clickedSecond == null ){
            clickedSecond = memoryImage;
            memoryImage.showImage();
            return;
        }
        if(clickedThird==null){
            if(clicked.First.farg==clickedSecond.farg){
                memoryImage.setVisible(false);
            }
            if(!clicked.First.farg==clickedSecond.farg){
                memoryImage.showBaksida();
                
            }
        }
    }
    
}

    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">                          
    private void initComponents() {
        Spelplan = new javax.swing.JPanel();
        Knapp1 = new javax.swing.JButton();
        Knapp2 = new javax.swing.JButton();
        Knapp3 = new javax.swing.JButton();
        Knapp4 = new javax.swing.JButton();
        Knapp5 = new javax.swing.JButton();
        Knapp6 = new javax.swing.JButton();
        Knapp7 = new javax.swing.JButton();
        Knapp8 = new javax.swing.JButton();
        Knapp9 = new javax.swing.JButton();
        Knapp10 = new javax.swing.JButton();
        Knapp11 = new javax.swing.JButton();
        Knapp12 = new javax.swing.JButton();
        Knapp13 = new javax.swing.JButton();
        Knapp14 = new javax.swing.JButton();
        Knapp15 = new javax.swing.JButton();
        Knapp16 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        Spelplan.setLayout(new java.awt.GridLayout(4, 4));

        Spelplan.add(Knapp1);

        Spelplan.add(Knapp2);

        Spelplan.add(Knapp3);

        Spelplan.add(Knapp4);

        Spelplan.add(Knapp5);

        Spelplan.add(Knapp6);

        Spelplan.add(Knapp7);

        Spelplan.add(Knapp8);

        Spelplan.add(Knapp9);

        Spelplan.add(Knapp10);

        Spelplan.add(Knapp11);

        Spelplan.add(Knapp12);

        Spelplan.add(Knapp13);

        Spelplan.add(Knapp14);

        Spelplan.add(Knapp15);

        Spelplan.add(Knapp16);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(Spelplan, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(Spelplan, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE)
        );
        pack();
    }// </editor-fold>                        
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MemoryForm().setVisible(true);
                
            }
        });
    }
    
    // Variables declaration - do not modify                     
    private javax.swing.JButton Knapp1;
    private javax.swing.JButton Knapp10;
    private javax.swing.JButton Knapp11;
    private javax.swing.JButton Knapp12;
    private javax.swing.JButton Knapp13;
    private javax.swing.JButton Knapp14;
    private javax.swing.JButton Knapp15;
    private javax.swing.JButton Knapp16;
    private javax.swing.JButton Knapp2;
    private javax.swing.JButton Knapp3;
    private javax.swing.JButton Knapp4;
    private javax.swing.JButton Knapp5;
    private javax.swing.JButton Knapp6;
    private javax.swing.JButton Knapp7;
    private javax.swing.JButton Knapp8;
    private javax.swing.JButton Knapp9;
    private javax.swing.JPanel Spelplan;
    // End of variables declaration
Medlem sedan mars 20007 896 inlägg
#27

Flytta allting efter "// <editor-fold defaultstate="collapsed" desc=" Generated Code ">" till klassen MemoryForm (innanför { och } för klassen alltså ;)) och döp filen till MemoryForm.java. Lycka till, hoppas det går bra. :)

Medlem sedan mars 2006124 inlägg
#28

Menar du själva

public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MemoryForm().setVisible(true);
                
            }
        });
    }

????

Ooookeeej... Men filen HETER ju redan MemoryForm.java? Och den klagar fortfarande över alla knapparna. Den vill ha en class, ett interface eller en enum, säger den.

Medlem sedan mars 20007 896 inlägg
#29

Allting efter "// <editor..." måste finnas i en klass, som det är nu ligger det bara löst i koden. Även main-metoden måste in i en klass, så från "// <editor..." till slutet av filen, flyttar du in i MemoryForm-klassen.

Medlem sedan mars 2006124 inlägg
#30

Jag kan kopiera in allt utom "private javax.swing.JButton Knapp1;"osv. Problemet är att det som står inom de blå fälten (se bild) inte går att ta bort annat än om jag raderar dem i designläget - men behöver jag dem inte?

skarmdump.GIF
Medlem sedan mars 20007 896 inlägg
#31

Jo, du behöver dom. :)

Hur menar du att du inte "kan"? Om du placerar dom precis ovanför första "Spelplan.add(..."?

Medlem sedan mars 2006124 inlägg
#32
package memory;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.*;
import java.math.*;
import java.awt.*;
import javax.swing.ImageIcon;
import java.net.URL;

public class MemoryForm extends javax.swing.JFrame {
    /** Creates new form MemoryForm */
    public class MemoryKort extends javax.swing.JPanel {
        enum Kort{BLA, ROD, GRON, GUL, VIT, SVART, LILA, ROSA, BAKSIDA};
        public Kort farg;
    }
    
    public MemoryForm() {
        java.util.ArrayList farger = new java.util.ArrayList(16);
        for(Kort memoryKort : Kort.values()) {
            farger.add(memoryKort);
            farger.add(memoryKort);
        }
    }
    public void blanda(string blandning){
        farger = java.util.Collections.shuffle(farger);
    }
    private void initComponents() {
        Spelplan = new javax.swing.JPanel();
        Knapp1 = new javax.swing.JButton();
        Knapp2 = new javax.swing.JButton();
        Knapp3 = new javax.swing.JButton();
        Knapp4 = new javax.swing.JButton();
        Knapp5 = new javax.swing.JButton();
        Knapp6 = new javax.swing.JButton();
        Knapp7 = new javax.swing.JButton();
        Knapp8 = new javax.swing.JButton();
        Knapp9 = new javax.swing.JButton();
        Knapp10 = new javax.swing.JButton();
        Knapp11 = new javax.swing.JButton();
        Knapp12 = new javax.swing.JButton();
        Knapp13 = new javax.swing.JButton();
        Knapp14 = new javax.swing.JButton();
        Knapp15 = new javax.swing.JButton();
        Knapp16 = new javax.swing.JButton();
        
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        Spelplan.setLayout(new java.awt.GridLayout(4, 4));
        
        Spelplan.add(Knapp1);
        
        Spelplan.add(Knapp2);
        
        Spelplan.add(Knapp3);
        
        Spelplan.add(Knapp4);
        
        Spelplan.add(Knapp5);
        
        Spelplan.add(Knapp6);
        
        Spelplan.add(Knapp7);
        
        Spelplan.add(Knapp8);
        
        Spelplan.add(Knapp9);
        
        Spelplan.add(Knapp10);
        
        Spelplan.add(Knapp11);
        
        Spelplan.add(Knapp12);
        
        Spelplan.add(Knapp13);
        
        Spelplan.add(Knapp14);
        
        Spelplan.add(Knapp15);
        
        Spelplan.add(Knapp16);
        
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(Spelplan, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
                );
        layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(Spelplan, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE)
                );
        pack();
    }
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MemoryForm().setVisible(true);
                
            }
        });
    }
}

public class MemoryImage {
    public MemoryImage(string kortfarg) {
        this.kortfarg = kortfarg;
        initComponents();
        
        URL bildUrl = getClass().getResource("memory/images/"+ Memorykort.Kort.farg);
        button.setIcon( new ImageIcon( bildUrl ));
        
        URL baksideURL = getClass().getResource("memory/images/baksida.gif" );
        button.setIcon( new ImageIcon( bildUrl ));
    }
    public void showBaksida(){
        button.setIcon( new ImageIcon( baksideUrl ));
    }
    public void showImage(){
        button.setIcon( new ImageIcon( bildUrl ));
    }
    {
        MemoryImage mi = new MemoryImage( tabellen[i] );
        Spelplan.add( mi );
        mi.button.addActionListener( new ButtonActionListener(mi) );
    }
}

class ButtonActionListener implements ActionListener{
    MemoryImage memoryImage;
    MemoryImage clickedFirst;
    MemoryImage clickedSecond;
    MemoryImage clickedThird;
    ButtonActionListener(MemoryImage mi){
        this.memoryImage = mi;
    }
    public void actionPerformed(ActionEvent e) {
        if ( clickedFirst == null ) {
            clickedFirst = memoryImage;
            memoryImage.showImage();
            return;
        }
        if ( clickedSecond == null ){
            clickedSecond = memoryImage;
            memoryImage.showImage();
            return;
        }
        if(clickedThird==null){
            if(clicked.First.farg==clickedSecond.farg){
                memoryImage.setVisible(false);
            }
            if(!clicked.First.farg==clickedSecond.farg){
                memoryImage.showBaksida();
                
            }
        }
    }
    
}

    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">                          
    private void initComponents() {
        Spelplan = new javax.swing.JPanel();
        Knapp1 = new javax.swing.JButton();
        Knapp2 = new javax.swing.JButton();
        Knapp3 = new javax.swing.JButton();
        Knapp4 = new javax.swing.JButton();
        Knapp5 = new javax.swing.JButton();
        Knapp6 = new javax.swing.JButton();
        Knapp7 = new javax.swing.JButton();
        Knapp8 = new javax.swing.JButton();
        Knapp9 = new javax.swing.JButton();
        Knapp10 = new javax.swing.JButton();
        Knapp11 = new javax.swing.JButton();
        Knapp12 = new javax.swing.JButton();
        Knapp13 = new javax.swing.JButton();
        Knapp14 = new javax.swing.JButton();
        Knapp15 = new javax.swing.JButton();
        Knapp16 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        Spelplan.setLayout(new java.awt.GridLayout(4, 4));

        Spelplan.add(Knapp1);

        Spelplan.add(Knapp2);

        Spelplan.add(Knapp3);

        Spelplan.add(Knapp4);

        Spelplan.add(Knapp5);

        Spelplan.add(Knapp6);

        Spelplan.add(Knapp7);

        Spelplan.add(Knapp8);

        Spelplan.add(Knapp9);

        Spelplan.add(Knapp10);

        Spelplan.add(Knapp11);

        Spelplan.add(Knapp12);

        Spelplan.add(Knapp13);

        Spelplan.add(Knapp14);

        Spelplan.add(Knapp15);

        Spelplan.add(Knapp16);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(Spelplan, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(Spelplan, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE)
        );
        pack();
    }// </editor-fold>                        
    
    
    
    // Variables declaration - do not modify                     
    private javax.swing.JButton Knapp1;
    private javax.swing.JButton Knapp10;
    private javax.swing.JButton Knapp11;
    private javax.swing.JButton Knapp12;
    private javax.swing.JButton Knapp13;
    private javax.swing.JButton Knapp14;
    private javax.swing.JButton Knapp15;
    private javax.swing.JButton Knapp16;
    private javax.swing.JButton Knapp2;
    private javax.swing.JButton Knapp3;
    private javax.swing.JButton Knapp4;
    private javax.swing.JButton Knapp5;
    private javax.swing.JButton Knapp6;
    private javax.swing.JButton Knapp7;
    private javax.swing.JButton Knapp8;
    private javax.swing.JButton Knapp9;
    private javax.swing.JPanel Spelplan;
    // End of variables declaration

Om jag försöker att kopiera "privatarna" och lägga dem över första spelplan.add() så har jag dem på två ställen, och på bägge så är de rödmarkerade i NetBeans och den säger att det är "illegal start of expression" på de första "privatarna" och den vill ha en class eller ett interface på de sista, de i den blå rutan. Allt som står i en blå ruta kan bara kopieras till en klass, de kan inte raderas. NetBeans funkar så. :(

Medlem sedan mars 2006124 inlägg
#33

Och ska verkligen mainsatsen stå i en klass? Jag har alltid fått lära mig att först skriver man klasserna, sen kommer public static void main?

Medlem sedan mars 2006124 inlägg
#34

En verkligt knasig detalj är att "private javax.swing.JButton Knapp1;" INTE får något felmeddelande, bara de andra..?

Medlem sedan mars 2006124 inlägg
#35

Den "private void initcomponents()" som står i det blå fältet vill ha en class eller ett interface, men den som står i klassen funkar utan det..?

Medlem sedan mars 20007 896 inlägg
#36

Main-metoden måste vara i den klass som filen är döpt efter.

Nu har jag gått igenom hela din kod, och - tyvärr - är det en hel del som måste rättas till. Du anropar t.ex. metoder som inte finns (MemoryImage.setVisible()), objekt som inte finns (button), klasser som inte finns (MemoryKort), du har referenser till objekt som ligger i andra klasser (spelplan), variabler som inte finns (farg), m.m.

274 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)