GUI贪吃蛇游戏(完整代码)
各个功能的实现总的来说就是如下几步:
-
定义数据
-
画上去
-
监听事件(键盘、事件)
具体代码如下:
Data.java
public class Data { public static URL bodyUrl = Data.class.getResource("statics/body.png"); public static ImageIcon body = new ImageIcon(bodyUrl); public static URL downUrl = Data.class.getResource("statics/down.png"); public static ImageIcon down = new ImageIcon(downUrl); public static URL foodUrl = Data.class.getResource("statics/food.png"); public static ImageIcon food = new ImageIcon(foodUrl); public static URL headerUrl = Data.class.getResource("statics/header.png"); public static ImageIcon header = new ImageIcon(headerUrl); public static URL leftUrl = Data.class.getResource("statics/left.png"); public static ImageIcon left = new ImageIcon(leftUrl); public static URL rightUrl = Data.class.getResource("statics/right.png"); public static ImageIcon right = new ImageIcon(rightUrl); public static URL upUrl = Data.class.getResource("statics/up.png"); public static ImageIcon up = new ImageIcon(upUrl); }
GamePanel.java
//游戏的面板 public class GamePanel extends JPanel implements KeyListener, ActionListener { //定义蛇的数据结构 int length;//蛇的长度 int[] snakeX = new int[600];//蛇的X坐标 25*25 int[] snakeY = new int[500];//蛇的Y坐标 25*25 String fx; //食物的坐标 int foodx; int foody; Random random = new Random(); int score;//成绩 //游戏当前的状态:开始/停止 boolean isStart = false;//默认是不开始 boolean isfail = false;//游戏失败状态 //定时器 以ms为单位 1000ms = 1s Timer timer = new Timer(150,this);//100ms执行一次 //构造器 public GamePanel() { init(); //获得焦点和键盘事件 this.setFocusable(true);//获得焦点事件 this.addKeyListener(this);//获得键盘监听事件 timer.start();//游戏一开始就启动 } //初始化方法 public void init(){ length = 3; snakeX[0] = 100;snakeY[0] = 100;//脑袋的坐标 snakeX[1] = 75;snakeY[1] = 100;//第一个身体的坐标 snakeX[2] = 50;snakeY[2] = 100;//第二个身体的坐标 fx = "R";//初始方向,向右 //把食物随机分布在界面上 foodx = 25 + 25*random.nextInt(34); foody = 75 +25*random.nextInt(24); score = 0; } //绘制画板,所有东西都是用这个画笔来画 @Override protected void paintComponent(Graphics g) { super.paintComponent(g);//清屏 //绘制静态的面板 this.setBackground(Color.WHITE); Data.header.paintIcon(this, g, 25, 11);//头部广告栏 g.fillRect(25,75,850,600);//默认的游戏界面 //把蛇画上去 if (fx.equals("R")){ Data.right.paintIcon(this,g,snakeX[0],snakeY[0]); }else if(fx.equals("L")){ Data.left.paintIcon(this,g,snakeX[0],snakeY[0]); }else if(fx.equals("U")){ Data.up.paintIcon(this,g,snakeX[0],snakeY[0]); }else if(fx.equals("D")){ Data.down.paintIcon(this,g,snakeX[0],snakeY[0]); } for (int i = 1; i < length; i++) { Data.body.paintIcon(this,g,snakeX[i],snakeY[i]); } //画食物 Data.food.paintIcon(this,g,foodx,foody); //画积分 g.setColor(Color.WHITE); g.setFont(new Font("微软雅黑", Font.BOLD, 18)); g.drawString("长度"+length,750,35); g.drawString("分数"+score,750,50); //游戏状态 if(isStart == false){ g.setColor(Color.WHITE); g.setFont(new Font("微软雅黑", Font.BOLD, 40)); g.drawString("按下空格开始游戏",300,300); } if(isfail == true){ g.setColor(Color.RED); g.setFont(new Font("微软雅黑", Font.BOLD, 40)); g.drawString("失败!按下空格重新开始",300,300); } } //键盘监听事件 @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_UP) { fx = "U"; } else if (keyCode == KeyEvent.VK_DOWN) { fx = "D"; } else if (keyCode == KeyEvent.VK_LEFT) { fx = "L"; } else if (keyCode == KeyEvent.VK_RIGHT) { fx = "R"; } } //事件监听 @Override public void actionPerformed(ActionEvent e) { if(isStart && isfail==false){//符合条件就让蛇动起来 //右移 for (int i = length-1; i > 0; i--) { snakeX[i] = snakeX[i-1]; snakeY[i] = snakeY[i-1]; } //走向 if (fx.equals("R")){ snakeX[0] = snakeX[0]+25; if (snakeX[0]>850){ snakeX[0] = 25;}//边界判断 }else if (fx.equals("L")){ snakeX[0] = snakeX[0]-25; if (snakeX[0]<25){ snakeX[0] = 850;}//边界判断 } else if (fx.equals("U")){ snakeY[0] = snakeY[0]-25; if (snakeY[0]<75){ snakeY[0] = 650;}//边界判断 } else if (fx.equals("D")){ snakeY[0] = snakeY[0]+25; if (snakeY[0]>650){ snakeY[0] = 75;}//边界判断 } //吃食物 if(snakeX[0] == foodx && snakeY[0] ==foody){ //长度1 length++; //分数加10 score = score +10; //再次随机食物 foodx = 25 + 25*random.nextInt(34); foody = 75 +25*random.nextInt(24); } //失败判断(撞到自己算失败) for (int i = 1; i < length; i++) { if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]){ isfail = true; } } repaint();//重画页面 } timer.start();//定时器开启 } @Override public void keyTyped(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { } }
StartGame.java
//游戏的主启动类
public class StartGame {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setBounds(10, 10, 900, 720);
frame.setResizable(false);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(new GamePanel());
frame.setVisible(true);
}
}
效果图:
版权声明:本文为hellowen原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。