java swing实现贪吃蛇

gitee仓库地址:

misaka10000/javaswing实现贪吃蛇 (gitee.com)https://gitee.com/misaka10000/java-swing-implements-snake

蛇由 LinkedList<Node> 组成,每个Node包含x,y坐标

思路主要为:

1.初始化界面并绘制棋盘。

2.设置定时任务Timer()让蛇移动 。

3.监听键盘,每次↑↓←→被点击时新增一个节点并删除原链表的最后一个节点实现方向的移动。

4.随机设置食物(节点),蛇吃到食物时便在头部新增一个节点。

视图初始化:

private void initFrame(){
    this.setSize(615,610);
    this.setLocation(250,10);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);
    this.setBackground(new Color(245, 206, 206));
}

 游戏界面绘制:

private void initGamePanel(){
    jPanel = new JPanel(){
        @Override
        public void paint(Graphics g) {
            //清空棋盘
            g.clearRect(0,0,600,600);

            //绘制横线
            for (int i = 0; i <= 40; i++) {
                g.drawLine(0,i*15,600,i*15);
            }
            //绘制竖线
            for (int i = 0; i <= 40; i++) {
                g.drawLine(i*15,0,i*15,600);
            }

            //绘制蛇
            LinkedList<Node> body = snake.getBody();
            for (Node node : body) {
                g.fillRect(node.getX()*15,node.getY()*15,15,15);
            }
            //绘制食物
            g.fillRect(food.getX()*15,food.getY()*15,15,15);
        }
    };
    this.add(jPanel);
}

初始化蛇:

private void initSnake() {
    this.snake = new Snake();
}

Snake实现:

private void initSnake(){
    this.body = new LinkedList<>();
    body.add(new Node(16,20));
    body.add(new Node(17,20));
    body.add(new Node(18,20));
    body.add(new Node(19,20));
    body.add(new Node(20,20));
    body.add(new Node(21,20));

}

设置定时任务(蛇的移动):

private void initTimer() {
    this.timer = new Timer();
    TimerTask timerTask = new TimerTask(){
        @Override
        public void run() {
            snake.move();
            //判断蛇头是否和食物重合
            Node head = snake.getBody().getFirst();
            if(head.getX()==food.getX()&&head.getY()==food.getY()){
                snake.eat(food);
                food.random();
            }

            //重新绘制棋盘
            jPanel.repaint();
        }
    };
    //每100毫秒,执行一次监听事件
    timer.scheduleAtFixedRate(timerTask,0,100);
}

move方法实现:

public void move() {
    if(isLiving){
        Node head = body.getFirst();
        switch (direction){
            case UP:
                //在蛇头的上边添加一个节点
                body.addFirst(new Node(head.getX(),head.getY()-1));
                break;
            case DOWN:
                body.addFirst(new Node(head.getX(),head.getY()+1));
                break;
            case LEFT:
                body.addFirst(new Node(head.getX()-1,head.getY()));
                break;
            case RIGHT:
                body.addFirst(new Node(head.getX()+1,head.getY()));
                break;
        }
        //删除最后的节点
        body.removeLast();

        //判断蛇是否撞墙
        head=body.getFirst();
        if(head.getX()<0||head.getY()<0||head.getX()>=40||head.getY()>=40){
            isLiving=false;
        }

        //判断蛇是否碰到自己的身体
        for (int i = 1; i < body.size(); i++) {
            Node node = body.get(i);
            if(head.getX()==node.getX()&&head.getY()==node.getY()){
                isLiving=false;
            }
        }
    }
}

键盘监听事件(感知 ↑↓←→)

private void setKeyListener() {
    addKeyListener(new KeyAdapter() {
        //当键盘按下时,会自动掉此方法
        @Override
        public void keyPressed(KeyEvent e) {
            //键盘中的一个键都有一个编号
            switch (e.getKeyCode()){

                case KeyEvent.VK_UP: //上键
                    if(snake.getDirection()!=Direction.DOWN){
                        snake.setDirection(Direction.UP);
                    }
                    break;
                case KeyEvent.VK_DOWN: //下键
                    if(snake.getDirection()!=Direction.UP){
                        snake.setDirection(Direction.DOWN);
                    }
                    break;
                case KeyEvent.VK_LEFT: //左键
                    if(snake.getDirection()!=Direction.RIGHT){
                        snake.setDirection(Direction.LEFT);
                    }
                    break;
                case KeyEvent.VK_RIGHT: //右键
                    if(snake.getDirection()!=Direction.LEFT){
                        snake.setDirection(Direction.RIGHT);
                    }
                    break;
            }
        }
    });
}

初始化食物:

//初始化食物
private void initFood() {
    food=new Node();
    food.random();
}
public void random(){
    Random random = new Random();
    this.x = random.nextInt(40);
    this.y = random.nextInt(40);
}

eat方法(类似于键盘监听实现):

