GUI贪吃蛇
启动类StartGame
1 public class StartGame { 2 public static void main(String[] args) { 3 JFrame jFrame = new JFrame("给我吃"); 4 jFrame.setBounds(10,10,900,720); 5 jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 6 jFrame.setResizable(false);//窗口大小不可变 7 jFrame.setVisible(true); 8 jFrame.add(new GamePanel()); 9 } 10 }
数据类把贪吃蛇和界面的图片放进去
1 //贪吃蛇的图片 2 public class Data { 3 4 public static URL HeadUrl = Data.class.getResource("/statics/header.png"); 5 public static URL BodyUrl = Data.class.getResource("/statics/body.png"); 6 public static URL FoodUrl = Data.class.getResource("/statics/food.png"); 7 8 public static ImageIcon head = new ImageIcon(HeadUrl); 9 public static ImageIcon body = new ImageIcon(BodyUrl); 10 public static ImageIcon food = new ImageIcon(FoodUrl); 11 12 public static URL UpUrl = Data.class.getResource("/statics/up.png"); 13 public static URL DownUrl = Data.class.getResource("/statics/down.png"); 14 public static URL RightUrl = Data.class.getResource("/statics/right.png"); 15 public static URL LeftUrl = Data.class.getResource("/statics/left.png"); 16 17 public static ImageIcon up = new ImageIcon(UpUrl); 18 public static ImageIcon down = new ImageIcon(DownUrl); 19 public static ImageIcon right = new ImageIcon(RightUrl); 20 public static ImageIcon left = new ImageIcon(LeftUrl); 21 22 }
画板类
public class GamePanel extends JPanel implements KeyListener, ActionListener { //蛇的长度和坐标 int length; int[] snakeX = new int[600]; int[] snakeY = new int[500]; String fx ; boolean isStart = false;//游戏状态 boolean isFail = false;//失败状态 int foodX; int foodY; Timer timer = new Timer(100, this); Random random = new Random(); public GamePanel() { init(); this.setFocusable(true); this.addKeyListener(this); } public void init() { length = 3; fx="right"; snakeX[0] = 100; snakeY[0] = 100; snakeX[1] = 75; snakeY[1] = 100; snakeX[2] = 50; snakeY[2] = 100; foodX = 25 + 25 * random.nextInt(34); foodY = 75 + 25 * random.nextInt(22); } //游戏面板 @Override protected void paintComponent(Graphics g) { super.paintComponent(g); this.setBackground(Color.WHITE); Data.head.paintIcon(this, g, 25, 11);//顶部图片 g.fillRect(25, 75, 850, 600); //蛇头方向 switch (fx) { case "right": Data.right.paintIcon(this, g, snakeX[0], snakeY[0]); break; case "left": Data.left.paintIcon(this, g, snakeX[0], snakeY[0]); break; case "up": Data.up.paintIcon(this, g, snakeX[0], snakeY[0]); break; case "down": Data.down.paintIcon(this, g, snakeX[0], snakeY[0]); break; } //身体图片 for (int i = 1; i < length; i++) { Data.body.paintIcon(this, g, snakeX[i], snakeY[i]); } //开始提示 if (isStart == false) { g.setColor(Color.WHITE); g.setFont(new Font("微软雅黑", Font.BOLD, 40)); g.drawString("按下空格开始游戏", 300, 300); timer.start(); } //失败提示 if (isFail == true) { g.setColor(Color.red); g.setFont(new Font("微软雅黑", Font.BOLD, 40)); g.drawString("游戏失败,请重新开始", 300, 300); } //食物图片 Data.food.paintIcon(this, g, foodX, foodY); } //键盘监听事件 @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode();//获取键盘按键 if (keyCode == KeyEvent.VK_SPACE) { //判断失败后重新载入 if (isFail){ isFail=false; init(); }else { isStart = !isStart;//没失败暂停 } repaint();//刷新画面 } //按键改变方向 if (keyCode == KeyEvent.VK_LEFT) { if (!fx.equals("right")) { fx = "left"; } } else if (keyCode == KeyEvent.VK_RIGHT) { if (!fx.equals("left")) { fx = "right"; } } else if (keyCode == KeyEvent.VK_UP) { if (!fx.equals("down")) { fx = "up"; } } else if (keyCode == KeyEvent.VK_DOWN) { if (!fx.equals("up")) { fx = "down"; } } } @Override public void keyTyped(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { } //事件监听 @Override public void actionPerformed(ActionEvent e) { if (isStart && isFail==false) { //吃食物 if (foodX == snakeX[0] && foodY == snakeY[0]) { length++; foodX = 25 + 25 * random.nextInt(34); foodY = 75 + 25 * random.nextInt(22); } //身体向前移动 for (int i = length - 1; i > 0; i--) { snakeX[i] = snakeX[i - 1]; snakeY[i] = snakeY[i - 1]; } switch (fx) { case "up": snakeY[0] = snakeY[0] - 25; if (snakeY[0] ==75) { isFail=true; } break; case "down": snakeY[0] = snakeY[0] + 25; if (snakeY[0] == 650) { isFail=true; } break; case "right": snakeX[0] = snakeX[0] + 25; if (snakeX[0] == 850) { isFail=true; } break; case "left": snakeX[0] = snakeX[0] - 25; if (snakeX[0] ==25) { isFail=true; } break; } //失败判定 for (int i = 1; i < length; i++) { if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) { isFail = true; } } repaint(); } timer.start(); } }

浙公网安备 33010602011771号