贪吃蛇游戏区越界问题
刚学试着写了个贪吃蛇,游戏区是在个面板上装载了很多按钮,求解越界问题!
帮忙看看代码,谢谢
package game;import java.awt.BorderLayout;import java.awt.Button;import java.awt.Color;import java.awt.Component;import java.awt.FlowLayout;import java.awt.Graphics;import java.awt.GridLayout;import java.awt.Insets;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.Iterator;import java.util.LinkedList;import javax.swing.*;import javax.swing.border.Border;public class MFrame extends JFrame implements ActionListener, KeyListener, Runnable { private static final int UP=1; private static final int DOWN=2; private static final int LEFT=3; private static final int RIGHT=4; private static final int ROWS=30; private static final int COLS=40; int score =0,speed =500; boolean ispause = false,isend = false; JButton startGame,stopGame; JButton [][] PA = new JButton[ROWS][COLS]; JLabel jl1,jl2; int direction = RIGHT,lastdirection = RIGHT; int x = 0,y = 0; LinkedList<snakeact> list = new LinkedList<snakeact>(); public MFrame() { setTitle("~贪吃蛇~"); setBounds(200, 200, 435, 390); setVisible(true); startGame = new JButton("开始"); stopGame = new JButton("暂停"); jl2 = new JLabel("分数 : 0 "); jl1 = new JLabel("等级 : 0 "); GridLayout grid = new GridLayout(ROWS,COLS); JPanel jPanel=new JPanel(grid); for(int i=0;i<ROWS;i++) for(int j=0;j<COLS;j++) { PA[i][j] = new JButton(); PA[i][j].setBackground(Color.lightGray); PA[i][j].setSize(10, 10); PA[i][j].setVisible(false); jPanel.add(PA[i][j]); } Border border = BorderFactory.createBevelBorder(0, Color.black, Color.black); jPanel.setBorder(border); startGame.addActionListener(this); stopGame.addActionListener(this); addKeyListener(this); JPanel jPanel2 = new JPanel(new FlowLayout(FlowLayout.LEFT)); jPanel2.add(startGame); jPanel2.add(stopGame); jPanel2.add(jl2); jPanel2.add(jl1); getContentPane().add(jPanel2,BorderLayout.NORTH); getContentPane().add(jPanel,BorderLayout.CENTER); validate(); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); } @Override public void keyTyped(KeyEvent e) {} @Override public void keyPressed(KeyEvent e) { int x = list.getFirst().getX(); int y = list.getFirst().getY(); if(!isend&&!ispause){ if(e.getKeyCode() == KeyEvent.VK_UP){ direction = UP; } if(e.getKeyCode() == KeyEvent.VK_DOWN){ direction = DOWN; } if(e.getKeyCode() == KeyEvent.VK_LEFT){ direction = LEFT; } if(e.getKeyCode() == KeyEvent.VK_RIGHT){ direction = RIGHT; } move(); } } public void move() { int x = list.getFirst().getX(); int y = list.getFirst().getY(); switch (direction) { case UP:{ if(lastdirection == DOWN) x = x+1; else { x = x-1; lastdirection = UP; } break; } case DOWN:{ if(lastdirection == UP) x = x-1; else { x = x+1; lastdirection = DOWN; } break; } case LEFT:{ if(lastdirection == RIGHT) y = y+1; else { y = y-1; lastdirection = LEFT; } break; } case RIGHT:{ if(lastdirection == LEFT) y = y-1; else { y = y+1; lastdirection = RIGHT; } break; } default: break; } if (x>=0||x<ROWS||y>=0||y<COLS) { snakeact temp = new snakeact(); temp.setX(x); temp.setY(y); list.addFirst(temp); PA[x][y].setVisible(true); PA[list.getLast().getX()][list.getLast().getY()].setVisible(false); list.removeLast(); } } @Override public void keyReleased(KeyEvent e) {} @Override public void actionPerformed(ActionEvent e) { if(e.getSource() == startGame){ start(); } if(e.getSource() == stopGame ){ stop(); } } public void start(){ for(int i=0;i<ROWS;i++) for(int j=0;j<COLS;j++) { PA[i][j].setBackground(Color.lightGray); PA[i][j].setVisible(false); } startGame.setEnabled(true); for (int i = 0; i < 3; i++) { snakeact tempSnakeact = new snakeact(); tempSnakeact.setX(9); tempSnakeact.setY(10-i); list.add(tempSnakeact); } Iterator<snakeact> iter = list.iterator(); while(iter.hasNext()){ snakeact te = iter.next(); PA[te.getX()][te.getY()].setVisible(true); } x = (int) (Math.random() * ROWS); y = (int) (Math.random() * COLS); while(PA[x][y].isVisible()){ x = (int) (Math.random() * ROWS); y = (int) (Math.random() * COLS); } PA[x][y].setBackground(Color.yellow); PA[x][y].setVisible(true); requestFocus(); Thread nThread = new Thread(this); nThread.start(); } public void stop(){ if(ispause){ ispause = false; stopGame.setText("暂停"); } else { ispause = true; stopGame.setText("继续"); } requestFocus(); } /** * @param args */ public static void main(String[] args) { new MFrame(); } @Override public void run() { while (!isend&&!ispause) { move(); } try { Thread.sleep(speed); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}package game;public class snakeact { private int x; private int y; public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; }}