这是一款经典小游戏,贪吃蛇,玩家操控小蛇从小吃到大,全方面的代码解析,适合新手第一款的项目实战
更多项目👇
1、大鱼吃小鱼小游戏(Java版含源代码,JavaSwing+多线程+接口)
2、Java之马里奥游戏
3、魔塔小游戏Java版项目含源代码
4、飞机大战Java版(Java+JavaSwing+多线程结构)
5、云龙开炮版飞机大战(Java+JavaSwing+关卡+技能物品+宠物+商店界面+可切换音乐界面)
⭐项目完整源码获取⭐
🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
🍂个人博客首页: KJ.JK
欢迎大家点赞👍收藏💖评论💬关注🔒
💖源码获取 | 💻学习交流 | 🤝商务合作 | 💨私信作者
项目结构
部分源代码如下:
苹果类
import java.awt.*;
import java.util.Random;
/**
* 小蛇吃的苹果
*/
public class Apple {
private static Color APPLE_COLOR=Color.RED;//苹果的颜色
private int rows,cols;//出现的位置
private int w=Ground.BOX_SIZE;
private int h=Ground.BOX_SIZE;
private Random random=new Random();
public Apple(){
this.rows=random.nextInt(Ground.ROWS-5)+5;
this.cols=random.nextInt(Ground.COLS-5)+5;
}
/**
* 画苹果
* @param g
*/
public void drawApple(Graphics g){
Color color = g.getColor();
g.setColor(APPLE_COLOR);
g.fillOval(rows*Ground.BOX_SIZE,cols*Ground.BOX_SIZE,w,h);
g.setColor(color);
}
/**
* 获取碰撞检测点
* @return
*/
public Rectangle getRectangle(){
return new Rectangle(rows*Ground.BOX_SIZE,cols*Ground.BOX_SIZE,w,h);
}
/**
* 更新苹果的位置
*/
public void updateAppleLocation(){
this.rows=random.nextInt(Ground.ROWS-5)+5;
this.cols=random.nextInt(Ground.COLS-5)+5;
}
}
🔥系列热门专栏🔥:
⚡《JavaEE进阶序列 | 从小白到工程师》系列文章⚡
⚡《JavaEE项目实战》系列文章⚡
⚡《JavaSwing项目合集》系列文章⚡
草地类
import java.awt.*;
import java.awt.event.*;
/**
* 草地类
*/
public class Ground extends Frame{
public static final int ROWS=50;//草地行数
public static final int COLS=50;//草地列数
public static final int BOX_SIZE=15;//每个小格的大小
private static final Color GROUND_COLOR=Color.BLACK;//草地的颜色
private int score=0;//初始分数
private boolean isOver=false;
private PaintThread paintThread=new PaintThread();
private Snake snake=new Snake(this);
private Apple apple=new Apple();
/**
* 运行草地
*/
public void execute(){
setSize(COLS*BOX_SIZE,ROWS*BOX_SIZE);
setLocation(200,200);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
setVisible(false);
System.exit(0);
}
});
addKeyListener(new MyKeyListener());
setVisible(true);
new Thread(paintThread).start();
}
/**
* 画出草地
* @param g
*/
@Override
public void paint(Graphics g) {
Color color = g.getColor();
g.setColor(GROUND_COLOR);
g.fillRect(0,0,COLS*BOX_SIZE,ROWS*BOX_SIZE);
//画出横线
g.setColor(Color.black);
for(int i=1;i<ROWS;i++){
g.drawLine(0,i*BOX_SIZE,COLS*BOX_SIZE,i*BOX_SIZE);
}
for(int i=1;i<COLS;i++){
g.drawLine(i*BOX_SIZE,0,BOX_SIZE*i,ROWS*BOX_SIZE);
}
//画蛇
snake.drawSnake(g);
//画苹果
apple.drawApple(g);
//吃苹果
snake.eatApple(apple);
//分值
g.setColor(Color.white);
g.drawString("当前分数:"+score+" 分",30,60);
if(isOver){
g.setFont(new Font("宋体",Font.BOLD,30));
g.setColor(Color.YELLOW);
g.drawString("游戏结束 ! \n 按F2重玩",200,300);
}
g.setColor(color);
}
/**游戏结束*/
public void stop(){
isOver=true;
paintThread.setOff();
}
/**
* 重画草地的线程
*/
private class PaintThread implements Runnable{
private boolean flag=true;
@Override
public void run() {
try {
while (flag){
Thread.sleep(100);
repaint();
}
}catch (Exception e){
System.out.println("【重画线程异常】");
e.printStackTrace();
}
}
public void setOff(){
this.flag=false;
}
public void setOn(){
this.flag=true;
}
}
/**
* 键盘事件
*/
private class MyKeyListener extends KeyAdapter{
@Override
public void keyPressed(KeyEvent e) {
snake.changeSnake(e);
if(isOver){
if(KeyEvent.VK_F2==e.getKeyCode())
restart();
}
}
}
/**
* 重新开始
*/
private void restart() {
isOver=false;
snake=new Snake(this);
paintThread.setOn();
new Thread(paintThread).start();
}
/**
* 双缓冲技术
*/
Image offScreenImage = null;
public void update(Graphics g) {
if(offScreenImage == null) {
offScreenImage = this.createImage(COLS*BOX_SIZE,ROWS*BOX_SIZE);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0, 0,COLS*BOX_SIZE,ROWS*BOX_SIZE);
gOffScreen.setColor(c);
paint(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);
}
public int getScore(){
return score;
}
public void setScore(int score){
this.score=score;
}
public static void main(String[] args){
new Ground().execute();
}
}
创建链表类
public class TestCreateLinkNode {
/**
* 创建链表
* @param args
*/
public static void main(String[] args){
LinkNode linkNode = new LinkNode();
Node node=new Node();
Node node1=new Node();
Node node2=new Node();
Node node3=new Node();
node.setData(100);
node1.setData(45);
node2.setData(78);
node3.setData(23);
linkNode.addToTail(node);
linkNode.addToTail(node1);
linkNode.addToTail(node2);
linkNode.addToHead(node3);
linkNode.printLinkDatas();
}
}
作者:KJ.JK