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);
}
}
}
请求大佬支援!贪吃蛇游戏:为什么我按住方向键不放时,我的贪吃蛇像卡的一样
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- 壹之形 2019-06-17 10:06关注
你可以先设定一个boolean来作为标志(按键后生效),然后起一个新线程来循环触发你的业务逻辑。键盘长按事件也就是以一定的频率触发持续触发的keypressed事件,这样就能避免键盘从按下到识别为长按的空白区
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
- ¥20 腾讯企业邮箱邮件可以恢复么
- ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
- ¥15 错误 LNK2001 无法解析的外部符号
- ¥50 安装pyaudiokits失败
- ¥15 计组这些题应该咋做呀
- ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
- ¥15 让node服务器有自动加载文件的功能
- ¥15 jmeter脚本回放有的是对的有的是错的
- ¥15 r语言蛋白组学相关问题