shaokel 2019-06-15 20:41 采纳率: 95.2%
浏览 301
已采纳

请求大佬支援!贪吃蛇游戏:为什么我按住方向键不放时,我的贪吃蛇像卡的一样

package game;

import java.awt.Button;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

public class Window extends JFrame implements Runnable {
    static int x1 = 500;// 蛇头横坐标
    static int y1 = 400;// 蛇头纵坐标
    Button b[] = new Button[50];// 蛇数组
    Button fruit = new Button();// 水果
    boolean flag = true;// 判断是否吃到果实
    int x, y;// 水果坐标
    Thread t;
    int reverse;// 方向
    boolean reve = true;// 方向标志

    public Window() {
        t = new Thread(this);

        b[0] = new Button();// 蛇头
        b[0].setBounds(x1, y1, 20, 20);
        b[0].setBackground(Color.blue);
        add(b[0]);

        for (int i = 1; i < 50; i++) {
            b[i] = new Button();// 蛇长度
        }

        if (flag) {// 水果的随机位置
            while (flag) {
                x = (int) (25 + Math.random() * 1175);
                y = (int) (1 + Math.random() * 800);
                System.out.println("x-->" + x);
                System.out.println("y-->" + y);
                fruit.setBounds(x, y, 20, 20);
                fruit.setBackground(Color.yellow);
                add(fruit);
                flag = false;
            }
        }

        setLayout(null);
        setTitle("Retro Snaker");
        setSize(1200, 800);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public void run() {
        while (true) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            switch (reverse) {
            case 0:// 上
            {
                y1 -= 20;
                b[0].setBounds(x1, y1, 20, 20);
                break;
            }
            case 1:// 下
            {
                y1 += 20;
                b[0].setBounds(x1, y1, 20, 20);
                break;
            }
            case 2:// 左
            {
                x1 -= 20;
                b[0].setBounds(x1, y1, 20, 20);
                break;
            }
            case 3:// 右
            {
                x1 += 20;
                b[0].setBounds(x1, y1, 20, 20);
                break;
            }
            default:
                break;
            }
        }
    }
}

class Move extends Window implements ActionListener, KeyListener {
    Window w;
    Button go;// 开始按键

    public Move() {

        go = new Button("开始");
        go.setBounds(25, 0, 50, 25);
        go.addActionListener(this);
        add(go);
    }

    public void keyTyped(KeyEvent e) {

    }

    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_UP) {// 上
            y1 -= 20;
            reverse = 0;
            System.out.println("上");
        }
        if (e.getKeyCode() == KeyEvent.VK_DOWN) {// 下
            y1 += 20;
            reverse = 1;
            System.out.println("下");
        }
        if (e.getKeyCode() == KeyEvent.VK_LEFT) {// 左
            x1 -= 20;
            reverse = 2;
            System.out.println("左");
        }
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {// 右
            x1 += 20;
            reverse = 3;
            System.out.println("右");
        }
        this.repaint();
    }

    public void keyReleased(KeyEvent e) {

    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == go) {
            t.start();
            go.addKeyListener(this);
        }
    }
}
  • 写回答

1条回答 默认 最新

  • 壹之形 2019-06-17 10:06
    关注

    你可以先设定一个boolean来作为标志(按键后生效),然后起一个新线程来循环触发你的业务逻辑。键盘长按事件也就是以一定的频率触发持续触发的keypressed事件,这样就能避免键盘从按下到识别为长按的空白区

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月9日

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。