贪吃蛇小游戏代码
package com.zrr.game; import javax.swing.*; import java.net.URL; public class Images { public static URL bodyURL =Images.class.getResource("/images/body.png");// /指代相对路径。 public static ImageIcon bodyImg=new ImageIcon(bodyURL); public static URL downURL =Images.class.getResource("/images/down.png");// /指代相对路径。 public static ImageIcon downImg=new ImageIcon(downURL); public static URL upURL =Images.class.getResource("/images/up.png");// /指代相对路径。 public static ImageIcon upImg=new ImageIcon(upURL); public static URL leftURL =Images.class.getResource("/images/left.png");// /指代相对路径。 public static ImageIcon leftImg=new ImageIcon(leftURL); public static URL rightURL =Images.class.getResource("/images/right.png");// /指代相对路径。 public static ImageIcon rightImg=new ImageIcon(rightURL); public static URL foodURL =Images.class.getResource("/images/food.png");// /指代相对路径。 public static ImageIcon foodImg=new ImageIcon(foodURL); public static URL headerURL =Images.class.getResource("/images/header.png");// /指代相对路径。 public static ImageIcon headerImg=new ImageIcon(headerURL); } package com.zrr.game; import javax.swing.*; import java.awt.*; public class StartGame { public static void main(String[] args) { //创建一个窗体 JFrame jf=new JFrame(); //给窗体设计一个小标题 jf.setTitle("小游戏 大逻辑 by RongrongZhang"); //设置窗体弹出坐标。 int width=Toolkit.getDefaultToolkit().getScreenSize().width; int height=Toolkit.getDefaultToolkit().getScreenSize().height; jf.setBounds((width-800)/2,(height-800)/2,785,785); //设置窗体大小不可调节。 jf.setResizable(false); //关闭窗口的同时,程序同时关闭。 jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //创建面板 GamePanel gp=new GamePanel(); //将面板放入窗体中 jf.add(gp); //默认窗体隐藏。————显现方法最好在最后。 jf.setVisible(true); } } package com.zrr.game; import javax.swing.*; import javax.swing.text.StyledEditorKit; import java.awt.*; import java.awt.event.*; import java.io.FileFilter; import java.security.PublicKey; import java.util.Random; import java.util.function.IntToDoubleFunction; //GamePanel 继承了Jpanel之后,才具备面板功能。 public class GamePanel extends JPanel{ //蛇的长度 int length; //定义两个数组,一个存储蛇的x坐标,一个y坐标。 int[] snakeX=new int[200]; int[] snakeY=new int[200]; //游戏只有两个状态,开始或者结束. boolean isStart=false;//默认暂停 //加入定时器 Timer timer; //定义蛇的行走方向 String direction; //定义食物的x,y轴坐标 int foodX; int foodY; //定义一个积分 int score; //加入一个变量,判断小蛇状态 boolean isDie=false;//默认存活 public void init(){ //蛇长初始化。 length=3; snakeX[0]=175; snakeY[0]=275; snakeX[1]=150; snakeY[1]=275; snakeX[2]=125; snakeY[2]=275; //初始化蛇头方向 direction="R"; //初始化食物坐标 foodX=300; foodY=200; } public GamePanel(){ init(); //将焦点定位到当前操作面板上 this.setFocusable(true); //加入监听 this.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { super.keyPressed(e); int keyCode=e.getKeyCode(); System.out.println(keyCode); if(keyCode==KeyEvent.VK_SPACE){//监听空格 if(isDie){ //恢复初始状态 init(); isDie=false; }else{ isStart=!isStart; repaint();//重绘 } } //监听上下左右 if(keyCode==KeyEvent.VK_UP){ direction="U"; } if(keyCode==KeyEvent.VK_DOWN){ direction="D"; } if(keyCode==KeyEvent.VK_LEFT){ direction="L"; } if(keyCode==KeyEvent.VK_RIGHT){ direction="R"; } } }); //对定时器进行初始化操作 timer=new Timer(100, new ActionListener() { /* ActionListener是事件监听,相当于你100ms监听你是否发生了个动作。 具体动作放入actionPerformed */ @Override public void actionPerformed(ActionEvent e) { if(isStart&&isDie==false){//游戏开始时候蛇才动,并且后一节身子走到前一节身子。 for(int i=length-1;i>0;i--){ snakeX[i]=snakeX[i-1]; snakeY[i]=snakeY[i-1]; } //动头 if("R".equals(direction)){ snakeX[0]+=25; } if("L".equals(direction)){ snakeX[0]-=25; } if("D".equals(direction)){ snakeY[0]+=25; } if("U".equals(direction)){ snakeY[0]-=25; } //防止蛇超出边界 if(snakeX[0]>750){ snakeX[0]=25; } if(snakeX[0]<25){ snakeX[0]=750; } if(snakeY[0]>725){ snakeY[0]=100; } if(snakeY[0]<100){ snakeY[0]=725; } //检测碰撞,食物坐标与蛇头坐标重合 if(snakeX[0]==foodX&&snakeY[0]==foodY){ //蛇长+1 length++; //食物坐标改变,随机生成坐标。坐标需是25倍数,Matn.random()-->[0.0,1.0) foodX=(int)(Math.random()*30+1)*25;//[25,750] foodY=(new Random().nextInt(26)+4)*25;//[100,725] //吃上食物,积分+10 score+=10; } //死亡判定,蛇头与任意一节身子碰撞。 for(int i=1;i<length;i++){ if (snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){ isDie=true; } } repaint(); } } });//定时器启动 timer.start(); } /* paintComponent比较特殊,属于main方法 */ @Override protected void paintComponent(Graphics g) { super.paintComponent(g); //填充背景颜色 this.setBackground(new Color(0xBE27284E, true)); //画头部的图片 Images.headerImg.paintIcon(this,g,0,5); //调节画笔颜色 g.setColor(new Color(0xFCF5F8F8, true)); //画一个矩形 g.fillRect(10,70,770,685); //画小蛇 //画蛇头 if ("R".equals(direction)){ Images.rightImg.paintIcon(this,g,snakeX[0],snakeY[0]);} if ("L".equals(direction)){ Images.leftImg.paintIcon(this,g,snakeX[0],snakeY[0]);} if ("U".equals(direction)){ Images.upImg.paintIcon(this,g,snakeX[0],snakeY[0]);} if ("D".equals(direction)){ Images.downImg.paintIcon(this,g,snakeX[0],snakeY[0]);} //第一节身子 //Images.bodyImg.paintIcon(this,g,snakeX[1],snakeY[1]); //第二节 //Images.bodyImg.paintIcon(this,g,snakeX[2],snakeY[2]); //优化循环结构 for(int i=1;i<length;i++){ Images.bodyImg.paintIcon(this,g,snakeX[i],snakeY[i]); } //如果游戏暂停,界面显示提示 if(isStart==false){ //画笔颜色 g.setColor(new Color(0x078175)); //设置字体 g.setFont(new Font("微软雅黑",Font.BOLD,40)); //绘制文字 g.drawString("点击空格开始游戏",250,330); } //画食物 Images.foodImg.paintIcon(this,g,foodX,foodY); //画积分 g.setColor(new Color(0xE1D7EF)); g.setFont(new Font("微软雅黑",Font.BOLD,20)); g.drawString("积分:"+score,620,40); //画入死亡状态 if(isDie){ g.setColor(new Color(0xF11414)); g.setFont(new Font("微软雅黑",Font.BOLD,30)); g.drawString("小蛇死亡,单击空格重新开始。",250,400); //画题目 g.setColor(new Color(0xE1D7EF)); g.setFont(new Font("微软雅黑",Font.BOLD,20)); g.drawString("贪吃蛇小游戏"+score,50,40); } } }[具体教程参见]https://www.bilibili.com/video/BV1bA411e7FH
