分享一個小玩意,Java貪喫蛇全代碼,,感興趣的可以試試! 小編的話 前言 測試類 Snake類

小編的話

在文章的最後作者爲大家整理了很多資料!包括java核心知識點+全套架構師學習資料和視頻+一線大廠面試寶典+面試簡歷模板+阿里美團網易騰訊小米愛奇藝快手嗶哩嗶哩面試題+Spring源碼合集+Java架構實戰電子書等等!


資料都是免費分享給大家的,大家點這裏直接下載就好了

前言

我想貪喫蛇應該是不少90後和00後的童年(我本人是01年的),回想起從前偷偷拿着我爹的諾基亞在被窩裏玩貪喫蛇,不禁感慨萬分,時間飛逝,沒想到10年後的我也可以自己做一個貪喫蛇了。
  




該程序主要實現了以下功能:
  1.按空格開始遊戲、暫停遊戲或重新開始遊戲。
  2.方向鍵控制蛇移動的方向。
  3.蛇喫掉食物可以增長,並增加遊戲分數(不會加快遊戲速度)。
  4.蛇咬到自己會結束遊戲。
  5.蛇撞到遊戲區域外會結束遊戲。
  
  接下來放出源碼,爲了讓初學者也能夠理解,我儘量將大部分代碼寫了註釋:

測試類

public class Test {
    public static void main(String[] args) {
        Snake snake = new Snake();
        snake.myJFrame();
    }
}


Snake類

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;

public class Snake extends JFrame implements KeyListener, ActionListener, MouseListener {

    int slong = 2;//蛇當前長度
    //蛇座標
    int[] Snakex = new int[100];
    int[] Snakey = new int[100];
    int fx = 1;//蛇的方向 0-左 1-右 2-上 3-下
    Timer timer = new Timer(100, this);//設置定時器,每100毫秒一次
    //食物位置
    int foodx;
    int foody;
    Random random = new Random();//隨機數,隨機位置生成食物
    int started = 0;//遊戲信息 0-未開始 1-開始 2-結束


    //---------------------------------------------------------------------------------------------------------------------
    //窗體
    public void myJFrame() {

        this.setTitle("貪喫蛇"); //標題
        this.setSize(800, 600); //窗口大小
        this.setResizable(false); //窗口是否可以改變大小=否
        this.setDefaultCloseOperation(Snake.EXIT_ON_CLOSE); //窗口關閉方式爲關閉窗口同時結束程序

        int width = Toolkit.getDefaultToolkit().getScreenSize().width; //獲取屏幕寬度
        int height = Toolkit.getDefaultToolkit().getScreenSize().height; //獲取屏幕高度
//        System.out.println("寬度:"+width);//測試
//        System.out.println("高度:"+height);//測試

        this.setLocation((width - 800) / 2, (height - 600) / 2); //設置窗口默認位置以屏幕居中

        this.setFocusable(true);
        this.addKeyListener(this);


        this.setVisible(true); //窗口是否顯示=是

//        蛇的初識位置
        Snakex[0] = 60;
        Snakey[0] = 100;
        Snakex[1] = 40;
        Snakey[1] = 100;

//        隨機食物的初識位置
        foodx = random.nextInt(39);
        foody = random.nextInt(22);
        foodx = foodx * 20;
        foody = foody * 20 + 80;

        System.out.println(foodx + "," + foody);
    }


    //---------------------------------------------------------------------------------------------------------------------
    //覆寫paint方法,繪製界面
    public void paint(Graphics g) {
//        繪製背景
        g.setColor(Color.LIGHT_GRAY);
        g.fillRect(0, 0, 800, 600);

        //繪製遊戲區域
        g.setColor(Color.black);
        g.fillRect(0, 80, 800, 520);

        //繪製蛇
        for (int i = 0; i < slong; i++) {
            g.setColor(Color.CYAN);
            g.fillRect(Snakex[i], Snakey[i], 20, 20);
        }


        //        繪製食物
        g.setColor(Color.yellow);
        g.fillOval(foodx, foody, 20, 20);


        if (started == 0) {
            g.setColor(Color.BLACK);//設置畫筆顏色
            g.setFont(new Font("微軟雅黑", 10, 20)); //設置字體
            g.drawString("按下“空格鍵”開始遊戲", 300, 65); //繪製字符
        } else if (started == 1) {
            g.setColor(Color.BLACK);//設置畫筆顏色
            g.setFont(new Font("微軟雅黑", 10, 20)); //設置字體
            g.drawString("當前分數爲:", 300, 65); //繪製字符
            g.drawString(String.valueOf(slong - 2), 420, 65); //繪製字符
        } else if (started == 2) {
            g.setColor(Color.BLACK);//設置畫筆顏色
            g.setFont(new Font("微軟雅黑", 10, 20)); //設置字體
            g.drawString("遊戲結束-", 250, 65); //繪製字符
            g.drawString("最終分數爲:", 350, 65); //繪製字符
            g.drawString(String.valueOf(slong - 2), 470, 65); //繪製字符
        }

    }


