我用这个看效果:一个基本滴Java窗口带按键检测

本文介绍了一个简单的Java程序,用于创建一个带有键盘监听功能的绘图窗口。该程序利用了AWT库中的Frame和Graphics类来实现窗口的显示与绘制,并通过KeyListener接口实现了键盘按键的检测功能。

一个Java窗口带按键检测(跑Java可视小程序时用),沒加修饰,俺自己用滴。

<think>嗯,用户想要用Java一个用WASD控制的贪吃蛇游戏。首先,我需要回忆一下Java中如何实现图形界面,通常会用Swing或者JavaFX。考虑到用户可能是初学者,Swing可能更容易上手。 贪吃蛇的基本结构包括蛇的移动、食物生成、碰撞检测和用户输入处理。WASD控制的话,需要监听键盘事件,将W对应上,S对应下,A左,D右。不过要注意,不能180度转弯,比如当前方向是右,按A左键的话应该无效,必须等蛇头转向后才能反向。 接下来,得考虑游戏循环。可能需要用javax.swing.Timer来定期更新游戏状态。每次循环,蛇头按当前方向移动,检查是否吃到食物,或者撞到墙壁、自身。 蛇的身体可以用一个链表或数组来保存每个节点的坐标。食物生成时要确保不在蛇的身体上。碰撞检测包括检测是否碰到自身或者边界。 然后,绘制部分,需要继承JPanel并重写paintComponent方法,绘制蛇的身体和食物。 可能的难点是方向控制的逻辑,确保不能反向移动,以及蛇身体的移动处理。每次移动时,蛇头向前,身体各节点依次移动到前一个节点的位置。 还需要处理游戏结束的条件,比如碰撞后弹出提示或者停止游戏循环。 测试的时候要注意边界情况,比如蛇在边缘时移动,食物生成的位置是否正确,以及蛇身体增长的情况。 最后,代码结构需要清晰,可能分为初始化界面、游戏逻辑处理、绘制和事件监听几个部分。可能需要用到的类包括JFrame、JPanel、KeyListener和Timer。 现在,把这些思路整理成代码,确保各部分协调工作,没有逻辑错误。然后测试一下,看看是否有bug,比如方向控制是否流畅,食物生成是否正确,游戏结束条件是否触发等。</think>好的!下面是一个使用Java Swing实现的简易版贪吃蛇游戏代码,支持WASD方向控制。代码包含详细注释: ```java import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.LinkedList; import java.util.Random; public class SnakeGame extends JFrame { // 游戏区域尺寸(单位:格子) private static final int GRID_SIZE = 20; private static final int TILE_SIZE = 20; private GamePanel gamePanel; private Timer timer; private Direction direction = Direction.RIGHT; private LinkedList<Point> snake = new LinkedList<>(); private Point food; private boolean isGameOver = false; // 方向枚举 private enum Direction { UP, DOWN, LEFT, RIGHT } public SnakeGame() { // 初始化窗口 setTitle("WASD贪吃蛇"); setSize(GRID_SIZE * TILE_SIZE, GRID_SIZE * TILE_SIZE); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); // 初始化游戏面板 gamePanel = new GamePanel(); add(gamePanel); // 初始化蛇(起始3节) snake.add(new Point(5, 5)); snake.add(new Point(4, 5)); snake.add(new Point(3, 5)); // 生成食物 spawnFood(); // 设置定时器(控制游戏速度) timer = new Timer(150, e -> gameUpdate()); timer.start(); // 添加键盘监听 addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { handleKeyPress(e.getKeyChar()); } }); setVisible(true); } // 游戏逻辑更新 private void gameUpdate() { if (isGameOver) return; // 移动蛇头 Point head = snake.getFirst(); Point newHead = new Point(head); switch (direction) { case UP: newHead.y--; break; case DOWN: newHead.y++; break; case LEFT: newHead.x--; break; case RIGHT: newHead.x++; break; } // 碰撞检测 if (newHead.x < 0 || newHead.x >= GRID_SIZE || newHead.y < 0 || newHead.y >= GRID_SIZE || snake.contains(newHead)) { gameOver(); return; } // 添加新头部 snake.addFirst(newHead); // 吃到食物检测 if (newHead.equals(food)) { spawnFood(); } else { snake.removeLast(); // 没吃到食物则移动 } gamePanel.repaint(); } // 生成新食物 private void spawnFood() { Random rand = new Random(); do { food = new Point( rand.nextInt(GRID_SIZE), rand.nextInt(GRID_SIZE) ); } while (snake.contains(food)); // 确保不在蛇身上 } // 处理按键输入 private void handleKeyPress(char key) { key = Character.toLowerCase(key); switch (key) { case 'w': if (direction != Direction.DOWN) direction = Direction.UP; break; case 's': if (direction != Direction.UP) direction = Direction.DOWN; break; case 'a': if (direction != Direction.RIGHT) direction = Direction.LEFT; break; case 'd': if (direction != Direction.LEFT) direction = Direction.RIGHT; break; } } // 游戏结束处理 private void gameOver() { isGameOver = true; timer.stop(); JOptionPane.showMessageDialog(this, "游戏结束!得分:" + (snake.size() - 3)); } // 游戏绘制面板 private class GamePanel extends JPanel { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 绘制背景 g.setColor(Color.BLACK); g.fillRect(0, 0, getWidth(), getHeight()); // 绘制蛇 g.setColor(Color.GREEN); for (Point p : snake) { g.fillRect(p.x * TILE_SIZE, p.y * TILE_SIZE, TILE_SIZE - 1, TILE_SIZE - 1); } // 绘制食物 g.setColor(Color.RED); g.fillOval(food.x * TILE_SIZE, food.y * TILE_SIZE, TILE_SIZE - 1, TILE_SIZE - 1); } } public static void main(String[] args) { new SnakeGame(); } } ``` 代码特点说明: 1. **控制方式**: - W:向上移动 - S:向下移动 - A:向左移动 - D:向右移动 - 自动防止180度急转弯 2. **游戏规则**: - 蛇头碰到墙壁或自身时游戏结束 - 吃到红色食物会增长身体 - 游戏速度固定(可通过修改Timer参数调整) 3. **实现要点**: - 使用`LinkedList`存储蛇的身体坐标 - 通过`Swing Timer`实现游戏循环 - 使用`KeyListener`处理键盘输入 - 碰撞检测包含边界和自身检测 4. **扩展建议**: ```java // 可调整参数示例: private static final int GRID_SIZE = 25; // 扩大游戏区域 private static final int TILE_SIZE = 25; // 调整格子大小 timer = new Timer(100, ...); // 加快游戏速度 ``` 运行方法:直接复制代码到`SnakeGame.java`文件中,使用Java编译器运行即可。游戏窗口会自动弹出,使用WASD键控制蛇的移动方向。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值