注册 登录
编程论坛 JAVA论坛

贪吃蛇

林月儿 发布于 2018-10-05 21:14, 7001 次点击
看了渐渐鱼同学的贪吃蛇,调试时候居然写不由自主准备写console.log自己都发笑
代码有点多,感觉还行凑活着看吧。
发完继续刷剧咯
程序代码:
package com.huawei.game.snake;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import java.util.stream.Collectors;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Test2 extends JPanel {

    /**
     *
     
*/
    private static final long serialVersionUID = 1L;
    private static final int DEFAULT_WIDTH = 400;
    private static final int DEFAULT_HEIGHT = 400;
    private static final int UP = 0;
    private static final int LEFT = 1;
    private static final int DOWN = 2;
    private static final int RIGHT = 3;
    private static JFrame jframe = new JFrame("Snake");
    private static int dir;
    private static LinkedList<NodeObj> snake = new LinkedList<>();
    private static NodeObj apple;
    private Random rand = new Random();
    static class NodeObj {
        int x;
        int y;
        int width = 20;
        int height = 20;
        public NodeObj(int x, int y) {
            this.x = x;
            this.y = y;
        }
        public void moveUp() {
            y -= height;
            if(y < 0) {
                y = DEFAULT_HEIGHT - height;
            }
        }
        public void moveDown() {
            y += height;
            if(y + height > DEFAULT_HEIGHT) {
                y = 0;
            }
        }
        public void moveLeft() {
            x -= width;
            if(x < 0) {
                x = DEFAULT_WIDTH-width;
            }
        }
        public void moveRight() {
            x += width;
            if(x + width > DEFAULT_WIDTH) {
                x = 0;
            }
        }
    }
    public Test2() {
        NodeObj head = new NodeObj(DEFAULT_WIDTH/2, DEFAULT_HEIGHT/2);
        snake.add(head);
        apple = new NodeObj(DEFAULT_WIDTH/4, DEFAULT_HEIGHT/2);
        jframe.setAlwaysOnTop(true);
        jframe.setSize(DEFAULT_WIDTH + 20, DEFAULT_HEIGHT + 40);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jframe.setVisible(true);
        jframe.setResizable(false);
        jframe.add(this);
        jframe.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                switch(e.getKeyCode()) {
                case KeyEvent.VK_LEFT:
                    if(dir != RIGHT)
                        dir = LEFT;
                    break;
                case KeyEvent.VK_RIGHT:
                    if(dir != LEFT)
                        dir = RIGHT;
                    break;
                case KeyEvent.VK_DOWN:
                    if(dir != UP)
                        dir = DOWN;
                    break;
                case KeyEvent.VK_UP:
                    if(dir != DOWN)
                        dir = UP;
                    break;
                }
            }
        });
        new Timer().schedule(new TimerTask() {
            
            @Override
            public void run() {
                moveAction();
                checkEatAction();
                checkOver();
                repaint();
            }
        }, 10, 10);
    }
    protected void checkOver() {
        Iterator<NodeObj> iter = snake.iterator();
        NodeObj head = iter.next();
        while(iter.hasNext()) {
            NodeObj s = iter.next();
            if(s.x == head.x && s.y == head.y) {
                JOptionPane.showMessageDialog(null,"Game Over");
                System.exit(0);
            }
        }
    }
    protected void checkEatAction() {
        NodeObj head = snake.peek();
        if(apple.x == head.x && apple.y == head.y) {
            int x = head.x;
            int y = head.y;
            switch (dir) {
            case UP:
                y -= head.height;
                break;
            case DOWN:
                y += head.height;
                break;
            case LEFT:
                x -= head.width;
                break;
            case RIGHT:
                x += head.width;
                break;
            }
            NodeObj newNode = new NodeObj(x, y);
            snake.push(newNode);
            x = rand.nextInt(DEFAULT_WIDTH);
            apple.x = x - x % apple.width;
            y = rand.nextInt(DEFAULT_HEIGHT);
            apple.y = y - y % apple.height;
        }
    }
    long moveIndex = 0;
    protected void moveAction() {
        moveIndex++;
        if(moveIndex % 20 == 0) {
            // move snake
            moveBody(snake);
            moveHead(snake.peek());
        }
    }
   
    private void moveHead(NodeObj head) {
        switch (dir) {
        case UP:
            if(dir != DOWN)
                head.moveUp();
            break;
        case DOWN:
            if(dir != UP)
                head.moveDown();
            break;
        case LEFT:
            if(dir != RIGHT)
                head.moveLeft();
            break;
        case RIGHT:
            if(dir != LEFT)
                head.moveRight();
            break;
        }
    }
    private void moveBody(LinkedList<NodeObj> nodes) {
        List<NodeObj> list = nodes.stream()
                .sorted((a,b)->-1).collect(Collectors.toList());
        Iterator<NodeObj> iter = list.listIterator();
        int i = nodes.size() - 1;
        for(iter.next(); iter.hasNext(); i--) {
            NodeObj cur = iter.next();
            nodes.get(i).x = cur.x;
            nodes.get(i).y = cur.y;
        }
    }
    @Override
    public void paint(Graphics g) {
        paintArea(g);
        paintObjs(g);
    }
   
    private void paintObjs(Graphics g) {
        g.setColor(Color.BLACK);
        boolean isFirst = true;
        for(NodeObj s : snake) {
            if(isFirst) {
                g.fillArc(s.x, s.y, s.width, s.height, dir*90 + 135, 270);
            } else
                g.fillRect(s.x, s.y, s.width - 1, s.height - 1);
            isFirst = false;
        }
        g.setColor(Color.GREEN);
        g.fillOval(apple.x, apple.y, apple.width, apple.height);
    }
   
    private void paintArea(Graphics g) {
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, DEFAULT_WIDTH, DEFAULT_HEIGHT);
    }
   
    public static void main(String[] args) {
        new Test2();
    }
}
只有本站会员才能查看附件,请 登录
18 回复
#2
幻紫灵心2018-10-07 20:03
ε=(′ο`*)))100分哎
#3
悟空丨2018-10-07 21:03
这种小游戏有毒,玩了一下午~~~
#4
幻紫灵心2018-10-07 21:42
这个画蛇头有点意思...
#5
zhouzj2018-10-27 14:11
楼主,为什么把default_width和height大小改变,贪吃蛇吃不到果子呢?新手求助
#6
林月儿2018-10-27 22:02
吃不吃的到用另外一个词汇描述叫碰撞检测,我这里的碰撞检测是直接判断坐标相等,比较简单
常规的做法是判断两个对象有无重叠区域。这个视形状而论了
你改后的值应该不是20的倍数了吧,恩,这个感兴趣可以优化一下。
#7
幻紫灵心2018-10-29 20:01
回复 6楼 林月儿
好奇问下,写这个贪吃蛇用了多久?
#8
林月儿2018-10-29 22:00
半个小时吧,编译器有快捷键的
#9
陈无2018-10-30 19:01
厉害,你让我们望尘莫及,让我又有了方向,那就是好好玩这个游戏😂,待我改天设计出和升级版的
#10
tbsuluul1232018-11-28 05:37
#11
林月儿2018-11-28 23:30
回复 10楼 tbsuluul123
thanks
#12
zfx1875586562019-02-27 20:49
是个狼灭
#13
林月儿2019-02-27 22:03
回复 12楼 zfx187558656
なぜ
#14
pseudo2019-02-28 15:18
#15
编程大神L2019-03-02 23:12
版主 有个问题 不知道当讲不当讲 ,有代码了,java怎么运行这个?求指教。
#16
hongfa402019-05-04 15:34
这游戏好玩嘛?
#17
hongfa402019-05-04 15:36
楼主能不能多做点小游戏来玩啊
#18
junjiew2021-10-22 15:19
厉害厉害
#19
晓晓风2022-06-04 21:29
不错!
1