    //    操作監聽——控制蛇的不斷移動
    @Override
    public void actionPerformed(ActionEvent e) {
//        判斷遊戲是否開始
        if (started == 1) {
//            通過循環控制蛇移動
            for (int i = slong - 1; i > 0; i--) {
                Snakex[i] = Snakex[i - 1];
                Snakey[i] = Snakey[i - 1];
            }

//            判斷蛇移動的方向
            if (fx == 0) {
                Snakex[0] = Snakex[0] - 20;
            } else if (fx == 1) {
                Snakex[0] = Snakex[0] + 20;
            } else if (fx == 2) {
                Snakey[0] = Snakey[0] - 20;
            } else if (fx == 3) {
                Snakey[0] = Snakey[0] + 20;
            }

//            判斷蛇是否撞到牆外
            if (Snakex[0] < 0 || Snakex[0] > 780 || Snakey[0] < 80 || Snakey[0] > 580) {
                started = 2;
            }

//            判斷蛇是否喫到了食物
            if (Snakex[0] == foodx && Snakey[0] == foody) {

                slong++;

                foodx = random.nextInt(39);
                foody = random.nextInt(22);
                foodx = foodx * 20;
                foody = foody * 20 + 80;

                System.out.println(foodx + "," + foody);
            }

//            判斷是否喫到了自己
            for (int i = 1; i < slong; i++) {
                if (Snakex[0] == Snakex[i] && Snakey[0] == Snakey[i]) {
                    started = 2;
                }
            }

//            判斷食物是否隨機在了蛇身上
            for (int i = 0; i < slong; i++) {
                if (foodx == Snakex[i] && foody == Snakey[i]) {

                    //        隨機食物的初識位置
                    foodx = random.nextInt(39);
                    foody = random.nextInt(22);
                    foodx = foodx * 20;
                    foody = foody * 20 + 80;

                    System.out.println(foodx + "," + foody);
                }
            }


            repaint();
        }
        timer.start();
    }

    //    輸入
    @Override
    public void keyTyped(KeyEvent e) {

    }

    //    鍵盤按下——控制遊戲的開始以及蛇的移動方向
    @Override
    public void keyPressed(KeyEvent e) {
//        獲取從鍵盤輸入的鍵
        int key = e.getKeyCode();
//        判斷是否爲空格
        if (key == KeyEvent.VK_SPACE) {
            if (started == 0) {
                started = 1;
            } else if (started == 1) {
                started = 0;
            } else if (started == 2) {
                started = 0;

                slong = 2;//蛇當前長度

                //        蛇的初識位置
                Snakex[0] = 60;
                Snakey[0] = 100;
                Snakex[1] = 40;
                Snakey[1] = 100;

                //        隨機食物的初識位置
                foodx = random.nextInt(39);
                foody = random.nextInt(22);
                foodx = foodx * 20;
                foody = foody * 20 + 80;

                //                初始化方向
                fx = 1;
            }

            repaint();
            timer.start();

//            左
        } else if (key == KeyEvent.VK_LEFT) {
            if (fx != 1) {
                fx = 0;
            }
//            右
        } else if (key == KeyEvent.VK_RIGHT) {
            if (fx != 0) {
                fx = 1;
            }
//            上
        } else if (key == KeyEvent.VK_UP) {
            if (fx != 3) {
                fx = 2;
            }
//下
        } else if (key == KeyEvent.VK_DOWN) {
            if (fx != 2) {
                fx = 3;
            }
        }

    }

    //    彈起
    @Override
    public void keyReleased(KeyEvent e) {

    }

    //    點擊
    @Override
    public void mouseClicked(MouseEvent e) {

    }

    //    按下
    @Override
    public void mousePressed(MouseEvent e) {

    }

    //    擡起
    @Override
    public void mouseReleased(MouseEvent e) {

    }

    //    進入
    @Override
    public void mouseEntered(MouseEvent e) {

    }

    //    離開
    @Override
    public void mouseExited(MouseEvent e) {

    }
}


結束語
  
  測試的次數不多,不知道還有多少隱藏BUG,但我平常玩的時候是沒有問題的,如果你在玩的時候發現了BUG歡迎來私聊我,如果能帶着解決方法來的話那就更好了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章