Java贪吃蛇小游戏
1. 静态页面绘制————>GUI
1.1 用JFrame绘制静态窗口
import javax.swing.*;
import java.awt.*;
//绘制静态窗口
JFrame jFrame = new JFrame("SnakeGame"); //SnakeGame———>窗口标题
/*设置界面大小
x y : 距离屏幕左上角的坐标
width height : 界面的宽和高
*/
jFrame.setBounds(10,10,905,600);
//窗口大小设置 false——>不可改变 true——>可改变
jFrame.setResizable(false);
//设置关闭事件,游戏关闭程序就会停止。若不设置,游戏关闭程序仍旧运行
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口是否可见 true——>可见 false——>不可见
jFrame.setVisible(true);
此时静态窗口创建完成
1.2 用JPanel绘制面板
窗口创建完成之后,游戏并不会显示在窗口上运行,需要一个面板。
自定义一个面板,需要继承自JPanel。JPanel: swing中的面板容器,可以存放任何东西,最后通过JFrame的add方法可以添加到JFrame窗体中。
实现画板功能 需要重写父类的paintComponent方法
import javax.swing.*;
import java.awt.*;
//继承JPanel并实现面板功能需要重写父类的paintComponent方法
//JPanel:swing中的面板容器,可以存放任何东西,最后通过JFrame的add方法可以添加到JFrame窗体中
public class GamePanel extends JPanel{
@Override
protected void paintComponent(Graphics g){
//Graphics g : 作画的画笔,画图片、文字都需要用到
super.paintComponent(g); //调用父类的方法,清屏作用
this.setBackground(Color.white);//设置面板背景色
}
}
1.3 将面板添加到窗体中
import javax.swing.*;
import java.awt.*;
//绘制静态窗口
JFrame jFrame = new JFrame("SnakeGame"); //SnakeGame———>窗口标题
/*设置界面大小
x y : 距离屏幕左上角的坐标
width height : 界面的宽和高
*/
jFrame.setBounds(10,10,905,600);
//窗口大小设置 false——>不可改变 true——>可改变
jFrame.setResizable(false);
//设置关闭事件,游戏关闭程序就会停止。若不设置,游戏关闭程序仍旧运行
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(new GamePanel()); //将自定义的面板添加进JFrame窗体里 <————————————添加位置
//设置窗口是否可见 true——>可见 false——>不可见
jFrame.setVisible(true);
1.4 在GamePanel绘制头部广告栏
1.4.1 先建立一个Data类,用于存放外部数据
-
存放图片———>URL类和ImageIcon类
URL:获取图片资源位置,定位图片
ImageIcon:存放图片
//用于存放程序需要的数据
import javax.swing.*;
import java.net.URL;
public class Data{
//存放头部广告栏图片
public static URL headerURL = Data.class.getResource("/statics/header.png"); //相对路径
public static ImageIcon header = new ImageIcon(headerURL);
//存放头部(上下左右)图片
public static URL upHead = Data.class.getResource("/statics/up.png");
public static URL downHead = Data.class.getResource("/statics/down.png");
public static URL leftHead = Data.class.getResource("/statics/left.png");
public static URL rightHead = Data.class.getResource("/statics/right.png");
public static ImageIcon up = new ImageIcon(upHead);
public static ImageIcon down = new ImageIcon(downHead);
public static ImageIcon left = new ImageIcon(leftHead);
public static ImageIcon right = new ImageIcon(rightHead);
//存放身体图片
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);
}
1.4.2 在GamePanel中绘制广告栏图片
通过Data类取到图片,再通过paintIcon()方法绘制图片
//绘制头部广告栏
/*通过paintIcon方法拿到图片
方法参数如下
component:画到哪个组件中
graphics:画笔
x y :画的位置
*/
Data.header.paintIcon(this,g,25,11); //this——>当前组件
1.5 在GamePanel中绘制游戏区域(矩形)
//绘制游戏区域
//x y : 距离屏幕左上角的坐标
//width height : 界面的宽和高
g.fillRect(25,75,850,400); //fillRect:填充一个矩形(还有别的方法)
1.6 在GamePanel中绘制一条静态小蛇
- 定义蛇的长度
- 定义两个数组定位蛇的位置(x坐标,y坐标)
- 初始化
- 绘制静态小蛇
- 构造器调用初始化方法
import javax.swing.*;
import java.awt.*;
public class GamePanel extends JPanel{
int length; //定义蛇的长度
int[] snakeX = new int[600]; //蛇的X坐标
int[] snakeY = new int[500]; //蛇的Y坐标
//初始化
public void init(){
length = 3; //初始化蛇的长度,默认为3
snakeX[0] = 100; snakeY[0] = 100; //蛇头的坐标
snakeX[1] = 75; snakeY[1] = 100; //第一个蛇身的坐标
snakeX[2] = 50; snakeY[2] = 100; //第一个蛇身的坐标
}
//构造器
public GamePanel(){
init();
}
//画板
@Override
protected void paintComponent(Graphics g){
//Graphics g : 作画的画笔,画图片、文字都需要用到
super.paintComponent(g); //调用父类的方法,清屏作用
this.setBackground(Color.white);//设置面板背景色
Data.header.paintIcon(this,g,25,11);//绘制头部广告栏
g.fillRect(25,75,850,400);//绘制游戏区域
//绘制静态小蛇
//绘制头部
Data.right.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]);
}
}
1.7 在GamePanel中绘制一条静态小蛇的优化
添加一个新变量fx,由fx决定蛇头方向,由length决定蛇身
public class GamePanel extends JPanel{
.......
String fx; //蛇头方向
//初始化
public void init(){
.......
fx = "R"; //蛇头方向默认为R
}
//构造器
public GamePanel(){
init();
}
//画板
@Override
protected void paintComponent(Graphics g){
.......
//绘制静态小蛇
//绘制头部————>由fx决定
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]);
}
//绘制身体————>由length决定
for (int i = 1; i <length; i++) {
Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
}
}
}
//JPanel:swing中的面板容器,可以存放任何东西,最后添加到JFrame窗体中
public class GamePanel extends JPanel implements KeyListener, ActionListener {
int score; //定义积分
boolean isStart = false; //游戏是否开始(用空格键控制),默认为false
boolean isFailed = false; //游戏是否失败(用空格键控制),默认为false
Timer timer = new Timer(100,this); //定时器,需要实现ActionListener接口,重写actionPerformed方法
//定义一个食物
int foodx;
int foody;
Random random =new Random(); //定义随机数种子
//构造器
public GamePanel(){
init();
//获取键盘的监听事件
this.setFocusable(true); //获取键盘的焦点,使键盘的焦点聚集在游戏上。默认为false