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 }

 

posted @ 2022-03-02 20:14  每天--自然醒  阅读(42)  评论(0)    收藏  举报