GUI编程实战--贪吃蛇
参考:遇见狂神说
https://space.bilibili.com/95256449
界面绘制
- 帧:如果时间片足够小,就是动画,一秒30帧。连起来是动画,拆开是静态的图片
| package com.ssl.Snake; |
| |
| import javax.swing.*; |
| |
| |
| public class StartGame { |
| |
| public static void main(String[] args) { |
| JFrame frame = new JFrame("基于java-GUI的贪吃蛇小游戏"); |
| |
| frame.setBounds(50,50,900,800); |
| frame.setVisible(true); |
| frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); |
| frame.setResizable(false); |
| |
| |
| frame.add(new GamePanel()); |
| } |
| } |
| package com.ssl.Snake; |
| |
| import javax.swing.*; |
| import java.net.URL; |
| |
| |
| public class Data { |
| |
| |
| |
| public static URL headerURL = Data.class.getResource("statics/header.png"); |
| public static ImageIcon header = new ImageIcon(headerURL); |
| |
| public static URL headURL = Data.class.getResource("statics/head.png"); |
| public static ImageIcon head = new ImageIcon(headURL); |
| 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); |
| |
| 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 bodyURL = Data.class.getResource("statics/body.png"); |
| public static ImageIcon body = new ImageIcon(bodyURL); |
| |
| } |
| package com.ssl.Snake; |
| |
| import javax.swing.*; |
| import java.awt.*; |
| import java.awt.event.ActionEvent; |
| import java.awt.event.ActionListener; |
| import java.awt.event.KeyEvent; |
| import java.awt.event.KeyListener; |
| import java.security.Key; |
| import java.util.Random; |
| |
| |
| public class GamePanel extends JPanel implements KeyListener, ActionListener { |
| |
| |
| int length; |
| int[] snakeX = new int[600]; |
| int[] snakeY = new int[500]; |
| |
| |
| String fx; |
| |
| |
| boolean isStart; |
| |
| |
| int speed = 100; |
| |
| Timer timer = new Timer(speed,this); |
| |
| |
| int foodx; |
| int foody; |
| |
| Random random = new Random(); |
| |
| |
| boolean isfall = false; |
| |
| |
| int score; |
| |
| |
| public GamePanel(){ |
| init(); |
| |
| this.setFocusable(true); |
| this.addKeyListener(this); |
| } |
| |
| public void init(){ |
| |
| length=3; |
| snakeX[0]=100; snakeY[0]=200; |
| snakeX[1]=75; snakeY[1]=200; |
| snakeX[2]=50; snakeY[2]=200; |
| fx = "R"; |
| isStart = false; |
| speed=100; |
| timer.start(); |
| |
| |
| foodx = 25 + 25 * random.nextInt(34); |
| foody = 150 +25 * random.nextInt(24); |
| |
| score = 0; |
| } |
| |
| |
| @Override |
| protected void paintComponent(Graphics g) { |
| super.paintComponent(g); |
| |
| |
| this.setBackground(Color.WHITE); |
| Data.head.paintIcon(this,g,0,0); |
| |
| g.fillRect(25,150,850,600); |
| |
| |
| g.setColor(Color.BLACK); |
| |
| g.setFont(new Font("微软雅黑",Font.BOLD,20)); |
| |
| |
| g.drawString("长度:"+length,750,50); |
| g.drawString("得分:"+score,750,100); |
| |
| |
| |
| Data.food.paintIcon(this,g,foodx,foody); |
| |
| |
| |
| 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]); |
| } |
| |
| |
| |
| |
| if(!isStart){ |
| g.setColor(Color.WHITE); |
| |
| g.setFont(new Font("微软雅黑",Font.BOLD,40)); |
| |
| |
| g.drawString("按下空格开始游戏",300,400); |
| } |
| |
| |
| if(isfall){ |
| g.setColor(Color.RED); |
| |
| g.setFont(new Font("微软雅黑",Font.BOLD,40)); |
| |
| |
| g.drawString("游戏失败,按下空格重新开始",150,400); |
| } |
| |
| } |
| |
| @Override |
| public void keyTyped(KeyEvent e) { |
| |
| } |
| |
| |
| @Override |
| public void keyPressed(KeyEvent e) { |
| int keyCode = e.getKeyCode(); |
| if(keyCode == KeyEvent.VK_SPACE){ |
| if(isfall){ |
| |
| isfall = false; |
| init(); |
| }else{ |
| isStart = !isStart; |
| } |
| repaint(); |
| } |
| |
| if(keyCode == KeyEvent.VK_UP && (fx.equals("R")||fx.equals("L")) ){ |
| fx="U"; |
| }else if(keyCode == KeyEvent.VK_DOWN && (fx.equals("R")||fx.equals("L"))){ |
| fx="D"; |
| }else if(keyCode == KeyEvent.VK_LEFT && (fx.equals("U")||fx.equals("D")) ){ |
| fx="L"; |
| }else if(keyCode == KeyEvent.VK_RIGHT && (fx.equals("U")||fx.equals("D"))){ |
| fx="R"; |
| } |
| |
| } |
| |
| @Override |
| public void keyReleased(KeyEvent e) { |
| |
| } |
| |
| |
| @Override |
| public void actionPerformed(ActionEvent e) { |
| |
| if(isStart && isfall == false){ |
| |
| |
| if(snakeX[0]==foodx && snakeY[0]==foody){ |
| length++; |
| foodx = 25 + 25 * random.nextInt(34); |
| foody = 150 +25 * random.nextInt(24); |
| |
| speed= speed - 1; |
| score+=10; |
| } |
| |
| |
| 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; |
| }else if(fx.equals("L")){ |
| snakeX[0]=snakeX[0]-25; |
| }else if(fx.equals("U")){ |
| snakeY[0]=snakeY[0]-25; |
| }else if(fx.equals("D")){ |
| snakeY[0]=snakeY[0]+25; |
| } |
| |
| |
| if(snakeX[0]>850){ |
| snakeX[0]=25; |
| } |
| if(snakeX[0]<25){ |
| snakeX[0]=850; |
| } |
| if(snakeY[0]>725){ |
| snakeY[0]=150; |
| } |
| if(snakeY[0]<150){ |
| snakeY[0]=725; |
| } |
| |
| |
| for(int i=1;i<length;i++){ |
| if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]) |
| isfall=true; |
| } |
| |
| repaint(); |
| |
| } |
| if(speed<50){ |
| speed=50; |
| } |
| timer.start(); |
| } |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人