java swing sokoban

0

witam, zrobiłem grę sokoban w javie. chciałem prosić o uwagi i porady odnośnie kodu. gra składa się z klas, ogólnie wszystko działa ale brakuje kilku warunków podczas poruszania, gra jest oparta o tablice dwu wymiarową. pozdrawiam i wstawiam kod dla potomnych ;)

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaswingsokoban;

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 *
 * @author marcin kaszuba
 */
public class ClassBoard extends JPanel{
    
    private ClassMove classMove = new ClassMove(this);
    private int sizeSquare = 40;
    private int positionX = 50;
    private int positionY = 50;
    //0 - mur czarny
    //1 - puste pole bialy
    //2 - pudelko zielony
    //3 - ludzik czerwony
    //4 - pole końcowe
    static int[][] plansza = {
        {0,0,0,0,0,0,0,0,0,0,0,0,1,1},
        {0,4,4,1,3,0,1,1,1,1,1,0,0,0},
        {0,4,4,1,1,0,1,2,1,1,2,1,1,0},
        {0,4,4,1,1,0,2,0,0,0,0,1,1,0},
        {0,4,4,1,1,1,1,1,1,0,0,1,1,0},
        {0,4,4,1,1,0,1,0,1,1,2,1,0,0},
        {0,0,0,0,0,0,1,0,0,2,1,2,1,0},
        {1,1,0,1,2,1,1,2,1,2,1,2,1,0},
        {1,1,0,1,1,1,1,0,1,1,1,1,1,0},
        {1,1,0,0,0,0,0,0,0,0,0,0,0,0}
    };

    public ClassBoard() {
        this.setFocusable(true);
        addKeyListener(classMove);
    }
    
    @Override
    public void paint(Graphics graphics){
        drawBoard(graphics);
    }
    
    void drawBoard(Graphics graphics){
        super.paint(graphics);
        for(int i = 0; i < plansza.length; ++i){
            for(int j = 0; j < plansza[0].length; ++j){
                if(plansza[i][j] == 0){
                    graphics.setColor(Color.BLACK);
                    graphics.fillRect((sizeSquare * j) + positionX, (sizeSquare * i) + positionY, sizeSquare, sizeSquare);
                } else if(plansza[i][j] == 1){
                    graphics.setColor(Color.WHITE);
                    graphics.fillRect((sizeSquare * j) + positionX, (sizeSquare * i) + positionY, sizeSquare, sizeSquare);
                } else if(plansza[i][j] == 2){
                    graphics.setColor(Color.GREEN);
                    graphics.fillRect((sizeSquare * j) + positionX, (sizeSquare * i) + positionY, sizeSquare, sizeSquare);
                } else if(plansza[i][j] == 3){
                    graphics.setColor(Color.RED);
                    graphics.fillRoundRect((sizeSquare * j) + positionX, (sizeSquare * i) + positionY, sizeSquare, sizeSquare, 360, 360);                  
                } else if(plansza[i][j] == 4){
                    graphics.setColor(Color.blue);
                    graphics.fillRoundRect((sizeSquare * j) + positionX, (sizeSquare * i) + positionY, sizeSquare, sizeSquare, 0, 0);                    
                }
            }
        }
    }
    
    static void checkingFinish(){
        if((plansza[1][1] == 2) && (plansza[1][2] == 2) && (plansza[2][1] == 2) && (plansza[2][2] == 2 &&
                (plansza[3][1] == 2) && (plansza[3][2] == 2)) && (plansza[4][1] == 2) && (plansza[4][2] == 2) &&
                (plansza[5][1] == 2) && (plansza[5][2] == 2)){
            JOptionPane.showMessageDialog(null, "wygrana", "wygrales !!!!", JOptionPane.INFORMATION_MESSAGE);
        }
    }
    
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaswingsokoban;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

/**
 *
 * @author marcin kaszuba
 */
public class ClassMove implements KeyListener{
    
    private ClassBoard classBoard;
    private int x = 1;
    private int y = 4;
    
