[JAVA] Maken van SchuifPuzzel

Pagina: 1
Acties:
  • 158 views sinds 30-01-2008

  • Jilvoos
  • Registratie: Maart 2003
  • Laatst online: 18-11 08:24
Hallo,

Ik heb voor school de opdracht gekregen een schuifpuzzel te maken in Java.

*knip*

Nu heb ik al een aantal dingen:

SchuifPuzzel.class:

Hierin wordt het scherm opgebouwd en moet het echte schuifwerk gebeuren.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package SchuifPuzzel;

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

public class SchuifPuzzel extends JFrame {
    
    //Aanmaken/Declareren
    static int aantalKnoppen = 16;
    static int kolommen = (int) Math.sqrt((double) aantalKnoppen);
    static int rijen = kolommen;
    static protected JButton[][] buttons = new JButton[rijen+1][kolommen+1];
    static ButtonListener btListener = new ButtonListener();
    static SchuifPuzzel frame;
    public Container container = getContentPane();
    public Vak[][] vakjes = new Vak[rijen+1][kolommen+1];
    public int button = 0;
    public JPanel panel = new JPanel();
        
    /** Aanmaken SchuifPuzzel frame **/
    public SchuifPuzzel() {
        //Layout bepalen
        container.add(panel);
        panel.setLayout(new GridLayout(rijen, kolommen));

        //Knoppen toevoegen
        for(int rij=1;rij<=rijen;rij++){
            for(int kolom=1;kolom<=kolommen;kolom++){
                button++;
                if(button==16){
                    vakjes[rij][kolom] = new Vak(rij,kolom);
                    button=0;
                    break;
                }
                else{
                    buttons[rij][kolom] = new JButton(""+button);
                    panel.add(buttons[rij][kolom]);
                    buttons[rij][kolom].setBackground(Color.white);
                    buttons[rij][kolom].addActionListener(btListener);
                    vakjes[rij][kolom] = new Vak(rij,kolom);
                }
            }
        }
    }

    /** Main method */
    public static void main(String[] args) {
        frame = new SchuifPuzzel();
        frame.setTitle("Schuifpuzzel");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);
        frame.setVisible(true);
    }
    
    /** Methode om knoppen te verplaatsen **/ 
    public void switchKnop(Vak vak){
        for(int rij=1;rij<=rijen;rij++){
            for(int kolom=1;kolom<=kolommen;kolom++){
                //Lege plek zoeken
                if(buttons[rij][kolom]==null){

                    //Locaties bepalen
                    int vorigeRij = vakjes[rij][kolom].rij; //Rij van lege vak
                    int vorigeKolom = vakjes[rij][kolom].kolom; //Kolom van lege vak
                    int huidigeRij = vak.rij;                   //Rij van gedrukte knop
                    int huidigeKolom = vak.kolom;               //Kolom van gedrukte knop

                    //Kijken of knop verplaatst kan worden
                    if(vorigeRij==huidigeRij){
                        if(Math.abs(vorigeKolom-huidigeKolom)==1){
                            //Verwijderen knop
                            panel.remove(buttons[huidigeRij][huidigeKolom]);             
                            
                            //Overgeven object
                            buttons[vorigeRij][vorigeKolom] = buttons[huidigeRij][huidigeKolom];  
                            
                            //Toevoegen knop op lege plek
                            panel.add(buttons[vorigeRij][vorigeKolom]);                          
                            
                            //Object verwijderen  
                            buttons[huidigeRij][huidigeKolom] = null;                               
                            
                            //Repainten van het paneel
                            panel.repaint();                                                   
                        }
                    }

                    if(vorigeKolom==huidigeKolom){
                        if(Math.abs(vorigeRij-huidigeRij)==1){
                            //Verwijderen knop
                            panel.remove(buttons[huidigeRij][huidigeKolom]);             
                            
                            //Overgeven object
                            buttons[vorigeRij][vorigeKolom] = buttons[huidigeRij][huidigeKolom];  
                            
                            //Toevoegen knop op lege plek
                            panel.add(buttons[vorigeRij][vorigeKolom]);                          
                            
                            //Object verwijderen  
                            buttons[huidigeRij][huidigeKolom] = null;                               
                            
                            //Repainten van het paneel
                            panel.repaint();                                                     
                        }
                    }   
                }
            }
        }
    }       
}


