Java贪吃蛇小游戏

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
   
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值