Java-贪吃蛇游戏

前言

此实现较为简陋,如有错误请指正。
其次代码中的图片需要自行添加地址并修改。

主类

public class Main {
    public static void main(String[] args) {
        new myGame();
    }
}

游戏类

import javax.swing.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.*;
import java.util.Timer;

public class myGame extends JFrame implements KeyListener {

    private int[] foodPos; // 食物位置坐标
    private List<int[]> coordinateS;    // 总地址
    private int score = 0;   // 玩家得分
    private Random random;
    private final String cell = "img/cell.png";  //格子地址
    private int keyCode = -1;

    public myGame() {
        random = new Random();
        foodPos = new int[]{-1, -1};   // 初始化为-1
        // 创建一个定时器
        Timer gameTimer = new Timer();
        // 设置定时器
        gameTimer.schedule(new timer(), 0, 200);

        InitCoordinate();   // 初始化格子地址
        InitJFrame();       // 初始化窗体
        LoadPicture();      // 加载图片
    }

    // 初始化地址
    private void InitCoordinate() {
        coordinateS = new ArrayList<>();
        coordinateS.add(new int[]{200, 200});
        coordinateS.add(new int[]{200, 200});
        this.getContentPane().removeAll();  // 清空图片显示
    }

    // 加载图片
    public void LoadPicture() {
        this.getContentPane().removeAll();  // 清空图片显示

        // 目前得分展示
        JLabel scoreTips = new JLabel("目前得分:" + score);
        scoreTips.setBounds(500, 10, 100, 20);
        this.getContentPane().add(scoreTips);

        // 提示
        JLabel Tips = new JLabel(" 按下任意方向键 

即开始游戏 "
); Tips.setBounds(500, 100, 100, 60); Tips.setVerticalTextPosition(1); this.getContentPane().add(Tips); // 上 for (int i = 0, x = 0; i < 25; i++, x += 20) { JLabel upImg = new JLabel(new ImageIcon(cell)); // 获取图片对象 upImg.setBounds(x, 0, 20, 20); // 设置图片位置与宽高 this.getContentPane().add(upImg); // 将图片添加到窗口中 } // 左 for (int i = 0, y = 20; i < 21; i++, y += 20) { JLabel upImg = new JLabel(new ImageIcon(cell)); // 获取图片对象 upImg.setBounds(0, y, 20, 20); // 设置图片位置与宽高 this.getContentPane().add(upImg); // 将图片添加到窗口中 } //右 for (int i = 0, y = 20; i < 21; i++, y += 20) { JLabel upImg = new JLabel(new ImageIcon(cell)); // 获取图片对象 upImg.setBounds(480, y, 20, 20); // 设置图片位置与宽高 this.getContentPane().add(upImg); // 将图片添加到窗口中 } // 下 for (int i = 0, x = 0; i < 25; i++, x += 20) { JLabel upImg = new JLabel(new ImageIcon(cell)); // 获取图片对象 upImg.setBounds(x, 440, 20, 20); // 设置图片位置与宽高 this.getContentPane().add(upImg); // 将图片添加到窗口中 } // 显示 “ 蛇 ” for (int i = 0, n = coordinateS.size(); i < n; ++i) { int[] data = coordinateS.get(i); JLabel CellImg = new JLabel(new ImageIcon(cell)); // 获取图片对象 CellImg.setBounds(data[0], data[1], 10, 10); // 设置图片位置与宽高 this.getContentPane().add(CellImg); // 将图片添加到窗口中 } // 设置 “ 食物 ” 位置 if (foodPos[0] != -1 && foodPos[1] != -1) { JLabel TargetImg = new JLabel(new ImageIcon("img/targetCell.png")); // 获取图片对象 TargetImg.setBounds(foodPos[0], foodPos[1], 10, 10); // 设置图片位置与宽高 this.getContentPane().add(TargetImg); // 将图片添加到窗口中 } this.getContentPane().repaint(); // 刷新窗口显示 } // 初始化窗体 private void InitJFrame() { this.setSize(620, 507); // 设置大小 this.setAlwaysOnTop(true); // 顶层显示方法 this.setLocationRelativeTo(null); // 将窗口位置设置为屏幕中心 this.addKeyListener(this); // 为窗口设置键盘监听 this.setDefaultCloseOperation(this.EXIT_ON_CLOSE); //设置关闭模式 this.setVisible(true); //设置为显示 } @Override public void keyTyped(KeyEvent e) {} // 按键按下立即执行 @Override public void keyReleased(KeyEvent e) {} // 按键被释放时生效 /*按键被按下时执行*/ @Override public void keyPressed(KeyEvent e) { int code = e.getKeyCode(); // 获取刚才按下的按键 if (!(code >= 37 && code <= 40)) { return; } // 排除非方向键的操作 this.keyCode = -1; // 关闭定时器 this.keyCode = Key_Detection(code); // 重新赋值 } // 按键操作 private int Key_Detection(int code) { // 获取当前位置坐标 int[] curCoordinate = coordinateS.get(0); /* 上 */ if (38 == code && curCoordinate[1] != 20) { curCoordinate[1] -= 10; } /* 下 */ else if (40 == code && curCoordinate[1] != 430) { curCoordinate[1] += 10; } /* 左 */ else if (37 == code && curCoordinate[0] != 20) { curCoordinate[0] -= 10; } /* 右 */ else if (39 == code && curCoordinate[0] != 470) { curCoordinate[0] += 10; } else { gameOver(); } // 撞墙了,游戏结束 // 当方块与目标方块重合时 if (curCoordinate[0] == foodPos[0] && curCoordinate[1] == foodPos[1]) { ++score; foodPos[0] = -1; foodPos[1] = -1; // 尾部新增 int[] tail = coordinateS.get(coordinateS.size() - 1); coordinateS.add(Arrays.copyOf(tail, tail.length)); } if (foodPos[0] == -1 && foodPos[1] == -1) { int x = random.nextInt(420) + 20; int y = random.nextInt(400) + 20; foodPos[0] = x - (x % 10); foodPos[1] = y - (y % 10); } for (int i = 1, n = coordinateS.size(); i < n; i++) { int[] curPos = coordinateS.get(i); // 判断当前位置是否与身体格子重合 if (curCoordinate[0] == curPos[0] && curCoordinate[1] == curPos[1]) { code = -1; gameOver(); break; } } Refresh_coordinateS(); LoadPicture(); //刷新图片 return code; } // 游戏结束 private void gameOver() { // 结束消息提醒 JOptionPane.showMessageDialog(this, "游戏结束!\n 总计得分为:" + score + "分"); score = 0; foodPos[0] = -1; foodPos[1] = -1; keyCode = -1; InitCoordinate(); // 初始化地址 } // 刷新格子操作 public void Refresh_coordinateS() { for (int i = coordinateS.size() - 1; i > 0; --i) { int[] cur = coordinateS.get(i); int[] pre = coordinateS.get(i - 1); cur[0] = pre[0]; cur[1] = pre[1]; } } // 定时器类 class timer extends TimerTask { @Override public void run() { if (keyCode == -1) { return; } Key_Detection(keyCode); } } }

你可能感兴趣的:(java,游戏,开发语言)