Java基础练习小游戏-贪吃蛇

你与贪吃蛇的距离,只有三个类、一包图片素材而已!

1. 游戏启动器

package com.zhangshijie.snake;


import javax.swing.*;

public class StartGames {
    public static void main(String[] args){
        //1.绘制静态窗口
        JFrame jFrame = new JFrame("贪吃蛇游戏");
        jFrame.setBounds(10,10,925,740);//设置窗口的起始位置和大小
        jFrame.setResizable(false);//设置窗口大小不可变
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭界面时候停止程序运行
        jFrame.setVisible(true);//让游戏窗口可以展现出来
        jFrame.add(new GamePanel());//添加游戏面板
    }
}

 

2. 外部数据(素材图片)加载 类

package com.zhangshijie.snake;


import javax.swing.*;
import java.net.URL;

public class Data {
    //广告栏
    public static URL headerURL = Data.class.getResource("/statics/header1.png");
    public static ImageIcon header = 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);

}

 

3.  面板代码

package com.zhangshijie.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 {
    int length;//蛇的长度
    int[] snakeX = new int[600];//蛇的坐标x
    int[] snakeY = new int[500];
    String fx ; //方向
    boolean isStart = false;//游戏是否开始

    //积分系统
    int score;

    //定义一个食物
    int foodx;
    int foody;
    Random random = new Random();//定义一个随机数

    //死亡标记
    boolean isFall = false;

    Timer timer = new Timer(100,this);  //定时器 每个500毫秒动一次  //ctrl+enter进行自动添加接口

    //构造器
    public GamePanel(){
        init();
        //获取键盘的监听事件
        this.setFocusable(true);//获取键盘焦点--把键盘的焦点聚集在我们的游戏上面
        this.addKeyListener(this);//监听当前我们实现了监听接口的这个GamePanel类
        timer.start();//让时间动起来
    }

    //初始化蛇头+蛇身
    public void init(){
        length = 3;
        snakeX[0] = 100;snakeY[0]=100;
        snakeX[1]=75;snakeY[1]=100;
        snakeX[2]=50;snakeY[2]=100;
        fx ="R";
        foodx = 25 + 25*random.nextInt(15);
        foody = 75 + 25*random.nextInt(15);
        score = 0;
    }



    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);//清空屏幕
        this.setBackground(Color.BLACK);//设置背景颜色为黑色

        //引入外部素材
        Data.header.paintIcon(this,g,25,11);
        g.fillRect(25,75,850,600);

        //绘制食物
        Data.food.paintIcon(this,g,foodx,foody);

        //积分系统
        g.setColor(Color.YELLOW);//设置画笔颜色
        g.setFont(new Font("微软雅黑",Font.BOLD,20));//设置字体
        g.drawString("长度:"+length,700,30);
        g.drawString("积分:"+score,700,60);



        //绘制蛇头
        if(fx.equals("R")){
            Data.right.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]);
        }else if(fx.equals("L")){
            Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        for(int i =1;i<length;i++){
            Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
        }
        //游戏提示是否开始
        if(isStart == false){
            //使用画笔画一个文字 String
            g.setColor(Color.WHITE);//设置画笔颜色
            g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体
            g.drawString("按下空格开始游戏",300,300);
        }
        //游戏提示是否死亡
        if(isFall){
            //使用画笔画一个文字 String
            g.setColor(Color.RED);//设置画笔颜色
            g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体
            g.drawString("游戏失败,按下空格重新开始!",200,300);
        }
    }


    //键盘监听的三个方法
    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        //按下键盘 未释放状态
        //获取按下的键盘是哪个键
        int keyCode = e.getKeyCode();
        if(keyCode==KeyEvent.VK_SPACE){//按下了空格
            if(isFall){
                isFall = false;
                init();//重新初始化游戏

            }else{
                isStart = !isStart;
            }


            repaint();//重新绘制界面(刷新界面)
        }
        //控制键盘走向
        if(keyCode==KeyEvent.VK_LEFT){
            fx="L";
        }else if(keyCode==KeyEvent.VK_UP){
            fx="U";
        }else if(keyCode==KeyEvent.VK_RIGHT){
            fx = "R";
        }else if(keyCode==KeyEvent.VK_DOWN){
            fx="D";
        }
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        //如果游戏处于开始状态 并且游戏没有失败
        if(isStart && isFall==false){
            //向下
            if(fx.equals("D")){
                //身体动起来
                for(int i=length-1;i>0;i--){
                    snakeX[i]=snakeX[i-1];
                    snakeY[i]=snakeY[i-1];
                }
                //头部动起来
                snakeY[0]=snakeY[0]+25;
                if(snakeY[0]>750){
                    snakeY[0]=25;
                }
            }
            else if(fx.equals("U")){
                //身体动起来
                for(int i=length-1;i>0;i--){
                    snakeX[i]=snakeX[i-1];
                    snakeY[i]=snakeY[i-1];
                }
                //头部动起来
                snakeY[0] = snakeY[0]-25;
                if(snakeY[0]<25){
                    snakeY[0]=750;
                }
            }
            else if(fx.equals("L")){
                //身体动起来
                for(int i=length-1;i>0;i--){
                    snakeX[i]=snakeX[i-1];
                    snakeY[i]=snakeY[i-1];
                }
                //头部动起来
                snakeX[0]=snakeX[0]-25;
                if(snakeX[0]<25){
                    snakeX[0]=750;
                }
            }
            else if(fx.equals("R")){
                //身体动起来
                for(int i=length-1;i>0;i--){
                    snakeX[i]=snakeX[i-1];
                    snakeY[i]=snakeY[i-1];
                }
                //头部动起来
                snakeX[0]=snakeX[0]+25;
                if(snakeX[0]>750){
                    snakeX[0]=25;
                }
            }

            //吃食物
            if(snakeX[0]==foodx && snakeY[0]==foody){
                length++;
                foodx = 25 + 25*random.nextInt(15);
                foody = 75 + 25*random.nextInt(15);
                score +=10;
            }
            //死亡判断
            for(int i=1;i<length;i++){
                if(snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]){
                    isFall=true;
                }
            }
            repaint();
        }
        timer.start();
    }
    @Override
    public void keyReleased(KeyEvent e) {
    }
}

运行一下:

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北溟南风起

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值