Buttonlistener.class:

Spreekt voor zich lijkt mij.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package SchuifPuzzel;

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

class ButtonListener extends SchuifPuzzel implements ActionListener{
    public void actionPerformed(ActionEvent e) {
        //Meegroeiende buttonlistener
        for(int i=1;i<=rijen;i++){
            for(int j=1;j<=kolommen;j++){
                if(e.getSource()==buttons[i][j]) switchKnop(vakjes[i][j]);
            }
        }
    }
}


Vakjes.class:

Dit zijn de vak objecten waar ik de rij en kolom uit ophaal.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package SchuifPuzzel;

/** Object met eigenschappen van een vakje **/
public class Vak{
    
    public int rij;
    public int kolom;
    public boolean empty= false;

    //Opslaan locatie
    public Vak(int rij, int kolom){ 
        this.rij=rij;
        this.kolom=kolom;
    }
}


Het probleem is het volgende. Zoals jullie zien probeer ik te repainten, maar dit werkt niet wanneer ik op een knop druk, maar alleen wanneer ik de puzzel bedek met een ander scherm en hem dan weer tevoorschijn haal.

Dit is niet het enige. Want ipv dat de knop verplaatst wordt naar het lege vlak, wordt de knop verwijderd en schuiven de knoppen gewoon een plaats op. Een voorbeeld:

Start:
Afbeeldingslocatie: http://net-base.nl/jilles/test/situatie1.jpg
Afbeeldingslocatie: http://net-base.nl/jilles/test/situatie2.jpg
Afbeeldingslocatie: http://net-base.nl/jilles/test/situatie3.jpg

En dan kan ik nu alleen nog op 15 drukken, welke dan ook verwijderd wordt. En dan kan ik niks meer. Mijn vraag is dus of jullie mij verder kunnen helpen aangezien dit 1 van de 3 vakken is die ik moet halen voor mijn P...

Alvast bedankt

*knip*

[ Voor 1% gewijzigd door Creepy op 04-06-2007 19:38 . Reden: code=java. Syntax highlighting FTW \0/ ]


  • soepah
  • Registratie: December 2006
  • Laatst online: 01-12 10:35
roep je de paint / repaint wel na elke verschuiving van de blokken aan? dit moet namelijk wel..
en opslaan wat je hebt gedaan in een array oid zodat je je programma ook weet wat je aan het doen bent

wie van vissen houdt, houdt niet van vissen


Verwijderd

