GUI贪吃蛇
启动类
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 }
画板类panel
1 public class GamePanel extends JPanel implements KeyListener, ActionListener { 2 //蛇的长度和坐标 3 int length; 4 int[] snakeX = new int[600]; 5 int[] snakeY = new int[500]; 6 String fx ; 7 8 boolean isStart = false;//游戏状态 9 boolean isFail = false;//失败状态 10 11 int foodX; 12 int foodY; 13 14 Timer timer = new Timer(100, this); 15 Random random = new Random(); 16 17 public GamePanel() { 18 init(); 19 this.setFocusable(true); 20 this.addKeyListener(this); 21 22 23 } 24 25 public void init() { 26 length = 3; 27 fx="right"; 28 snakeX[0] = 100; 29 snakeY[0] = 100; 30 snakeX[1] = 75; 31 snakeY[1] = 100; 32 snakeX[2] = 50; 33 snakeY[2] = 100; 34 foodX = 25 + 25 * random.nextInt(34); 35 foodY = 75 + 25 * random.nextInt(22); 36 37 } 38 39 //游戏面板 40 @Override 41 protected void paintComponent(Graphics g) { 42 43 super.paintComponent(g); 44 this.setBackground(Color.WHITE); 45 46 Data.head.paintIcon(this, g, 25, 11);//顶部图片 47 g.fillRect(25, 75, 850, 600); 48 //蛇头方向 49 switch (fx) { 50 case "right": 51 Data.right.paintIcon(this, g, snakeX[0], snakeY[0]); 52 break; 53 case "left": 54 Data.left.paintIcon(this, g, snakeX[0], snakeY[0]); 55 break; 56 case "up": 57 Data.up.paintIcon(this, g, snakeX[0], snakeY[0]); 58 break; 59 case "down": 60 Data.down.paintIcon(this, g, snakeX[0], snakeY[0]); 61 break; 62 } 63 64 //身体图片 65 for (int i = 1; i < length; i++) { 66 67 Data.body.paintIcon(this, g, snakeX[i], snakeY[i]); 68 } 69 //开始提示 70 if (isStart == false) { 71 g.setColor(Color.WHITE); 72 g.setFont(new Font("微软雅黑", Font.BOLD, 40)); 73 g.drawString("按下空格开始游戏", 300, 300); 74 timer.start(); 75 76 } //失败提示 77 if (isFail == true) { 78 g.setColor(Color.red); 79 g.setFont(new Font("微软雅黑", Font.BOLD, 40)); 80 g.drawString("游戏失败,请重新开始", 300, 300); 81 82 } 83 //食物图片 84 Data.food.paintIcon(this, g, foodX, foodY); 85 86 } 87 88 //键盘监听事件 89 90 @Override 91 public void keyPressed(KeyEvent e) { 92 int keyCode = e.getKeyCode();//获取键盘按键 93 if (keyCode == KeyEvent.VK_SPACE) { 94 //判断失败后重新载入 95 if (isFail){ 96 isFail=false; 97 init(); 98 }else { 99 isStart = !isStart;//没失败暂停 100 } 101 repaint();//刷新画面 102 } 103 //按键改变方向 104 if (keyCode == KeyEvent.VK_LEFT) { 105 if (!fx.equals("right")) { 106 fx = "left"; 107 } 108 } else if (keyCode == KeyEvent.VK_RIGHT) { 109 if (!fx.equals("left")) { 110 fx = "right"; 111 } 112 } else if (keyCode == KeyEvent.VK_UP) { 113 if (!fx.equals("down")) { 114 fx = "up"; 115 } 116 } else if (keyCode == KeyEvent.VK_DOWN) { 117 if (!fx.equals("up")) { 118 fx = "down"; 119 } 120 } 121 } 122 123 @Override 124 public void keyTyped(KeyEvent e) { 125 126 } 127 128 @Override 129 public void keyReleased(KeyEvent e) { 130 131 } 132 133 //事件监听 134 @Override 135 public void actionPerformed(ActionEvent e) { 136 if (isStart && isFail==false) { 137 138 //吃食物 139 if (foodX == snakeX[0] && foodY == snakeY[0]) { 140 length++; 141 foodX = 25 + 25 * random.nextInt(34); 142 foodY = 75 + 25 * random.nextInt(22); 143 } 144 //身体向前移动 145 for (int i = length - 1; i > 0; i--) { 146 snakeX[i] = snakeX[i - 1]; 147 snakeY[i] = snakeY[i - 1]; 148 } 149 150 switch (fx) { 151 case "up": 152 snakeY[0] = snakeY[0] - 25; 153 if (snakeY[0] ==75) { 154 isFail=true; 155 } 156 break; 157 case "down": 158 snakeY[0] = snakeY[0] + 25; 159 if (snakeY[0] == 650) { 160 isFail=true; 161 } 162 break; 163 case "right": 164 snakeX[0] = snakeX[0] + 25; 165 if (snakeX[0] == 850) { 166 isFail=true; 167 } 168 break; 169 case "left": 170 snakeX[0] = snakeX[0] - 25; 171 if (snakeX[0] ==25) { 172 isFail=true; 173 } 174 break; 175 } 176 177 //失败判定 178 for (int i = 1; i < length; i++) { 179 if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) { 180 isFail = true; 181 } 182 183 } 184 185 repaint(); 186 } 187 timer.start(); 188 } 189 }


浙公网安备 33010602011771号