    public ClassMove(ClassBoard classBoard) {
        this.classBoard = classBoard;
    }
    
    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent keyEvent) {
        switch(keyEvent.getKeyCode()){
            case KeyEvent.VK_UP:
                System.out.println("wcisles up");
                if((ClassBoard.plansza[x - 1][y] == 2) && (ClassBoard.plansza[x - 2][y] == 4)){
                    ClassBoard.plansza[x - 2][y] = 2;
                    ClassBoard.plansza[x - 1][y] = 3;
                    ClassBoard.plansza[x][y] = 4;
                    x--;
                } else if(ClassBoard.plansza[x - 1][y] == 1){
                    ClassBoard.plansza[x - 1][y] = 3;
                    ClassBoard.plansza[x][y] = 1;
                    x--;
                } else if((ClassBoard.plansza[x - 1][y] == 2) && (ClassBoard.plansza[x - 2][y] == 1)){
                    ClassBoard.plansza[x - 2][y] = 2;
                    ClassBoard.plansza[x - 1][y] = 3;
                    ClassBoard.plansza[x][y] = 1;
                    x--;
                } else if(ClassBoard.plansza[x - 1][y] == 4){
                    ClassBoard.plansza[x - 1][y] = 3;
                    ClassBoard.plansza[x][y] = 4;
                    x--;
                }
                break;
            case KeyEvent.VK_DOWN:
                System.out.println("wcisles down");
                if((ClassBoard.plansza[x + 1][y] == 2) && (ClassBoard.plansza[x + 2][y] == 4)){
                    ClassBoard.plansza[x + 2][y] = 2;
                    ClassBoard.plansza[x + 1][y] = 3;
                    ClassBoard.plansza[x][y] = 4;
                    x++;
                } else if((ClassBoard.plansza[x + 1][y] == 2) && (ClassBoard.plansza[x + 2][y] == 1)){
                    ClassBoard.plansza[x + 2][y] = 2;
                    ClassBoard.plansza[x + 1][y] = 3;
                    ClassBoard.plansza[x][y] = 1;
                    x++;
                } else if(ClassBoard.plansza[x + 1][y] == 1){
                    ClassBoard.plansza[x + 1][y] = 3;
                    ClassBoard.plansza[x][y] = 1;
                    x++;
                } else if(ClassBoard.plansza[x + 1][y] == 4){
                    ClassBoard.plansza[x + 1][y] = 3;
                    ClassBoard.plansza[x][y] = 4;
                    x++;
                }
                break;
            case KeyEvent.VK_LEFT:
                System.out.println("wcisles left");
                if((ClassBoard.plansza[x][y - 1] == 4) && (ClassBoard.plansza[x][y - 2] == 2)){
                    ClassBoard.plansza[x][y - 2] = 2;
                    ClassBoard.plansza[x][y - 1] = 3;
                    ClassBoard.plansza[x][y] = 1;
                    y--;
                } else if((ClassBoard.plansza[x][y - 1] == 2) && (ClassBoard.plansza[x][y - 2] == 4)){
                    ClassBoard.plansza[x][y - 2] = 2;
                    ClassBoard.plansza[x][y - 1] = 3;
                    ClassBoard.plansza[x][y] = 1;
                    y--;
                } else if((ClassBoard.plansza[x][y - 1] == 2) && (ClassBoard.plansza[x][y - 2] == 1)){
                    ClassBoard.plansza[x][y - 2] = 2;
                    ClassBoard.plansza[x][y - 1] = 3;
                    ClassBoard.plansza[x][y] = 1;
                    y--;
                } else if((ClassBoard.plansza[x][y - 1] == 4) && (ClassBoard.plansza[x][y - 2] == 4)){
                    ClassBoard.plansza[x][y - 1] = 3;
                    ClassBoard.plansza[x][y] = 1;
                    y--;
                } else if(ClassBoard.plansza[x][y - 1] == 4){
                    ClassBoard.plansza[x][y - 1] = 3;
                    ClassBoard.plansza[x][y] = 4;
                    y--;
                } else if(ClassBoard.plansza[x][y - 1] == 1){
                    ClassBoard.plansza[x][y - 1] = 3;
                    ClassBoard.plansza[x][y] = 1;
                    y--;
                }
                break;
            case KeyEvent.VK_RIGHT:
                System.out.println("wcisles right");
                if((ClassBoard.plansza[x][y - 1] == 2) && (ClassBoard.plansza[x][y - 2] == 0) && (ClassBoard.plansza[x - 1][y] == 2) && (ClassBoard.plansza[x - 1][y - 1] == 1)){
                    ClassBoard.plansza[x][y + 1] = 3;
                    ClassBoard.plansza[x][y] = 1;
                    y++;
                } else if((ClassBoard.plansza[x][y - 1] == 2) && (ClassBoard.plansza[x][y - 2] == 0) && (ClassBoard.plansza[x - 1][y] == 1)){
                    ClassBoard.plansza[x][y + 1] = 3;
                    ClassBoard.plansza[x][y] = 1;
                    y++;
                } else if((ClassBoard.plansza[x][y - 1] == 4) && (ClassBoard.plansza[x][y - 2] == 0)){
                    ClassBoard.plansza[x][y + 1] = 3;
                    ClassBoard.plansza[x][y] = 4;
                    y++;
                } else if((ClassBoard.plansza[x][y - 1] == 4) && (ClassBoard.plansza[x][y + 1] == 1)){
                    ClassBoard.plansza[x][y + 1] = 3;
                    ClassBoard.plansza[x][y] = 1;
                    y++;
                } else if((ClassBoard.plansza[x][y - 1] == 4) && (ClassBoard.plansza[x][y - 2] == 3)){
                    ClassBoard.plansza[x][y + 1] = 3;
                    ClassBoard.plansza[x][y] = 1;
                    y++;
                } else if((ClassBoard.plansza[x][y - 1] == 2) && (ClassBoard.plansza[x][y - 2] == 0)){
                    ClassBoard.plansza[x][y + 1] = 3;
                    ClassBoard.plansza[x][y] = 4;
                    y++;
                } else if((ClassBoard.plansza[x][y - 1] == 0) && (ClassBoard.plansza[x][y + 1] == 4)){
                    ClassBoard.plansza[x][y + 1] = 3;
                    ClassBoard.plansza[x][y] = 4;
                    y++;
                } else if((ClassBoard.plansza[x][y - 1] == 4) && (ClassBoard.plansza[x][y - 2] == 4)){
                    ClassBoard.plansza[x][y + 1] = 3;
                    ClassBoard.plansza[x][y] = 1;
                    y++;
                } else if((ClassBoard.plansza[x][y + 1] == 2) && (ClassBoard.plansza[x][y + 2] == 1)){
                    ClassBoard.plansza[x][y + 2] = 2;
                    ClassBoard.plansza[x][y + 1] = 3;
                    ClassBoard.plansza[x][y] = 1;
                    y++;
                } else if(ClassBoard.plansza[x][y + 1] == 1){
                    ClassBoard.plansza[x][y + 1] = 3;
                    ClassBoard.plansza[x][y] = 1;
                    y++;
                }
                break; 
        }
        classBoard.repaint();
        ClassBoard.checkingFinish();
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaswingsokoban;

import java.awt.Dimension;
import java.awt.Point;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

/**
 *
 * @author marcin kaszuba
 */
public class JavaSwingSokoban{

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame jFrame = new JFrame();
                int widthWindow = 660;
                int heightWindow = 500;
                jFrame.setTitle("sokoban !!!!");
                jFrame.setLocation(new Point(100, 100));
                jFrame.setSize(new Dimension(widthWindow, heightWindow));
                jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                jFrame.setResizable(false);
                jFrame.setVisible(true);
                ClassBoard classBoard = new ClassBoard();
                jFrame.add(classBoard);
            }
            
        });
    }
}
 
0

Klasycznie:

  1. Za dużo copy-paste
  2. Za dużo magic-numberów (co to jest 0,1,2,3 na planszy? Nie dalo się enuma?)
  3. Za dużo drabinkowych ifów.
  4. Wyobraź sobie że chcesz napisać tą grę dla dowolnego rozmiaru planszy. Załóż że rozmiar podaje user na starcie programu. Spróbuj to napisać tak zeby działało uniwersalnie niezależnie od podanego rozmiaru.
0

w jakim sensie za dużo kopiuj wklej, kod jest mój, jakiś czas temu pisałem na forum odnośnie tego programu ale dopiero teraz dokończyłem?? jeżeli chodzi o zawartość tablicy to jest wstawiony komentarz. z tymi ifami się zgodzę, ma ktoś pomysł jak rozwiązać aby dla każdej tablicy działało??

0

copy-paste oznacza że masz całe połacie kodu które są identyczne. Jak masz dwa fragmenty kodu które są takie same (ewentualnie z dokładnością do parametrów) to się wydziela nowe metody a nie kopiuje kod...

1 użytkowników online, w tym zalogowanych: 0, gości: 1