既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
还需要再优化一下
再在snake包下面创建
GamePanel类,用来创建面板,
此时,就需要在之前的StartGame这边加上这段代码,相当于把这个面板导入进去:frame.add(new
GamePanel());
最终版的StartGame:
package com.kuang.snake;
import javax.swing.*;
public class StartGames {
public static void main(String[] args) {
//首先创建一个静态窗口 JFrame,还能设置窗口名称
JFrame frame=new JFrame("贪吃蛇小游戏");
//再设置窗口大小,这个也是为了方便游戏到时候的位置确认
frame.setBounds(10,10,900,720);
//并且设置一系列,比如窗口大小不可变这个也是为了之后的游戏位置确认的,且游戏可关闭
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//把这个画板通过创建对象的方法导入进去
frame.add(new GamePanel());
//然后就是最后的展现窗口
frame.setVisible(true);
}
}
再创建一个Data类:
package com.kuang.snake;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.net.URL;
//用来存放外部数据的图片
public class Data {
//需要创建一个连接
//首先是把头部的地址和头部的图片生成,还用到反射的机制,路劲src这个路径
public static URL headerURL=Data.class.getResource("/statics/header.png");
public static ImageIcon head=new ImageIcon(headerURL);
//这样子就能把图片放进去了
//照例把这些图片全都导入进去
//头部的上下左右
public static URL upUrl=Data.class.getResource("/statics/up.png");
public static URL downUrl=Data.class.getResource("/statics/down.png");
public static URL leftUrl=Data.class.getResource("/statics/left.png");
public static URL rightUrl=Data.class.getResource("/statics/right.png");
public static ImageIcon up=new ImageIcon(upUrl);
public static ImageIcon down=new ImageIcon(downUrl);
public static ImageIcon left=new ImageIcon(leftUrl);
public static ImageIcon right=new ImageIcon(rightUrl);
//身体的
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 food=new ImageIcon(foodUrl);
}
GamePanel类:
package com.kuang.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 {
//这个是一个画板,在上面画蛇画图像
//Graphics这个类型就是一个画笔
//先设置一些变量,蛇的长度和蛇的x轴以及y轴坐标
int len;
int[] snakeX=new int[600];
int[] snakeY=new int[500];
//这里在定义一个方向,并且默认是R
String fx;//可以是R L U D
//这里再初始化一个用来判断游戏是否开始的,如果没开始的话,就可以进行一些文字提示
boolean isStart=false;
//这里需要初始化调用init,所以直接在构造函数里调用
//创建一个timer 参数就是隔着的时间和当前需要监听的对象
Timer timer=new Timer(100,this);
//然后再这边定一个一个食物的属性,有坐标,还有一个随机数
int foodx;
int foody;
Random rand=new Random();
//再定义一个游戏失败
boolean isFail=false;
//这里再加一个分数系统
int score;
GamePanel(){
init();
//也不知道为什么,反正就是需要有,获取到键盘的监听事件
this.setFocusable(true);
this.addKeyListener(this);
}
//然后对这个蛇进行初始化
public void init(){
//让蛇的长度为3,并且是头部,第一部分以及第二部分身体的长度设置好
len=3;
snakeX[0]=100;snakeY[0]=100;
snakeX[1]=75;snakeY[1]=100;
snakeX[2]=50;snakeY[2]=100;
//把方向放到这来初始化
fx="R";
//初始化的时候也要让他启动
timer.start();
//再把食物给初始化了,主要是位置
foodx=25+25\*rand.nextInt(24);
foody=75+25\*rand.nextInt(24);
//把分数初始化为0
score=0;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);//作用是清屏
//可以先设置一下背景颜色
this.setBackground(Color.BLACK);
//再试试看调用Data的头部数据
Data.head.paintIcon(this,g,25,11);
//再这个的基础之上,绘制游戏的区域
g.fillRect(25,75,850,600);
//然后开始话一个静态的小蛇,因为最初蛇头是朝右边的,所以头是right,然后就是两个位置
/\*Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);\*/
//这里通过方向也优化一下
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]);
}
/\*Data.body.paintIcon(this,g,snakeX[1],snakeY[1]);
Data.body.paintIcon(this,g,snakeX[2],snakeY[2]);\*/
//优化一下
for(int i=1;i<len;i++){
Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
}
//这里就需要把食物给画出来了
Data.food.paintIcon(this,g,foodx,foody);
//这里插入把分数和成绩也画出来好了
g.setColor(Color.WHITE);
//类型和大小
g.setFont(new Font("楷体",Font.BOLD,20));
//这个是对应的位置
g.drawString("长度"+len,750,200);
g.drawString("分数"+score,750,250);
//这里画完小蛇之后,就进行游戏是否开始的判断
if(!isStart){
//如果没开始,就要进行设置
//先设置字体颜色和位置
g.setColor(Color.WHITE);
//类型和大小
g.setFont(new Font("楷体",Font.BOLD,40));
//这个是对应的位置
g.drawString("按下空格开始",300,300);
}
if(isFail){
//如果他失败了的话
//如果没开始,就要进行设置
//先设置字体颜色和位置
g.setColor(Color.RED);
//类型和大小
g.setFont(new Font("楷体",Font.BOLD,40));
//这个是对应的位置
g.drawString("游戏失败按空格重新开始",300,300);
}
}
//然后再是需要有键盘的参与,先是继承键盘的方法,这里就会重写一些方法
@Override
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_LEFT){
//如果等于左边的话
fx="L";
}else if(keyCode==KeyEvent.VK_RIGHT){
fx="R";
}else if(keyCode==KeyEvent.VK_UP){
fx="U";
}else if(keyCode==KeyEvent.VK_DOWN){
fx="D";
}
![img](https://img-blog.csdnimg.cn/img_convert/175923bd9fead072a80537a403198c2b.png)
![img](https://img-blog.csdnimg.cn/img_convert/01d7f5e7804fb050cdf3fe0aa4092d44.png)
![img](https://img-blog.csdnimg.cn/img_convert/0edc08d4db78061a3600cb4d94c89abf.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
22)]
[外链图片转存中...(img-GA0UQDHs-1714909799422)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**