初识Java之贪吃蛇小游戏

一、绘制静态窗口

这是一个简陋的窗口

package Snake;

import javax.swing.*;

public class StartGames {
    public static void main(String[] args) {
        //绘制静态窗口
        JFrame jFrame = new JFrame("初试 Java ");
        //设置界面大小
        jFrame.setBounds(10, 10, 1200, 700);
        jFrame.setResizable(false);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        jFrame.setVisible(true);
    }
}

二、绘制游戏面板

main 里面只有画板类,新功能往被显示的类里面加

找到图片资源(路径);将资源显示出来(paintIcon)。

源码放到最后展示

三、画小蛇

3.1 静态的蛇

蛇头的方向;蛇的长度。

3.2 让小蛇动起来

定时器、键盘监听

蛇身体从后往前依次覆盖;加个蛇头随着键盘的输入改变方向。

四、吃东西

吃了后刷新下、判断下头撞身体

代码

1. StartGames

package Snake;

import javax.swing.*;

public class StartGames {
    public static void main(String[] args) {
        System.out.println(System.getProperty("java.class.path"));
        //绘制静态窗口

        JFrame jFrame = new JFrame("初试 Java 之贪吃蛇");
        //设置界面大小
        jFrame.setBounds(10, 10, 900, 700);
        jFrame.setResizable(false);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //将画板加入到JFrame
        //之后的操作放到画笔类里实现
        jFrame.add(new GamePanel());

        jFrame.setVisible(true);
    }
}

2. GamePanel

package Snake;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GamePanel extends JPanel implements KeyListener, ActionListener { //implements 一个类实现一个接口
    int N = 1000;
    int length;
    boolean isStart = false;
    int[] snake_X = new int[N], snake_Y = new int[N];
    String fx;//RLUD
    Timer timer = new Timer(100, this);
    int foodx, foody;
    Random random = new Random();
    boolean isFile = false;

    void init()
    {
        length = 3;
        fx = "R";
        snake_X[0] = snake_Y[0] = 200;
        snake_X[1] = 175; snake_Y[1] = 200;
        snake_X[2] = 150; snake_Y[2] = 200;
        timer.start();
        foodx = 50 + 25 * random.nextInt(32);
        foody = 100 + 25 * random.nextInt(22);
    }

    GamePanel(){
        init(); //创建的时候就调用init()
        this.setFocusable(true); //键盘焦点
        this.addKeyListener(this); //添加监听
    }

    //画板
    @Override //@Override 注解 这里的意思是重写
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); //清屏
        this.setBackground(Color.white);
        Data.header.paintIcon(this, g, 20, 20); //画布 笔 x y  画广告栏
        g.fillRect(50, 100, 800, 550); //游戏区域

        if(fx == "R") Data.right.paintIcon(this,g,snake_X[0],snake_Y[0]);
        else if(fx == "L") Data.left.paintIcon(this,g,snake_X[0],snake_Y[0]);
        else if(fx == "U") Data.up.paintIcon(this,g,snake_X[0],snake_Y[0]);
        else Data.down.paintIcon(this,g,snake_X[0],snake_Y[0]);
        for(int i = 1; i < length; ++ i)
            Data.body.paintIcon(this,g,snake_X[i],snake_Y[i]);
        Data.food.paintIcon(this,g,foodx,foody);
        g.setColor(Color.white);
        g.setFont(new Font("微软雅黑",Font.BOLD,20)); //字体
        g.drawString("" + length,800,150);
        //画完静态小蛇后提示用户开始游戏
        if(isStart == false){
            //画String
            g.setColor(Color.red);
            g.setFont(new Font("微软雅黑",Font.BOLD,40)); //字体
            g.drawString("按下空格开始游戏或暂停游戏",200,300);
            g.drawString("WSAD为方向",250,400);
        }
        if(isFile == true){
            g.setColor(Color.red);
            g.setFont(new Font("微软雅黑",Font.BOLD,40)); //字体
            g.drawString("Game Over",200,300);
            g.drawString("分数为" + length,250,400);
            g.drawString("按下空格重新开始",300,500);
        }
    }

    //监听键盘
    @Override
    public void keyPressed(KeyEvent e) { //按下 未释放
        //获取按下的键盘是啥
        int keyCode = e.getKeyCode();
        if(keyCode == KeyEvent.VK_SPACE) {
            if(isFile)
            {
                isFile = false;
                init();
            }
            else{
                isStart = !isStart;
            }
            repaint();//刷新
        }
        else if(keyCode == KeyEvent.VK_W){
            fx = "U";
        }
        else if(keyCode == KeyEvent.VK_S){
            fx = "D";
        }
        else if(keyCode == KeyEvent.VK_A){
            fx = "L";
        }
        else if(keyCode == KeyEvent.VK_D){
            fx = "R";
        }
    }

    // 定时器
    @Override
    public void actionPerformed(ActionEvent e) {
        if(isStart&& isFile == false){
            for(int i = length - 1; i > 0; -- i)
            {
                snake_X[i] = snake_X[i - 1];
                snake_Y[i] = snake_Y[i - 1];
            }

            //UDLR
            if(fx == "U") snake_Y[0] -=25;
            else if(fx == "D") snake_Y[0] += 25;
            else if(fx == "L") snake_X[0] -= 25;
            else snake_X[0] += 25;

            if(snake_X[0] > 825) snake_X[0] = 50;
            if(snake_X[0] < 50) snake_X[0] = 825;
            if(snake_Y[0] > 625) snake_Y[0] = 100;
            if(snake_Y[0] < 100) snake_Y[0] = 625;

            //eat food
            if(snake_X[0] == foodx && snake_Y[0] == foody)
            {
                length ++;
                //重新生成食物
                foodx = 50 + 25 * random.nextInt(32);
                foody = 100 + 25 * random.nextInt(22);
            }

            //撞
            for(int i = 1; i < length; ++ i)
                if(snake_X[0] == snake_X[i] && snake_Y[0] == snake_Y[i])
                    isFile = true;

            repaint();
        }
        //timer.start();
    }

    @Override
    public void keyTyped(KeyEvent e) { //键盘按下、弹起
    }
    @Override
    public void keyReleased(KeyEvent e) { //释放
    }
}

3. Data

//用于存放外部数据
package Snake;

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

//用URL获取图片的资源
//public static URL  = Data.class.getResource("/Static/.png");
//public static ImageIcon  = new ImageIcon();
public class Data {
    //广告栏
    public static URL headerURL = Data.class.getResource("/Static/header.png"); //通过地址找资源
    public static ImageIcon header = new ImageIcon(headerURL); //把headerURL放进来
    //头部
    public static URL upURL = Data.class.getResource("/Static/up.png");
    public static URL downURL = Data.class.getResource("/Static/down.png");
    public static URL leftURL = Data.class.getResource("/Static/left.png");
    public static URL rightURL = Data.class.getResource("/Static/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("/Static/body.png");
    public static ImageIcon body = new ImageIcon(bodyURL);
    //食物
    public static URL foodURL = Data.class.getResource("/Static/food.png");
    public static ImageIcon food = new ImageIcon(foodURL);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值