22/10/12 21:14
beppe_ita
Salve a tutti sono nuovo!! siccome necessito del gioco Snake per un mio progetto ho cercato in internet del codice già scritto e alla fine ne ho trovato uno che più o meno capisco completamente!! l'unico problema è che non si riesce a far terminare la partita perchè il serpente quando sbatte contro la propria coda, invece di morire, la attraversa!! quindi in pratica il gioco è infinito! ho provato a sistemarlo da solo ma davvero non capisco cosa ci sia di sbagliato e per questo spero che qualcuno di voi mi possa aiutare! questo è il codice:
invece questo è il main:
import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; class Snake extends JFrame implements KeyListener, Runnable { /** * */ private static final long serialVersionUID = 1L; JPanel p1, p2; JButton[] lb = new JButton[200]; JButton bonusfood; JTextArea t; int x = 500, y = 250, gu = 2, directionx = 1, directiony = 0, speed = 50, difference = 0, oldx, oldy, score = 0; int[] lbx = new int[300]; int[] lby = new int[300]; Point[] lbp = new Point[300]; Point bfp = new Point(); Thread myt; boolean food = false, runl = false, runr = true, runu = true, rund = true, bonusflag = true; Random r = new Random(); JMenuBar mymbar; JMenu game, help, level; public void initializeValues() { gu = 3; lbx[0] = 100; lby[0] = 150; directionx = 10; directiony = 0; difference = 0; score = 0; food = false; runl = false; runr = true; runu = true; rund = true; bonusflag = true; } Snake() { super("Snake"); setSize(500, 330); //Create Menue bar with functions creatbar(); //initialize all variables initializeValues(); // Start of UI design p1 = new JPanel(); p2 = new JPanel(); // t will view the score t = new JTextArea("Score ==>" + score); t.setEnabled(false); t.setBackground(Color.BLACK); // snake have to eat bonousfood to growup bonusfood = new JButton(); bonusfood.setEnabled(false); // will make first snake createFirstSnake(); p1.setLayout(null); p2.setLayout(new GridLayout(0, 1)); p1.setBounds(0, 0, x, y); p1.setBackground(Color.blue); p2.setBounds(0, y, x, 30); p2.setBackground(Color.RED); p2.add(t); // will contain score board // end of UI design getContentPane().setLayout(null); getContentPane().add(p1); getContentPane().add(p2); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); addKeyListener(this); // start thread myt = new Thread(this); myt.start(); // go to run() method } public void createFirstSnake() { // Initially the snake has small length 3 for (int i = 0; i < 3; i++) { lb[i] = new JButton("lb" + i); lb[i].setEnabled(false); p1.add(lb[i]); lb[i].setBounds(lbx[i], lby[i], 10, 10); lbx[i + 1] = lbx[i] - 10; lby[i + 1] = lby[i]; } } public void creatbar() { mymbar = new JMenuBar(); game = new JMenu("Game"); JMenuItem newgame = new JMenuItem("New Game"); JMenuItem exit = new JMenuItem("Exit"); newgame.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { reset(); } }); exit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); game.add(newgame); game.addSeparator(); game.add(exit); mymbar.add(game); level = new JMenu("Level"); mymbar.add(level); help = new JMenu("Help"); JMenuItem creator = new JMenuItem("Creator"); JMenuItem instruction = new JMenuItem("Instraction"); creator.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(p2, "Chiara Moccia è il mio amore"); } }); help.add(creator); help.add(instruction); mymbar.add(help); setJMenuBar(mymbar); } @SuppressWarnings("deprecation") void reset() { initializeValues(); p1.removeAll(); myt.stop(); createFirstSnake(); t.setText("Score==>" + score); myt = new Thread(this); myt.start(); } void growup() { lb[gu] = new JButton(); lb[gu].setEnabled(false); p1.add(lb[gu]); int a = 10 + (10 * r.nextInt(48)); int b = 10 + (10 * r.nextInt(23)); lbx[gu] = a; lby[gu] = b; lb[gu].setBounds(a, b, 10, 10); gu++; } // this method contains the logic to move the snake. player will define the derection // this method just forward the snake to the right derection which deriction is pressed // by the player. void moveForward() { for (int i = 0; i < gu; i++) { lbp[i] = lb[i].getLocation(); } lbx[0] += directionx; lby[0] += directiony; lb[0].setBounds(lbx[0], lby[0], 10, 10); for (int i = 1; i < gu; i++) { lb[i].setLocation(lbp[i - 1]); } if (lbx[0] == x) { lbx[0] = 10; } else if (lbx[0] == 0) { lbx[0] = x - 10; } else if (lby[0] == y) { lby[0] = 10; } else if (lby[0] == 0) { lby[0] = y - 10; } if (lbx[0] == lbx[gu - 1] && lby[0] == lby[gu - 1]) { food = false; score += 5; t.setText("Score==>" + score); if (score % 50 == 0 && bonusflag == true) { p1.add(bonusfood); bonusfood.setBounds((10 * r.nextInt(50)), (10 * r.nextInt(25)), 15, 15); bfp = bonusfood.getLocation(); bonusflag = false; } } if (bonusflag == false) { if (bfp.x <= lbx[0] && bfp.y <= lby[0] && bfp.x + 10 >= lbx[0] && bfp.y + 10 >= lby[0]) { p1.remove(bonusfood); score += 100; t.setText("Score ==>" + score); bonusflag = true; } } if (food == false) { growup(); food = true; } else { lb[gu - 1].setBounds(lbx[gu - 1], lby[gu - 1], 10, 10); } for (int i = 1; i < gu; i++) { if (lbp[0] == lbp[i]) { t.setText("GAME OVER " + score); try { myt.join(); } catch (InterruptedException ie) { } break; } } p1.repaint(); setVisible(true); } public void keyPressed(KeyEvent e) { // snake move to left when player pressed left arrow if (runl == true && e.getKeyCode() == 37) { directionx = -10; // means snake move right to left by 10pixels directiony = 0; runr = false; // run right(runr) means snake cant move from left to right runu = true; // run up (runu) means snake can move from down to up rund = true; // run down (run down) means snake can move from up to down } // snake move to up when player pressed up arrow if (runu == true && e.getKeyCode() == 38) { directionx = 0; directiony = -10; // means snake move from down to up by 10 pixel rund = false; // run down (run down) means snake can move from up to down runr = true; // run right(runr) means snake can move from left to right runl = true; // run left (runl) means snake can move from right to left } // snake move to right when player pressed right arrow if (runr == true && e.getKeyCode() == 39) { directionx = +10; // means snake move from left to right by 10 pixel directiony = 0; runl = false; runu = true; rund = true; } // snake move to down when player pressed down arrow if (rund == true && e.getKeyCode() == 40) { directionx = 0; directiony = +10; // means snake move from left to right by 10 pixel runu = false; runr = true; runl = true; } } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } public void run() { for (;;) { // Move the snake move forword. In the start of the game snake move left to right, // if player press up, down, right or left arrow snake change its direction according to // pressed arrow moveForward(); try { Thread.sleep(speed); } catch (InterruptedException ie) { } } } }
invece questo è il main:
public class Main { public static void main(String[] args){ new Snake(); }}
aaa