1. 程式人生 > 其它 >java實現小遊戲貪吃蛇

java實現小遊戲貪吃蛇

技術標籤:遊戲javaswing後端

介面類:

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();
    }
}