狂神GUI贪吃蛇免费图片资源加代码(其中逻辑有修改)

狂神GUI贪吃蛇记录

首先做一个总结:我是看完Java基础部分开始这部分学习的,当看到各种类与类之间的调用之后才发现自己的Java基础其实并没有学到什么,真的就是学会了int and for,所以只要自己不断的学习才能足够的认识到自己的问题,之后会坚持下去的,加油!!!

图片链接(不要积分的): 点击下载.

目录结构
在这里插入图片描述

代码部分:

package snake;

import javax.swing.*;

public class StartGame {
    public static void main(String[] args) {
        JFrame frame = new JFrame();

        frame.setBounds(10,10,900,720);
        frame.setResizable(false);
        frame.add(new GamePanel());
        frame.setVisible(true);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    }
}
package 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;//snack length
    int[] snackX = new  int[600];
    int[] snackY = new  int[600];
    String direct;
    boolean isStart = false;//游戏状态
    boolean isFile = false;
    int score;

    //食物坐标
    int foodX;
    int foodY;
    Random random = new Random();

    //定时器
    Timer timer = new Timer(100,this);
    @Override
    public void actionPerformed(ActionEvent e) {
        if (isStart && isFile == false) {//如果游戏是开始状态

            //吃食物
            if (snackX[0] == foodX && snackY[0] == foodY){
                length++;//长度+1
                score += 10;
                //再次生成食物
                foodX = 25+25*random.nextInt(34);
                foodY = 75+25*random.nextInt(24);
            }
            //右移
            for (int i = length-1; i > 0; i--) {
                snackX[i] = snackX[i-1];
                snackY[i] = snackY[i-1];
            }
//            for (int i = 1; i < length; i++) {
//                snackX[i] = snackX[i-1];
//                snackY[i] = snackY[i-1];
//            }
//            snackX[0] = snackX[0]+25;
//
//            if (snackX[0]>850){
//                snackX[0]=25;
//            }

            if (direct.equals("R")){
                snackX[0] = snackX[0]+25;
                if (snackX[0]>850){ snackX[0]=25; }//出边界判断
            }else if (direct.equals("L")){
                snackX[0] = snackX[0]-25;
                if (snackX[0]<25){ snackX[0]=850; }//出边界判断
            }else if (direct.equals("U")){
                snackY[0] = snackY[0]-25;
                if (snackY[0]<75){ snackY[0]=650; }//出边界判断
            }else if (direct.equals("D")){
                snackY[0] = snackY[0]+25;
                if (snackY[0]>650){ snackY[0]=75; }//出边界判断
            }

            //失败判断
            for (int i = 1; i < length ; i++) {
                if (snackX[0] == snackX[i] && snackY[0] == snackY[i]){
                    isFile = true;
                }
            }

            repaint();//重画画面
        }
        timer.start();//定时器开启
    }

    public GamePanel() {
        init();
        //获取焦点和键盘事件
        this.setFocusable(true);//获取焦点
        this.addKeyListener(this);//获得键盘监听事件
        timer.start();//游戏一开始定时器启动
    }

    //初始化
    public void init(){
        length = 3;
        snackX[0]= 100;snackY[0] = 100;//脑袋坐标
        snackX[1]= 75;snackY[1] = 100;//第一个身体最表
        snackX[2]= 50;snackY[2] = 100;
        direct = "R";
        foodX = 25+25*random.nextInt(34);
        foodY = 75+25*random.nextInt(24);
        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);

        //积分显示
        g.setColor(Color.white);
        g.setFont(new Font("微软雅黑",Font.BOLD,18));
        g.drawString("长度"+length,750,35);
        g.drawString("分数"+score,750,50);
        //身体移动动画
        for (int i = 1; i <length ; i++) {
            Data.body.paintIcon(this,g,snackX[i],snackY[i]);
        }

        switch (direct){
            case "R":
                Data.right.paintIcon(this,g,snackX[0],snackY[0]);
                break;
            case "U":
                Data.up.paintIcon(this,g,snackX[0],snackY[0]);
                break;
            case "D":
                Data.down.paintIcon(this,g,snackX[0],snackY[0]);
                break;
            case "L":
                Data.left.paintIcon(this,g,snackX[0],snackY[0]);
                break;
        }

        //游戏状态
        if(isStart==false){
            g.setColor(Color.white);
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            g.drawString("按下空格开始",300,400);
        }

        //游戏状态
        if(isFile){
            g.setColor(Color.RED);
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            g.drawString("游戏失败",300,400);
        }
//        //把小蛇画上去
//        Data.right.paintIcon(this,g,snackX[0],snackY[0]);
//        Data.body.paintIcon(this,g,snackX[1],snackY[1]);
//        Data.body.paintIcon(this,g,snackX[2],snackY[2]);

        //画食物
        Data.food.paintIcon(this,g,foodX,foodY );
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    //键盘监听器
    @Override
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if(keyCode == KeyEvent.VK_SPACE){
            if (isFile){
                //重新开始
                isFile = false;
                init();
            }else {
                isStart = !isStart;
            }
            repaint();
        }
        //小蛇移动
        if (keyCode == KeyEvent.VK_UP){
            direct = "U";
        }else if (keyCode == KeyEvent.VK_DOWN){
            direct = "D";
        }else if (keyCode == KeyEvent.VK_LEFT){
            direct = "L";
        }else if (keyCode == KeyEvent.VK_RIGHT){
            direct = "R";
        }

    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

}
package snake;

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 upURL = Data.class.getResource("statics/up.png");
    public static URL leftURL = Data.class.getResource("statics/left.png");
    public static URL rightURL = Data.class.getResource("statics/right.png");
    public static URL downURL = Data.class.getResource("statics/down.png");
    public static ImageIcon up = new ImageIcon(upURL);
    public static ImageIcon left = new ImageIcon(leftURL);
    public static ImageIcon right = new ImageIcon(rightURL);
    public static ImageIcon down = new ImageIcon(downURL);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值