Ik heb wat zitten hacken in je code,
is er niet echt mooier om geworden maar dit zou je opweg moeten helpen.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package PlaygroundMain;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class SchuifPuzzel extends JFrame implements ActionListener{
    private static final long serialVersionUID = 1L;

    //Aanmaken/Declareren
    static int numberOfColums= 6;
    static int numberOfRows = 4;
    
    public Container container; 
    public JPanel panel;
        
    //storage of buttons
    private JButton[][] buttons;   
    
    private Vak[][] vakjes;
    
    //position of empty vakje
    private int rowIndexEmpty;
    private int columnIndexEmpty;
    
    /**
     * Aanmaken SchuifPuzzel frame
     * */ 
    public SchuifPuzzel() {     
        this.setup();
    }   
    
    /**
     * 
     * */
    private void setup(){
        container = getContentPane();
        panel = new JPanel();
        
        //get space
        buttons = new JButton[numberOfColums][numberOfRows];
        vakjes = new Vak[numberOfColums][numberOfRows];
        
        //Layout bepalen
        container.add(panel);
        panel.setLayout(new GridLayout(numberOfRows,numberOfColums));

        //Knoppen toevoegen
        for(int row=0;row<numberOfRows;row++){
            for(int column=0;column<numberOfColums;column++){
                buttons[column][row] = new JButton();
                buttons[column][row].addActionListener(this);
                panel.add(buttons[column][row]);
                //store props of a vakje
                vakjes[column][row] = new Vak();
                vakjes[column][row].setBackgroundColor(Color.white);
                vakjes[column][row].setText(""+column+":"+row);
            }
        }
        //store postion and settings of 'empty' vakje
        vakjes[numberOfColums-1][numberOfRows-1].setEmpty(true);
        rowIndexEmpty=numberOfRows-1;
        columnIndexEmpty=numberOfColums-1;

        //load some background colors / pics for the 'vakjes' 
        this.loadGame();
        
        // update the buttons by settings from the 'vakjes'
        this.updateButtonsByVakjes();
        
        //some UI settings, start display the game
        this.setTitle("Schuifpuzzel");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize((numberOfColums*100), (numberOfRows*100));
        this.setVisible(true);
    }
   
    /**
     * Call back func. for the buttons
     * */
    public void actionPerformed(ActionEvent e) {
        boolean found = false;
        //Meegroeiende buttonlistener
        for(int i=0;i<numberOfRows && !found;i++){
            for(int j=0;j<numberOfColums &&!found;j++){
                if(e.getSource()==buttons[j][i]){
                    this.switchKnop(j,i);
                    found=true;
                }
            }
        }
    }
    
    /** Methode om knoppen te 'verplaatsen' **/ 
    public void switchKnop(int columnIndex,int rowIndex){   
        System.out.print("click !");
        
        //need to swap/can swap check
        if((Math.abs(columnIndex-columnIndexEmpty)==1 && Math.abs(rowIndex-rowIndexEmpty)==0)||
                Math.abs(columnIndex-columnIndexEmpty)==0 && Math.abs(rowIndex-rowIndexEmpty)==1        
        ){
            //swap the buttons
            //temp store
            Vak clicked = vakjes[columnIndex][rowIndex];
            // set clicked box as empty 'vakje'
            vakjes[columnIndex][rowIndex] = vakjes[columnIndexEmpty][rowIndexEmpty];
            vakjes[columnIndexEmpty][rowIndexEmpty] = clicked;
                
            //store new empty possition
            columnIndexEmpty=columnIndex;
            rowIndexEmpty=rowIndex;
                        
            this.updateButtonsByVakjes();
            
            // Test if the user solved the puzzle
            if(isComplete()){
                //TODO
            }
        }//else{nothing}
    }       

    /**
     * Called when the user solved the puzzle
     * */
    private boolean isComplete(){
        //TODO
        return false;
    }
    
    /**
     * Update the buttons by settings from the 'vakjes'
     * */
    private void updateButtonsByVakjes(){
        panel.removeAll();
        for(int row=0;row<numberOfRows;row++){
            for(int column=0;column<numberOfColums;column++){
                buttons[column][row].setBackground(vakjes[column][row].getBackgroundColor());
                buttons[column][row].setText(vakjes[column][row].getText());
                buttons[column][row].setVisible(!vakjes[column][row].isEmpty());
                panel.add(buttons[column][row]);
            }
        }
        panel.repaint();
    }
    
    /**
     * Some dummy values for now, load background colors, text, pics for the buttuns
     * */
    private void loadGame(){
        vakjes[0][0].setBackgroundColor(Color.red);
        vakjes[0][1].setText("Hello world");
    }
    
    /** Main method */
    public static void main(String[] args) {
        new SchuifPuzzel();
    }
}

en:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package PlaygroundMain;

import java.awt.Color;

/** Object met eigenschappen van een vakje **/
public class Vak{
    
    private boolean empty= false;
    private Color backgroundColor;
    private String text;
    
    //Opslaan locatie
    public Vak(){    
    }


    public Color getBackgroundColor() {
        return backgroundColor;
    }


    public void setBackgroundColor(Color backgroundColor) {
        this.backgroundColor = backgroundColor;
    }


    public boolean isEmpty() {
        return empty;
    }


    public void setEmpty(boolean empty) {
        this.empty = empty;
    }


    public String getText() {
        return text;
    }


    public void setText(String text) {
        this.text = text;
    }
}

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-11 15:10

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op maandag 04 juni 2007 @ 17:32:
Ik heb wat zitten hacken in je code,
is er niet echt mooier om geworden maar dit zou je opweg moeten helpen.
Ok. Dit is nu precies de reden dat we liever geen topics willen zien die een enorme lap code geven met daarbij min of meer de melding "fix het voor me". Het toont weinig tot geen eigen inzet en met dit soort oplossingen leer je er niks van omdat alle uitleg ontbreekt.

Ga gewoon zelf eens aan de slag met debuggen. Kijk daarna eens of je het probleem kan reprocuderen met minder code. Probeer voor een post hier je in elk geval te beperken tot de relevante code (en dus niet alle), dat alleen al geeft al aan dat je in elk geval weet waar je mee bezig bent.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Dit topic is gesloten.