public void eat(Node food) {
    //获取蛇头
    Node head = body.getFirst();
    switch (direction){
        case UP:
            //在蛇头的上边添加一个节点
            body.addFirst(new Node(head.getX(),head.getY()-1));
            break;
        case DOWN:
            body.addFirst(new Node(head.getX(),head.getY()+1));
            break;
        case LEFT:
            body.addFirst(new Node(head.getX()-1,head.getY()));
            break;
        case RIGHT:
            body.addFirst(new Node(head.getX()+1,head.getY()));
            break;
    }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 实现贪吃蛇Java 代码是一个比较复杂的项目,需要综合运用多种知识点,包括图形绘制、事件监听、数据结构、算法等。 如果你是初学者,可以先从最简单的版本开始,例如只有一个方向控制,然后再逐渐添加复杂的功能。 以下是一份简单的 Java 代码示例: ``` import java.awt.Color; import java.awt.Graphics; import java.awt.Point; import java.util.ArrayList; import javax.swing.JFrame; import javax.swing.JPanel; public class SnakeGame extends JPanel { private static final long serialVersionUID = 1L; private ArrayList<Point> snake; private int xDirection = 10; private int yDirection = 0; public SnakeGame() { snake = new ArrayList<Point>(); for (int i = 0; i < 5; i++) { snake.add(new Point(300 + i * 10, 300)); } } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.GREEN); for (Point p : snake) { g.fillRect(p.x, p.y, 10, 10); } } public static void main(String[] args) { JFrame frame = new JFrame(); SnakeGame game = new SnakeGame(); frame.add(game); frame.setSize(600, 600); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } ``` 这份代码仅仅是一个简单的示例,实际项目中需要添加更多功能,例如:控制方向、碰撞检测、分数统计等。 ### 回答2: 贪吃蛇是一款经典的游戏,可以用Java代码来实现。下面是一个简单的贪吃蛇游戏实现示例: 首先,我们需要定义贪吃蛇的数据结构,包括蛇的长度、方向和每个身体部分的坐标。 ```java public class Snake { private LinkedList<Point> body; private Direction direction; private int length; // 构造函数 public Snake() { body = new LinkedList<>(); direction = Direction.RIGHT; // 初始方向向右 length = 1; // 初始长度为1 Point head = new Point(0, 0); // 初始头部坐标 body.add(head); } // 蛇移动 public void move() { Point head = body.getFirst(); Point newHead = new Point(head.x, head.y); // 根据方向移动头部 switch (direction) { case UP: newHead.y--; break; case DOWN: newHead.y++; break; case LEFT: newHead.x--; break; case RIGHT: newHead.x++; break; } // 将新的头部加入蛇身体 body.addFirst(newHead); // 如果长度超过了蛇的长度,就将末尾去除 if (body.size() > length) { body.removeLast(); } } // 蛇改变方向 public void changeDirection(Direction newDirection) { // 不能直接反向改变方向,避免蛇头和身体相撞 if (direction == Direction.UP && newDirection != Direction.DOWN || direction == Direction.DOWN && newDirection != Direction.UP || direction == Direction.LEFT && newDirection != Direction.RIGHT || direction == Direction.RIGHT && newDirection != Direction.LEFT) { direction = newDirection; } } // 获取蛇的身体 public LinkedList<Point> getBody() { return body; } // 蛇吃食物 public void eatFood() { length++; // 长度加一 } } ``` 然后,我们需要定义贪吃蛇的方向和游戏界面。 ```java public enum Direction { UP, DOWN, LEFT, RIGHT } public class Game { private Snake snake; public Game() { snake = new Snake(); } public void start() { // 游戏逻辑 } public void draw() { // 游戏界面绘制 } public static void main(String[] args) { Game game = new Game(); game.start(); } } ``` 通过添加游戏逻辑和界面绘制的代码,即可完成一个简单的Java贪吃蛇游戏。以上只是一个简单的实现示例,可以根据需求进行扩展,比如添加食物、判断蛇是否撞墙或自身等功能。 ### 回答3: 贪吃蛇是一款非常经典的游戏,下面我用300字介绍一下如何使用Java代码来实现贪吃蛇的游戏。 首先,我们需要创建一个游戏界面,可以使用Java中的Swing或者JavaFX来创建一个窗口。在窗口中,我们可以使用一个二维数组来表示整个游戏区域。数组的每个元素可以表示一个格子的状态,包括空格、食物或者蛇的身体。 接下来,我们需要定义蛇的类。蛇可以由若干个节点组成,每个节点都有一个位置和一个方向。蛇的移动可以通过修改每个节点的位置来实现。当蛇吃到食物时,需要增加一个新的节点。 然后,我们需要定义食物的类。食物的位置可以随机生成,并在游戏界面中显示出来。当蛇吃到食物时,需要重新生成一个食物。 接下来,我们需要定义游戏的逻辑。游戏开始时,蛇的初始位置和方向是固定的。我们可以使用一个计时器来控制蛇的移动速度,每次计时器触发时,蛇按照当前的方向移动一格。 在移动过程中,需要判断蛇是否撞到了墙壁或者自己的身体,如果是的话,游戏结束。当蛇吃到了食物时,需要更新蛇的节点和分数。 最后,我们需要在游戏界面上显示分数和游戏结束的提示信息。当游戏结束时,可以弹出一个对话框显示最终得分,并询问是否重新开始游戏。 以上就是我用300字介绍如何使用Java代码实现贪吃蛇的游戏。当然,具体的代码实现还需要考虑很多细节,比如键盘事件的处理、界面的布局等等。希望对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值