Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    278

    Creare un puzzle game con Java

    Ciao a tutti, premesso che ho sufficienti conoscenze di Java, avrei bisogno di qualche informazione.

    Vorrei creare un puzzle game in Java tipo questo che pero' è sviluppato in Jquery:

    http://demo.web3designs.com/creating...th-jquery.html

    Lato Java la mia difficolta è gestire lo spostamento delle caselle,quali classi e metodi devono essere utilizzati?

    Grazie per l'aiuto

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2014
    Messaggi
    10
    Quote Originariamente inviata da Chiara88d Visualizza il messaggio
    Ciao a tutti, premesso che ho sufficienti conoscenze di Java, avrei bisogno di qualche informazione.

    Vorrei creare un puzzle game in Java tipo questo che pero' è sviluppato in Jquery:

    http://demo.web3designs.com/creating...th-jquery.html

    Lato Java la mia difficolta è gestire lo spostamento delle caselle,quali classi e metodi devono essere utilizzati?

    Grazie per l'aiuto

    Ciao, questo è funzionante al 100%... Metti i 3 file nella stessa cartella, compilali e esegui Main.java.
    Usalo per dare un occhiata alle classi e capire come funziona il tutto.

    codice:
    public class Case {
    
    
        public static final int EMPTY = 1;
        public static final int FULL = 2;
        public static final int BORDER = 3;
    
    
        private int id;
        private int state;
    
    
        public Case(int id) {
            this.id = id;
        }
    
    
        public void setId(int i) {
            this.id = i;
        }
    
    
        public void setState(int state) {
            this.state = state;
        }
    
    
        public int getState() {
            return this.state;
        }
    
    
        public int getId() {
            return this.id;
        }
    
    
    }
    codice:
    public class Grid {
        int lignes;
        int colones;
        Case[][] cases;
    
    
        public Grid(int l, int c) {
            lignes = l;
            colones = c;
            cases = new Case[l + 2][c + 2];
            for (int i = 0, k = 1; i < lignes + 2; i++) {
                for (int j = 0; j < colones + 2; j++) {
                    cases[i][j] = new Case(k);
                    cases[i][j].setState(Case.FULL);
                    if (i == 0 || j == 0 || i == lignes + 1 || j == colones + 1) {
                        cases[i][j].setState(Case.BORDER);
                        cases[i][j].setId(-1);
                    } else {
                        k++;
                    }
                }
            }
            cases[lignes][colones].setState(Case.EMPTY);
            start();
        }
    
    
        public void start() {
            int n = 1;
            while (n < 1000) {
                randomize();
                n++;
            }
    
    
        }
    
    
        public Case getCase(int i, int j) {
            return cases[i + 1][j + 1];
        }
    
    
        private void randomize() {
            Case[] m = movables();
            int c = 0;
            for (int i = 0; i < 4; i++) {
                if (m[i] != null) {
                    c++;
                }
            }
            int r = (int) (Math.random() * c + 1);
            int[] t = getCorFromId(m[r - 1].getId());
            move(t[0], t[1], false);
        }
    
    
        public boolean userMove(int i, int j) {
            return move(i, j, true);
        }
    
    
        private boolean move(int i, int j, boolean user) {
            int id = isMovable(i - 1, j - 1);
            if (id > 0) {
                int[] t = getCorFromId(id);
                Case tmp;
                tmp = cases[i][j];
                cases[i][j] = cases[t[0]][t[1]];
                cases[t[0]][t[1]] = tmp;
            }
            if (user) {
                return hasWin();
            }
            return false;
        }
    
    
        private boolean hasWin() {
            for (int i = 0, k = 1; i < lignes + 2; i++) {
                for (int j = 0; j < colones + 2; j++) {
                    if (i == 0 || j == 0 || i == lignes + 1 || j == colones + 1) {
                        cases[i][j].setState(Case.BORDER);
                    } else {
                        if (cases[i][j].getId() != k) {
                            return false;
                        }
                        k++;
                    }
                }
            }
            return true;
        }
    
    
        private int[] getCorFromId(int id) {
            for (int i = 0; i < lignes + 2; i++) {
                for (int j = 0; j < colones + 2; j++) {
                    if (cases[i][j].getId() == id) {
                        int[] t = new int[2];
                        t[0] = i;
                        t[1] = j;
                        return t;
                    }
                }
            }
            return null;
        }
    
    
        private Case[] movables() {
            Case[] m = new Case[4];
            for (int i = 0, c = 0; i < lignes; i++) {
                for (int j = 0; j < colones; j++) {
                    if (isMovable(i, j) > 0) {
                        m[c] = cases[i + 1][j + 1];
                        c++;
                    }
                }
            }
            return m;
        }
    
    
        private int isMovable(int i, int j) {
            i++;
            j++;
            if (cases[i][j].getState() == Case.FULL) {
                if (cases[i + 1][j].getState() == Case.EMPTY) {
                    return cases[i + 1][j].getId();
                }
                if (cases[i - 1][j].getState() == Case.EMPTY) {
                    return cases[i - 1][j].getId();
                }
                if (cases[i][j - 1].getState() == Case.EMPTY) {
                    return cases[i][j - 1].getId();
                }
                if (cases[i][j + 1].getState() == Case.EMPTY) {
                    return cases[i][j + 1].getId();
                }
            }
            return 0;
        }
    
    
        public void show() {
            for (int i = 0; i < lignes + 2; i++) {
                for (int j = 0; j < colones + 2; j++) {
                    if (cases[i][j].getState() != Case.BORDER) {
                        System.out.printf("%3d : %3d | ", cases[i][j].getId(),
                                cases[i][j].getState());
                    }
                }
                System.out.println("");
            }
        }
    
    
    }
    codice:
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    
    import javax.swing.*;
    
    
    
    
    public class Main extends JFrame implements ActionListener {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private JButton[][] cases; //This is a comment
        private JPanel panel = new JPanel();
        private int l, c;
        Grid g;
    
    
        public Main() {
            l = 3;
            c = 3;
            cases = new JButton[l][c];
            g = new Grid(l, c);
            g.start();
            for (int i = 0; i < l; i++) {
                for (int j = 0; j < c; j++) {
                    cases[i][j] = new JButton(String.valueOf(g.getCase(i, j)
                            .getId()));
                    if (g.getCase(i, j).getState() == Case.EMPTY) {
                        cases[i][j].setText("");
                    }
                    panel.add(cases[i][j]);
                    cases[i][j].addActionListener(this);
                }
            }
            panel.setLayout(new GridLayout(l, c));
            this.setContentPane(panel);
            this.setVisible(true);
            this.setSize(400, 400);
            this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        }
    
    
        public static void main(String args[]) {
            Main m = new Main();
        }
    
    
        @Override
        public void actionPerformed(ActionEvent e) {
            for (int i = 0; i < l; i++) {
                for (int j = 0; j < c; j++) {
                    if (e.getSource() == cases[i][j]) {
                        if (g.userMove(i + 1, j + 1)) {
                            System.out.println("Won");
                        }
                        for (int m = 0; m < l; m++) {
                            for (int n = 0; n < c; n++) {
                                cases[m][n].setText(String.valueOf(g.getCase(m, n)
                                        .getId()));
                                if (g.getCase(m, n).getState() == Case.EMPTY) {
                                    cases[m][n].setText("");
                                }
                            }
                        }
                    }
                }
            }
    
    
        }
    }

  3. #3
    Non riesco ad entrare nell'ottica del fatto che si somma + 2 alle dimensioni della matrice. Io ero partito facendo + 1 (i bordi) e mi sembrava la cosa più naturale, incappando in errori logici. Se si potesse avere una spiegazione sarebbe grandioso..

  4. #4
    No ok ho capito, per i bordi bisogna sommare + 2. Con + 1 mi trovavo bordi solo a destra e sotto. Comunque ho riscritto una mia versione della classe Griglia, anche se per ora non controlla un eventuale vittoria.

    codice:
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Random;
    
    
    public class Griglia {
    
    
    	private int righe;
    	private int colonne;
    	private Casella[][] caselle;
    	private Random random = new Random();
    	
    	//direzioni possibili
    	private boolean right = false;
    	private boolean left = false;
    	private boolean up = false;
    	private boolean down = false;
    	
    	public Griglia(int righe, int colonne) {
    		this.righe = righe;
    		this.colonne = colonne;
    		caselle = new Casella[righe + 2][colonne + 2];
    		//Inizializza la griglia
    		riempi();
    	}
    	
    	private void riempi() {
    		for(int i = 0, k = 1; i < righe + 2; i++) {
    			for(int j = 0; j < colonne + 2; j++) {
    				//Bordi
    				if(i == 0 || j == 0 || i == righe + 1 || j == colonne + 1) {
    					caselle[i][j] = new Casella(-1);
    					caselle[i][j].setType(Casella.BORDER);
    				}
    				//Caselle centrali
    				else {
    					caselle[i][j] = new Casella(k);
    					caselle[i][j].setType(Casella.FULL);
    					k++;
    				}
    			}
    		}
    		//Mischia i valori delle caselle
    		shuffle();
    		//Sceglie una cella vuota random
    		chooseRandomEmptyCell();
    	}
    	
    	private void shuffle() {
    		
    		int[] valori = new int[righe * colonne];
    		
    		for(int i = 0, k = 0; i < righe + 2; i++) {
    			for(int j = 0; j < colonne + 2; j++) {
    				if(caselle[i][j].getType() == Casella.FULL) {
    					valori[k] = caselle[i][j].getValue();
    					k++;
    				}
    			}
    		}
    		
    		ArrayList<Integer> list = new ArrayList<Integer>();
    		
    		for(int i = 0; i < valori.length; i++) {
    			list.add(valori[i]);
    		}
    		
    		Collections.shuffle(list);
    		
    		for(int i = 0, k = 0; i < righe + 2; i++) {
    			for(int j = 0; j < colonne + 2; j++) {
    				if(caselle[i][j].getType() == Casella.FULL) {
    					caselle[i][j].setValue(list.get(k));
    					k++;
    				}
    			}
    		}	
    	}
    	
    	private void chooseRandomEmptyCell() {
    		int i = 1 + (int)(Math.random() * righe - 1);
    		int j = 1 + (int)(Math.random() * righe - 1);
    		caselle[i][j].setType(Casella.EMPTY);
    	}
    	
    	//ritorna la casella in posizione riga+1, colonna+1
    	public Casella getCasella(int riga, int colonna) {
    		return caselle[riga + 1][colonna + 1];
    	}
    	
    	//muove la casella nell'unica direzione possibile (se possibile)
    	public void move(int riga, int colonna) {
    		
    		riga++;
    		colonna++;
    		
    		int newValue = direction(riga,colonna);
    		
    		if(newValue == 0) {
    			System.out.println("Casella non spostabile");
    		}
    		else {
    			
    			int actualValue = caselle[riga][colonna].getValue();
    			caselle[riga][colonna].setType(Casella.EMPTY);
    			caselle[riga][colonna].setValue(newValue);
    			
    			if(up) {				
    				caselle[riga - 1][colonna].setValue(actualValue);
    				caselle[riga - 1][colonna].setType(Casella.FULL);
    			}
    			if(down) {
    				caselle[riga + 1][colonna].setValue(actualValue);
    				caselle[riga + 1][colonna].setType(Casella.FULL);
    			}
    			if(left) {
    				caselle[riga][colonna - 1].setValue(actualValue);
    				caselle[riga][colonna - 1].setType(Casella.FULL);
    			}
    			if(right) {
    				caselle[riga][colonna + 1].setValue(actualValue);
    				caselle[riga][colonna + 1].setType(Casella.FULL);
    			}
    		}
    	}
    	
    	private int direction(int riga, int colonna) {
    		if(caselle[riga][colonna].getType() == Casella.FULL) { //Lo spostamento deve avvenire solo se si clicca su una casella piena
    			if(caselle[riga + 1][colonna].getType() == Casella.EMPTY) {
    				down = true;
    				up = false;
    				left = false;
    				right = false;
    				return caselle[riga + 1][colonna].getValue();
    			}
    			if(caselle[riga - 1][colonna].getType() == Casella.EMPTY) {
    				up = true;
    				down = false;
    				left = false;
    				right = false;
    				return caselle[riga - 1][colonna].getValue();
    			}
    			if(caselle[riga][colonna + 1].getType() == Casella.EMPTY) {
    				right = true;
    				left = false;
    				up = false;
    				down = false;
    				return caselle[riga][colonna + 1].getValue();
    			}
    			if(caselle[riga][colonna - 1].getType() == Casella.EMPTY) {
    				left = true;
    				right = false;
    				up = false;
    				down = false;
    				return caselle[riga][colonna - 1].getValue();
    			}
    		}
    		return 0; //casella non spostabile
    	}
    }

  5. #5
    Errore: in shuffle() l'array valori deve avere dimensione righe * colonne - 1

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.