1.建立工程
新建一个目录入图放置就可以

代码如下:按顺序进行复制即可
Data.java:
package com.mc.snake;
import javax.swing.*;
import java.net.URL;
public class Data {
//变成一个图标的点
public static URL upURL=Data.class.getResource("/statics/up.png");
public static URL downURL=Data.class.getResource("/statics/down.png");
public static URL rightURL=Data.class.getResource("/statics/right.png");
public static URL leftURL=Data.class.getResource("/statics/left.png");
public static ImageIcon up = new ImageIcon(upURL);
public static ImageIcon down = new ImageIcon(downURL);
public static ImageIcon right = new ImageIcon(rightURL);
public static ImageIcon left = new ImageIcon(leftURL);
public static URL bodyURL=Data.class.getResource("/statics/body.png");
public static ImageIcon body = new ImageIcon(bodyURL);
public static URL foodURL=Data.class.getResource("/statics/food.png");
public static ImageIcon foot=new ImageIcon(foodURL);
}
GamePanel:
package com.mc.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.util.Random;
public class GamePanel extends JPanel implements KeyListener, ActionListener {
//定义蛇的数据结构
int length;
int [] snackX = new int[600];
int [] snackY = new int[600];
String fx;
//游戏当前的状态:开始,停止
boolean isStart= false;
//设置一个定时器
Timer timer=new Timer(100,this); //100毫秒刷新一次
//食物的坐标
int foodx,foody;
Random random=new Random();
//失败判断
boolean isFail=false;
//积分
int score;
public GamePanel(){
init();
setFocusable(true); //获取焦点事件
addKeyListener(this);
timer.start();
}
public void init(){
length=3;
snackX[0]= 100; snackY[0]= 100;
snackX[1]= 75; snackY[1]= 100;
snackX[2]= 50; snackY[2]= 100;
fx="R";
score=0;
foodx=25+25*random.nextInt(34);
foody=25+25*random.nextInt(24);
}
//绘制面板
protected void paintComponent(Graphics g) {
super.paintComponent(g); //清屏的作业
this.setBackground(Color.WHITE);
//绘制静态的面板
//初始化小蛇
if (fx.equals("R")){ //控制蛇头的方向
Data.right.paintIcon(this,g,snackX[0],snackY[0]);
}else
if (fx.equals("L")){ //控制蛇头的方向
Data.left.paintIcon(this,g,snackX[0],snackY[0]);
}else
if (fx.equals("U")){ //控制蛇头的方向
Data.up.paintIcon(this,g,snackX[0],snackY[0]);
}else
if (fx.equals("D")){ //控制蛇头的方向
Data.down.paintIcon(this,g,snackX[0],snackY[0]);
}
/* Data.body.paintIcon(this,g,snackX[1],snackY[1]);
Data.body.paintIcon(this,g,snackX[2],snackY[2]);*/
for (int i=1;i<length;i++){
Data.body.paintIcon(this,g,snackX[i],snackY[i]);
}
if (isStart==false){
g.setColor(Color.white);
g.setFont(new Font("微软雅黑",Font.BOLD,40));
g.drawString("按下空格开始游戏",300,300);
}
//花食物
Data.foot.paintIcon(this,g,foodx,foody );
if (isFail){
g.setColor(Color.red);
g.setFont(new Font("微软雅黑",Font.BOLD,40));
g.drawString("失败,按下空格重新开始游戏",300,300);
}
//画积分
g.setColor(Color.red);
g.setFont(new Font("微软雅黑",Font.BOLD,18));
g.drawString("长度"+length,750,35);
g.drawString("分数"+score,750,55);
}
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";
}
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
public void actionPerformed(ActionEvent e) {
if (isStart&&isFail==false){
for (int i=length-1;i>0;i--){ //方便书写
snackX[i]=snackX[i-1]; //后面一节变成前面一节的位置,动起来
snackY[i]=snackY[i-1];
}
if (fx.equals("R")){
snackX[0]=snackX[0]+25;
if (snackX[0]>850){
snackX[0]=25;
}
}else if (fx.equals("L")){
snackX[0]=snackX[0]-25;
if (snackX[0]<25){
snackX[0]=850;
}
}else if (fx.equals("U")){
snackY[0]=snackY[0]-25;
if(snackY[0]<75){
snackY[0]=650;
}
}else if (fx.equals("D")){
snackY[0]=snackY[0]+25;
if (snackY[0]>650){
snackY[0]=75;
}
}
//吃食物
if(snackX[0]==foodx&&snackY[0]==foody){
length++;
//在次初始化食物
score=score+10;
foodx=25+25*random.nextInt(34);
foody=25+25*random.nextInt(24);
}
//失败判定
for (int i=1 ;i<length;i++){
if (snackX[0]==snackX[i]&&snackY[0]==snackY[i]){
isFail=true;
}
}
repaint();
}
timer.start();
}
}
3.StartGame.java
package com.mc.snake;
import javax.swing.*;
public class StartGame {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setBounds(10,10,900,720);
frame.setResizable(false);
frame.add(new GamePanel());
}
}
2.贪吃蛇素材图片地址
链接:https://pan.baidu.com/s/12_cK9-ShODK6sH3WS45SjQ
提取码:8888
本代码的思想是来自B站狂神说,根据狂神的课堂笔记自己整理出来的。是狂神的小迷弟。
希望有可以帮助到的人