JAVA贪吃蛇代码(带注释)

JAVA贪吃蛇代码(带注释)贪吃蛇图片是代码里面的素材游戏数据类packagecom.tang.retor_snaker;importjavax.swing.*;importjava.net.URL;publicclassData{privatestaticURLbodyURL=Data.class.getResource(“/com/tang/retor_snaker/statics/body.png”);privatestaticImageIconbo

大家好,又见面了,我是你们的朋友全栈君。

贪吃蛇

这是游戏效果

在这里插入图片描述

图片是代码里面的素材

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

游戏数据类

package com.tang.retor_snaker;
import javax.swing.*;
import java.net.URL;
public class Data { 

private static URL bodyURL = Data.class.getResource("/com/tang/retor_snaker/statics/body.png");
private static ImageIcon body = new ImageIcon(bodyURL);
private static ImageIcon food = new ImageIcon(Data.class.getResource("/com/tang/retor_snaker/statics/food.png"));
private static ImageIcon up = new ImageIcon(Data.class.getResource("/com/tang/retor_snaker/statics/up.png"));
private static ImageIcon down = new ImageIcon(Data.class.getResource("/com/tang/retor_snaker/statics/down.png"));
private static ImageIcon left = new ImageIcon(Data.class.getResource("/com/tang/retor_snaker/statics/left.png"));
private static ImageIcon right = new ImageIcon(Data.class.getResource("/com/tang/retor_snaker/statics/right.png"));
public static ImageIcon getBody() { 

return body;
}
public static void setBody(ImageIcon body) { 

Data.body = body;
}
public static ImageIcon getUp() { 

return up;
}
public static void setUp(ImageIcon up) { 

Data.up = up;
}
public static ImageIcon getDown() { 

return down;
}
public static void setDown(ImageIcon down) { 

Data.down = down;
}
public static ImageIcon getLeft() { 

return left;
}
public static void setLeft(ImageIcon left) { 

Data.left = left;
}
public static ImageIcon getRight() { 

return right;
}
public static void setRight(ImageIcon right) { 

Data.right = right;
}
public static ImageIcon getFood() { 

return food;
}
public static void setFood(ImageIcon food) { 

Data.food = food;
}
}

游戏面板类

package com.tang.retor_snaker;
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.Arrays;
import java.util.Random;
public class GamePanel extends JPanel implements KeyListener, ActionListener { 

// 设置蛇头的方向
String snakeHead;
// 蛇的长度
int length;
int[] snakeX;
int[] snakeY;
// 游戏状态:开始=true - 停止=false
boolean isStart = false;
// 定时器:第一个参数就是定时执行时间
Timer timer = new Timer(170, this);
// 食物
int foodX;
int foodY;
// 让食物出现的位置随机
Random random = new Random();
// 游戏是否结束:结束为=true - 游戏中=false
boolean isFail = false;
// 游戏是否胜利:胜利为true - 没胜利为false
boolean isVictory = false;
// 游戏分数
int score;
public GamePanel() { 

// 初始化面板
init();
// 设置焦点事件
this.setFocusable(true);
// 给面板添加键盘监听事件
this.addKeyListener(this);
timer.start();
}
public void init() { 

// 初始化蛇头向右
snakeHead = "right";
// 初始化蛇有三节,包括小脑袋
length = 3;
snakeX = new int[1000];
snakeY = new int[1000];
snakeX[0] = 75;
snakeY[0] = 75;
snakeX[1] = 50;
snakeY[1] = 75;
snakeX[2] = 25;
snakeY[2] = 75;
// 初始化实物数据
foodX = 75 + 25 * random.nextInt(21);
foodY = 75 + 25 * random.nextInt(19);
// 让生成的食物不会和蛇重合
for (int i = 0; i < length; i++) { 

if (foodX == snakeX[i] && foodY == snakeY[i]) { 

foodX = 75 + 25 * random.nextInt(21);
foodY = 100 + 25 * random.nextInt(19);
i = 0;
}
}
// 初始化游戏分数
score = 0;
}
// 画组件
@Override
protected void paintComponent(Graphics g) { 

super.paintComponent(g);
// 设置面板背景色
this.setBackground(Color.white);
// 绘制游戏区域
g.fillRect(25, 50, 600, 575);
// 绘制蛇头
if (snakeHead.equals("up")) { 

Data.getUp().paintIcon(this, g, snakeX[0], snakeY[0]);
} else if (snakeHead.equals("down")) { 

Data.getDown().paintIcon(this, g, snakeX[0], snakeY[0]);
} else if (snakeHead.equals("left")) { 

Data.getLeft().paintIcon(this, g, snakeX[0], snakeY[0]);
} else if (snakeHead.equals("right")) { 

Data.getRight().paintIcon(this, g, snakeX[0], snakeY[0]);
}
// 绘制蛇的身体
for (int i = 1; i < length; i++) { 

Data.getBody().paintIcon(this, g, snakeX[i], snakeY[i]);
}
// 画食物
Data.getFood().paintIcon(this, g, foodX, foodY);
// 绘制局内游戏信息
g.setColor(Color.black);
g.setFont(new Font("宋体", Font.BOLD, 15));
g.drawString("长度:" + length, 25, 20);
g.drawString("分数:" + score, 25, 40);
// 绘制游戏暂停时的 提示信息
if (!isStart) { 

g.setColor(Color.white);
g.setFont(new Font("楷体", Font.BOLD, 40));
g.drawString("按下空格开始游戏!", 125, 300);
}
// 绘制游戏失败时的 提示信息
if (isFail) { 

g.setColor(Color.red);
g.setFont(new Font("楷体", Font.BOLD, 40));
g.drawString("失败,按下空格重新开始", 125, 300);
}
// 绘制游戏胜利时的 提示信息
if (isVictory) { 

g.setColor(Color.red);
g.setFont(new Font("宋体", Font.BOLD, 35));
g.drawString("胜利,你是为数不多的天才", 125, 300);
g.drawString("按下空格重新开始新一轮游戏", 100, 350);
}
}
// 键盘监听事件,某个键按下执行方法
@Override
public void keyPressed(KeyEvent e) { 

/* 当用户按下空格时:先判断游戏有没有结束, 如果游戏结束那么就重新开始 如果游戏没有结束那么就继续原来的游戏 */
if (e.getKeyCode() == KeyEvent.VK_SPACE) { 

if (isFail || isVictory) { 

isFail = false;
isVictory = false;
init();
} else { 

isStart = !isStart;
}
repaint();
}
// 让用户用键盘的上下左右键来操作蛇头,
// 并且让蛇不能直接回头,当蛇在往上走,那么就不能立刻往下走
if (e.getKeyCode() == KeyEvent.VK_UP) { 

snakeHead = snakeHead.equals("down") ? "down" : "up";
} else if (e.getKeyCode() == KeyEvent.VK_DOWN) { 

snakeHead = snakeHead.equals("up") ? "up" : "down";
} else if (e.getKeyCode() == KeyEvent.VK_LEFT) { 

snakeHead = snakeHead.equals("right") ? "right" : "left";
} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 

snakeHead = snakeHead.equals("left") ? "left" : "right";
}
}
// 定时执行的操作
@Override
public void actionPerformed(ActionEvent e) { 

// 如果游戏处于开始状态,并且没有结束,则小蛇可以移动
if (isStart && !isFail && !isVictory) { 

// 身体移动:右移:即让后一个移到前一个的位置即可!
for (int i = length - 1; i > 0; i--) { 

snakeX[i] = snakeX[i - 1];
snakeY[i] = snakeY[i - 1];
}
// 头部移动,通过方向控制,;
if (snakeHead.equals("right")) { 

snakeX[0] = snakeX[0] + 25;
if (snakeX[0] > 600) snakeX[0] = 25;
} else if (snakeHead.equals("left")) { 

snakeX[0] = snakeX[0] - 25;
if (snakeX[0] < 25) snakeX[0] = 600;
} else if (snakeHead.equals("up")) { 

snakeY[0] = snakeY[0] - 25;
if (snakeY[0] < 50) snakeY[0] = 600;
} else if (snakeHead.equals("down")) { 

snakeY[0] = snakeY[0] + 25;
if (snakeY[0] > 600) snakeY[0] = 50;
}
// 吃食物:当蛇头和食物的坐标一致时,算吃到食物
if (snakeX[0] == foodX && snakeY[0] == foodY) { 

length++;
// 每吃一个食物,增加10积分
score = score + 10;
// 长度等于300,游戏获胜
// 当length到达一定的值,蛇移动的速度就变快
if (length == 300) { 

isVictory = true;
} else if (length == 25) { 

timer = new Timer(145, this);
} else if (length == 50) { 

timer = new Timer(125, this);
} else if (length == 100) { 

timer = new Timer(100, this);
} else if (length == 200) { 

timer = new Timer(70, this);
}
// 重新生成食物
foodX = 75 + 25 * random.nextInt(21);
foodY = 75 + 25 * random.nextInt(19);
// 让生成的食物不会和蛇重合
for (int i = 0; i < length; i++) { 

if (foodX == snakeX[i] && foodY == snakeY[i]) { 

foodX = 75 + 25 * random.nextInt(21);
foodY = 75 + 25 * random.nextInt(19);
i = 0;
}
}
}
// 结束判断,头和身体的坐标一致时,游戏结束
for (int i = 2; i < length; i++) { 

if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) { 

System.out.println(Arrays.toString(snakeX));
System.out.println(Arrays.toString(snakeY));
isFail = true;
}
}
// 需要不断的更新页面实现动画
repaint();
}
// 让时间动起来!
timer.start();
}
@Override
public void keyTyped(KeyEvent e) { 

}
@Override
public void keyReleased(KeyEvent e) { 

}
}

