项目二源代码

package shiyan2;


import javax.swing.*;

public class StartGame {
    public static void main(String[] args) {
        // 1.绘制一个静态窗口并设置窗口标题
        JFrame jFrame = new JFrame("贪吃蛇大作战");
        jFrame.setBounds(10, 10, 915, 750); // 设置起始坐标和窗口大小
        jFrame.setResizable(false); // 设置不可以调整窗口大小
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置可以关闭窗口

        // 2.将GamePanel添加JFrame当中
        jFrame.add(new shiyan2.GamePanel());
        jFrame.setVisible(true); // 让窗口可以展现出来
    }
}



package shiyan2;


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; // 蛇的长度
    String fx; // 方向 R:右 L:左 U:上 D:下
    int[] snakeX = new int[600]; // 蛇的X轴坐标
    int[] snakeY = new int[600]; // 蛇的Y轴坐标
    boolean isStart = false; //默认关闭
    boolean isFail = false; //游戏失败的状态
    int score; // 分数
    int num; // 食物颜色编号
    int foodX;//食物的X坐标
    int foodY;//食物的Y坐标
    Random random = new Random();//产生随机数
    int seconds = 150;
    Timer timer = new Timer(seconds, this);
    //定时器,以毫秒(ms)为单位,1000ms = 1s,
    // seconds为延迟delay,每 delay 毫秒将通知其侦听器的 Timer

    //构造器
    public GamePanel() {
        init();//获得焦点和键盘事件

        // 获取键盘监听时间
        this.setFocusable(true);
        this.addKeyListener(this);
        timer.start(); // 让时间动起来
    }

    //初始化蛇和食物
    public void init() {
        length = 3; // 初始化蛇长度为3
        fx = "R"; // 初始化蛇头方向是往右
        // 头部坐标
        snakeX[0] = 100;
        snakeY[0] = 100;
        snakeX[1] = 75;
        snakeY[1] = 100;
        snakeX[2] = 50;
        snakeY[2] = 100;
        isStart = false;
        isFail = false;

        foodX =25 * random.nextInt(1,30) ;//生成一个随机的int值
        foodY =25 * random.nextInt(3,20);
        score = 0; // 默认分数为0
        seconds = 150;

    }

    // 面板:画界面 画蛇
    // Graphics:画笔
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);//清屏
        this.setBackground(Color.pink); // 设置背景颜色
        shiyan2.Data.header.paintIcon(this, g, 200, 0); // 绘制游戏头部图片
        g.fillRect(0, 50, 900, 650); // 绘制游戏区域

        // 画一条静态的小蛇
        if ("R".equals(fx))
            shiyan2.Data.right.paintIcon(this, g, snakeX[0], snakeY[0]);
        if ("L".equals(fx))
            shiyan2.Data.left.paintIcon(this, g, snakeX[0], snakeY[0]);
        if ("U".equals(fx))
            shiyan2.Data.up.paintIcon(this, g, snakeX[0], snakeY[0]);
        if ("D".equals(fx))
            shiyan2.Data.down.paintIcon(this, g, snakeX[0], snakeY[0]);

        // 蛇的长度用length进行控制(画身体)
        for (int i = 1; i < length; i++) {
            shiyan2.Data.body.paintIcon(this, g, snakeX[i], snakeY[i]);
        }

        //画食物
        if (num == 0)
            shiyan2.Data.foodBlue.paintIcon(this, g, foodX, foodY);
        if (num == 1)
            shiyan2.Data.foodYellow.paintIcon(this, g, foodX, foodY);
        if (num == 2)
            shiyan2.Data.foodRed.paintIcon(this, g, foodX, foodY);

        // 游戏未开始时话一个字符串
        if (!isStart) {
            g.setColor(Color.white); // 设置画笔颜色
            g.setFont(new Font("微软雅黑", Font.BOLD, 40)); // 设置字体
            g.drawString("按下空格开始游戏", 300, 300);
        }
        // 游戏失败时话一个字符串
        if (isFail) {
            g.setColor(Color.pink); // 设置画笔颜色
            g.setFont(new Font("微软雅黑", Font.BOLD, 40)); // 设置字体
            g.drawString("GAME OVER 按下空格重新开始游戏", 150, 300);
        }
        //分数及长度显示
        g.setColor(Color.white);// 设置画笔颜色
        g.setFont(new Font("微软雅黑", Font.BOLD, 18));
        g.drawString("长度:" + length, 750, 25);
        g.drawString("分数:" + score, 750, 45);
    }

    //事件监听
    // 定时器,监听时间
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(snakeX[0]+","+snakeY[0]);
        // 如果游戏处于开始状态并且游戏没有结束
        if (isStart && !isFail) {
            //当蛇头坐标与食物坐标一致
            if (snakeX[0] == foodX && snakeY[0] == foodY) {
                food(snakeX,snakeY);

                // 长度加一
                length++;

                // 增加分数
                getScore(num);

                //调节速度,越来越快
                if (seconds > 75) {
                    timer.setDelay(seconds -= 1);
                }


            }

            // 右移动,后一节身体移动到前一节的位置,即snakeX[1] = snakeX[0]
            for (int i = length - 1; i > 0; i--) {
                snakeX[i] = snakeX[i - 1];
                snakeY[i] = snakeY[i - 1];
            }

            // 通过控制方向让小蛇移动
            if ("U".equals(fx)) {
                // 头部移动
                snakeY[0] -= 25;
            }
            else if ("D".equals(fx)) {
                // 头部移动
                snakeY[0] += 25;
            }
            else if ("R".equals(fx)) {
                // 头部移动
                snakeX[0] += 25;
            }
            else if ("L".equals(fx)) {
                // 头部移动
                snakeX[0] -= 25;
            }

            // 失败判定
            for (int i = 1; i < length; i++) {
                if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {
                    isFail = true;
                    break;
                }
                // 边界判断
                if (snakeY[0] < 75) {
                    isFail = true;
                    break;
                }
                // 边界判断
                if (snakeY[0] > 650) {
                    isFail = true;
                    break;
                }
                // 边界判断
                if (snakeX[0] > 850) {
                    isFail = true;
                    break;
                }
                // 边界判断
                if (snakeX[0] < 25) {
                    isFail = true;
                    break;
                }

            }

            // 刷新界面
            repaint();
        }
        timer.start(); // 让时间动起来
    }

    //随机生成一个不越界且不在蛇身上的食物
    public  void food(int[]X, int[]Y){
        // 随机生成一个食物
        foodX =25*random.nextInt(1,30) ;//生成一个随机的int值
        foodY =25 * random.nextInt(3,20);
        num = random.nextInt(0,3);
        //判断生成的食物是否出现在蛇身上
        for (int i = 1; i <length ; i++) {
            if (X[i] == foodX && Y[i] == foodY ) {
                foodX =25 * random.nextInt(1,30) ;//生成一个随机的int值
                foodY =25 * random.nextInt(3,20);
                num = random.nextInt(0,3);
            }
        }
    }

    //吃食物得分数
    public int getScore(int num){
        if (num == 0)
            score += 1;
        if (num == 1)
            score += 2;
        if (num == 2)
            score += 3;
        return score;
    }


    //键盘监听
    @Override
    public void keyPressed(KeyEvent e) {
        // 键盘按下未释放
        int keyCode = e.getKeyCode();
        // 如果按下的是空格
        if (keyCode == KeyEvent.VK_SPACE) {
            if (isFail) {
                // 重新开始游戏
                init();
                isStart = true;
                food(snakeX,snakeY);
            } else {
                // 游戏开始或者暂停
                isStart = !isStart;
            }
            // 刷新界面
            repaint();
        }
        if (keyCode == KeyEvent.VK_UP) {
            fx = "U";
        } else if (keyCode == KeyEvent.VK_DOWN) {
            fx = "D";
        } else if (keyCode == KeyEvent.VK_RIGHT) {
            fx = "R";
        } else if (keyCode == KeyEvent.VK_LEFT) {
            fx = "L";
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        // 键盘释放
    }

    @Override
    public void keyTyped(KeyEvent e) {
        // 键盘按下并释放 敲击
    }
}



package shiyan2;

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

// 存放外部数据
public class Data {

    // 游戏头部的图片
    public static ImageIcon header = new ImageIcon("C:/Users/李宁宇/Desktop/head.png");

    // 导入一些图片素材
    public static ImageIcon up = new ImageIcon("C:/Users/李宁宇/Desktop/up.png"); // 上
    public static ImageIcon down = new ImageIcon("C:/Users/李宁宇/Desktop/down.png"); // 下
    public static ImageIcon left = new ImageIcon("C:/Users/李宁宇/Desktop/left.png"); // 左
    public static ImageIcon right = new ImageIcon("C:/Users/李宁宇/Desktop/right.png"); // 右
    public static ImageIcon body = new ImageIcon("C:/Users/李宁宇/Desktop/body.png"); // 身体

    // 食物
    public static ImageIcon foodBlue = new ImageIcon("C:/Users/李宁宇/Desktop/blue.png"); // 蓝色食物,加一个长度
    public static ImageIcon foodYellow = new ImageIcon("C:/Users/李宁宇/Desktop/yellow.png"); // 黄色食物,加两个长度
    public static ImageIcon foodRed = new ImageIcon("C:/Users/李宁宇/Desktop/red.png"); // 红色食物,加三个长度
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值