java实现小游戏贪吃蛇

界面类:

public class JFarmDemo {
    /**
     * mJFrame第一次显示的窗体,游戏开始前选择游戏难度的窗体
     * jFrame 点击开始按钮后显示的窗体,游戏正在运行的窗体
     *
     */
    private static JFrame mJFrame, jFrame;
    private static JLabel mJLabel, mJLabel1;
    private static JPanel mJPanel, mJPanel2;
    private static JButton mJButton, mJButton2;
    private static JSpinner mJSpinner;
    private static String[] strings;
    private static int number = 20;

    public JFarmDemo() {
        init_J();
        mJFrame.setBounds(500, 200, 300, 450);
        mJFrame.setBackground(Color.BLUE);
        mJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mJFrame.setLayout(new BorderLayout(10, 10));
        mJPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10));
        mJPanel.add(mJButton);
        mJPanel.add(mJLabel1);
        SpinnerModel model = new SpinnerListModel(strings);
        mJSpinner = new JSpinner(model);
        mJSpinner.setSize(50, 50);
        mJPanel.add(mJSpinner);
        mJPanel.add(mJButton2);
        ImageIcon mIcon = new ImageIcon("image/snakeback.png");
        mJLabel = new JLabel(mIcon);
        mJPanel2.add(mJLabel);
        mJFrame.add(mJPanel, BorderLayout.SOUTH);
        mJFrame.add(mJPanel2, BorderLayout.CENTER);
        mJFrame.setResizable(false);
        mJFrame.setVisible(true);
        Listen();
    }

    private void init_J() {
        mJFrame = new JFrame("贪吃蛇");
        jFrame = new JFrame("游戏界面");
        mJPanel = new JPanel();
        mJPanel2 = new JPanel();
        mJButton = new JButton("开始");
        mJLabel1 = new JLabel("选择难度");
        mJButton2 = new JButton("退出");
        strings = new String[]{"简单", "一般", "困难"};
    }

    private void Listen() {
        mJButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                mJFrame.setVisible(false);
                jFrame.getContentPane().setBackground(Color.CYAN);
                Snake snake = new Snake(number, 300, 440);
                snake.setBackground(Color.BLUE);
                jFrame.add(snake);
                jFrame.setBounds(500, 200, 320, 480);
                jFrame.setResizable(false);
                jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                jFrame.setVisible(true);

            }
        });
        mJSpinner.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent changeEvent) {
                switch (mJSpinner.getValue().toString()) {
                    case "简单":
                        number = 20;
                        break;
                    case "一般":
                        number = 15;
                        break;
                    case "困难":
                        number = 10;
                        break;
                    default:
                        break;
                }

            }
        });
        mJButton2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                mJFrame.dispose();
            }
        });
    }
}

蛇头坐标:

public class Head { 
	public int x; 
	public int y; 
}

蛇动作:

public class Snake extends JComponent implements KeyListener {

    private static List<Head> headList = new ArrayList<>();
    private static int mSecretion;
    private static boolean isRuning = true;
    private static boolean iseating = true;
    private static boolean isChange = false;
    private static int a, b, space ;
    private static int weight, high;

    public Snake(final int number, int weight, int high) {
        Snake.weight = weight;
        Snake.high = high;
        space = number;
        this.setFocusable(true);  // 获取焦点
        this.addKeyListener(this); // 监听键盘事件
        headList.add(new Head());
        a = 4;
        b = 5;
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (isRuning) {
                    try {
                        Thread.sleep(100);
                        repaint();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

            }
        }).start();
    }

    @Override
    protected void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);
        for (int i = 1; i <= weight / space; i++) {
            graphics.drawLine(i * space, 0, i * space, high);
        }
        for (int i = 1; i <= high / space; i++) {
            graphics.drawLine(0, i * space, weight, i * space);
        }
        graphics.setColor(Color.BLUE);
        if (isChange) {
            isChange = false;
            a = new Random().nextInt(14) + 1;
            b = new Random().nextInt(21) + 1;
        }
        graphics.fillRect(a * space, b * space, space, space);
        graphics.setColor(Color.BLACK);

        for (int i = 0; i < headList.size(); i++) {
            if (i==0){
                graphics.setColor(Color.RED);
            }else {
                graphics.setColor(Color.BLACK);
            }
            graphics.fillRect(headList.get(i).x, headList.get(i).y, space, space);
        }
        snakeMove(headList, mSecretion);

        if (iseating) {
            headList.remove(headList.size() - 1);
        }
        iseating = true;

    }

    public void snakeMove(List<Head> heads, int mSnakedirection) {
        Head mOldHead = heads.get(0);
        Head mNewheads = new Head();
        switch (mSnakedirection) {
            //上
            case 1:
                mNewheads.x = mOldHead.x;
                mNewheads.y = mOldHead.y - space;
                break;
            //下
            case 2:
                mNewheads.x = mOldHead.x;
                mNewheads.y = mOldHead.y + space;
                break;
            //左
            case 3:
                mNewheads.x = mOldHead.x + space;
                mNewheads.y = mOldHead.y;
                break;
            //右
            case 4:
                mNewheads.x = mOldHead.x - space;
                mNewheads.y = mOldHead.y;
                break;
        }
        Crossing(mNewheads.x, mNewheads.y);
        EatMyself(heads);
        EatFood(mNewheads.x, mNewheads.y);
        Sanme(heads);
        heads.add(0, mNewheads);

    }

    /**
     * 越界
     *
     * @param x
     * @param y
     */
    private void Crossing(int x, int y) {
        if ((x < 0 || x > 280) || (y < 0 || y > 420)) {
            isRuning = false;
        }
    }

    /**
     * 碰到自己
     */
    private void EatMyself(List<Head> heads) {
        for (int i = 1; i < heads.size(); i++) {
            if (heads.get(0).x == heads.get(i).x && heads.get(0).y == heads.get(i).y) {
                isRuning = false;
            }
        }
    }

    /**
     * 吃到食物
     */
    private void EatFood(int x, int y) {
        if (x == a * space && y == b * space) {
            iseating = false;
            isChange = true;
        }
    }

    /**
     * 避免食物与蛇体重合
     */
    private void Sanme(List<Head> heads) {
        for (int i = 0; i < heads.size(); i++) {
            if (a == heads.get(i).x && b == heads.get(i).y) {
                a = new Random().nextInt(14) + 1;
                b = new Random().nextInt(21) + 1;
            }
        }
    }

    @Override
    public void keyTyped(KeyEvent keyEvent) {

    }

    @Override
    public void keyPressed(KeyEvent keyEvent) {
        int keyCode = keyEvent.getKeyCode();
//        System.out.print("键盘值:" + keyCode + "\n");
        //上
        if ((keyCode == 87 || keyCode == 38) && mSecretion != 2) {
            mSecretion = 1;
        }
        //下
        else if ((keyCode == 83 || keyCode == 40) && mSecretion != 1) {
            mSecretion = 2;
        }//左
        else if ((keyCode == 68 || keyCode == 39 )&& mSecretion != 4) {
            mSecretion = 3;

        }//右
        else if ((keyCode == 65 || keyCode == 37 )&& mSecretion != 3) {
            mSecretion = 4;

        }
    }

    @Override
    public void keyReleased(KeyEvent keyEvent) {

    }
}

启动类:

public class StartUp {
	public static void main(String[] strings) {
        JFarmDemo mJFarmDemo = new JFarmDemo();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值