主程序

package com.tang.retor_snaker;
import javax.swing.*;
public class RetroSnakeGame { 

public static void main(String[] args) { 

// 创建窗口
JFrame frame = new JFrame("贪吃蛇");
// 固定窗口大小
frame.setResizable(false);
// 设置窗口出现位置和大小
frame.setBounds(300,300,675,675);
// 让窗口可关闭
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 添加游戏面板的组件
frame.add(new GamePanel());
// 设置窗口可见性
frame.setVisible(true);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141523.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • CSS制作一个半透明边框

    CSS制作一个半透明边框CSS制作一个半透明边框,background-clip属性,如何实现半透明边框

  • 一切皆为 JavaScript

    一切皆为 JavaScript

  • leetcode最长回文子串_kmp算法题

    leetcode最长回文子串_kmp算法题实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。示例 1:输入: haystack = “hello”, needle = “ll”输出: 2示例 2:输入: haystack = “aaaaa”, needle = “bba”输出: -1说明:当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题

  • J2EE架构师之路

    J2EE架构师之路不经意的回首,工作进入第五个年头了,发现走过了从Java程序员到J2EE架构师的历程。发现电脑上安装了各种各样的J2EE工具:JBuilder,WSAD,Eclipse,Rose,Together,Weblogic,Jtest,Optimizator,Mysql…发现电脑上保存了各种各样的OpenSource项目:Tomcat,JBoss,Ant,Hibernate,Spr

  • 干掉IDEA:JetBrains推出下一代轻量级开发工具Fleet

    干掉IDEA:JetBrains推出下一代轻量级开发工具FleetJetBrains以20年的IDE开发经验为基础从头打造了号称下一代的开发工具Fleet,它使用了IntelliJ代码处理引擎,具有分布式IDE架构和重新设计的UI。它的…

  • netty 释放bytebuf_python高性能框架

    netty 释放bytebuf_python高性能框架目录一、ByteBuf介绍二、分配方式堆缓冲区直接缓冲区ByteBufAllocatorUnpooled缓冲区三、ByteBuf的操作可丢弃字节可读字节可写字节索引管理查找操作派生缓冲区引用计数工具类资源释放一、ByteBuf介绍网络数据的基本单位总是字节。JavaNIO提供了ByteBuffer作为它的字节容器…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号