如何设计出贪吃蛇游戏?

    作者:课课家教育更新于: 2018-11-26 15:22:06

    大神带你学编程,欢迎选课

      如何设计出贪吃蛇游戏?

      本次教程我们最主要的学习目的是设计出贪吃蛇游戏,大家可以根据这个学习目标,进行对课程的理解。

      学习目标:

      1.开发出贪吃蛇游戏

      2.阅读并理解贪吃蛇游戏代码

      3.参考贪吃蛇游戏,自己开发出类似的游戏

      一.贪吃蛇游戏开发

      1.新建一个项目GameFrame,再创建一个主类GameFrame

      代码如下:

    import java.awt.*;

    import java.awt.event.*;

     

    public class GameFrame {

     

        public GameFrame() {

            Frame app = new Frame("GameFrame");

     

            app.addWindowListener(new WindowAdapter() {

     

                public void windowClosing(WindowEvent e) {

                    System.exit(0);

                }

            });

            app.setLocation(100, 100);

            GamePanel drawB = new GamePanel();

            app.add(drawB, BorderLayout.CENTER);

     

            app.pack();

            app.setResizable(false);

            app.setVisible(true);

            drawB.gameStart();

        }

     

        /**

         * @param args the command line arguments

         */

        public static void main(String[] args) {

            new GameFrame();

        // TODO code application logic here

        }

    }

     

      2.创建一个类GamePanel,代码如下:

    import java.awt.*;

    import java.awt.event.*;

     

     

    /**

     *

     * @author Administrator

     */

    public class GamePanel extends Panel implements Runnable, KeyListener{

     

     

        public int width;

        public int heigth;

        public int incre=1;

        private Image im;

        private Graphics dbg;

        private Thread gamethread;

        private static final int FPS = 30;

        private boolean running = false;

        private boolean isPaused = false;

        private int direction;

        public static final int SOUTH = 0;

        public static final int NORTH = 1;

        public static final int EAST = 2;

        public static final int WEST = 3;

        private Snake sk;

        private Food bk;

     

        public GamePanel() {

     

            width = 300;

            heigth = 300;

            setPreferredSize(new Dimension(width, heigth));

     

            sk = new Snake(this);

            bk = new Food(this, sk);

     

            setFocusable(true);

            requestFocus();

            addKeyListener(this);

        }

     

        public int getDirection() {

            return direction;

        }

     

        public void gameStart() {

            if (!running) {

                gamethread = new Thread(this);

                gamethread.start();

            }

        }

     

        public void gameStop() {

            running = false;

        }

     

        public void gamePaint() {

            Graphics g;

            try {

                g = this.getGraphics();

                if (g != null && im != null) {

                    g.drawImage(im, 0, 0, null);

                }

                g.dispose();

            } catch (Exception e) {

            }

        }

     

        public void gameRender() {

            if (im == null) {

                im = createImage(width, heigth);

                if (im == null) {

                    System.out.println("im is null");

                } else {

                    dbg = im.getGraphics();

                }

            }

     

            dbg.setColor(Color.white);

            dbg.fillRect(0, 0, width, heigth);

            sk.draw(dbg);

            bk.draw(dbg);

     

        }

     

        public void gameUpdate() {

     

            if (!isPaused) {

                sk.update();

                bk.update();

     

            }

        }

     

        public void run() {

            long t1,t2,dt,sleepTime;  

            long period=1000/FPS;  //计算每一次循环需要的执行时间,单位毫秒

            t1=System.nanoTime();  //保存游戏循环执行前的系统时间,单位纳秒

              

            while(true){

               gameUpdate();

               gameRender();

               gamePaint();

               t2= System.nanoTime() ; //游戏循环执行后的系统时间,单位纳秒

               dt=(t2-t1)/1000000L;  //本次循环实际花费的时间,并转换为毫秒

               sleepTime = period - dt;//计算本次循环剩余的时间,单位毫秒

               if(sleepTime<=0)        //防止sleepTime值为负数

                     sleepTime=2;

               try {     

               Thread.sleep(sleepTime); //让线程休眠,由sleepTime值决定

              } catch (InterruptedException ex) { }

                 t1 = System.nanoTime();  //重新获取当前系统时间

            }

        }

     

        public void keyTyped(KeyEvent e) {

        }

     

        public void keyPressed(KeyEvent e) {

            int keycode = e.getKeyCode();

     

            if (keycode == KeyEvent.VK_P) {

                isPaused = !isPaused;

                System.out.println("key is P");

            }

     

            if (!isPaused ) {

                switch (keycode) {

     

                    case KeyEvent.VK_DOWN:

                        direction = SOUTH;

                        System.out.println("key is down" + direction);

                        break;

                    case KeyEvent.VK_UP:

                        direction = NORTH;

                        System.out.println("key is up" + direction);

                        break;

                    case KeyEvent.VK_RIGHT:

                        direction = EAST;

                        System.out.println("key is right" + direction);

                        break;

                    case KeyEvent.VK_LEFT:

                        direction = WEST;

                        System.out.println("key is left" + direction);

                        break;

                }

            }

        }

     

        public void keyReleased(KeyEvent e) {

        }

    }

      3.创建类:Food,代码如下:

    import java.awt.*;

    import java.util.Random;

     

    /*

     * To change this template, choose Tools | Templates

     * and open the template in the editor.

     */

    /**

     *

     * @author new

     */

    public class Food {

     

        public Point location;

        public Point size;

        private GamePanel gameP;

        private Snake snk;

        private Random rand;

     

        public Food(GamePanel gp, Snake sk) {

            gameP = gp;

            snk = sk;

            rand = new Random();

            location = new Point(Math.abs(rand.nextInt() % gameP.width), Math.abs(rand.nextInt() % gameP.heigth));

            size = new Point(sk.diameter, sk.diameter);

        }

     

        public void update() {

            if ((Math.abs((snk.x + snk.diameter / 2) - (location.x + size.x / 2)) < snk.diameter) &&

                    (Math.abs((snk.y + snk.diameter / 2) - (location.y + size.y / 2)) < snk.diameter)) {

                location = new Point(Math.abs(rand.nextInt() % gameP.width), Math.abs(rand.nextInt() % gameP.heigth));

                if (snk.length < Snake.MAXLENTH) {

                    snk.length++;

                }

            }

        }

     

        public void draw(Graphics g) {

            g.setColor(Color.black);

            g.fillRect(location.x, location.y, size.x, size.y);

        }

    }

     

      4.创建类Snake,代码如下:

    import java.awt.*;

     

     

    /*

     * To change this template, choose Tools | Templates

     * and open the template in the editor.

     */

    /**

     *

     * @author new

     */

    public class Snake {

     

        GamePanel gameP;

        private Point[] body;

        public static final int MAXLENTH = 20;

        private int head;

        private int tail;

        public int length;

        private int speed;

        public int x;

        public int y;

        public int diameter;

     

        public Snake(GamePanel gp) {

            gameP = gp;

            body = new Point[MAXLENTH];

            head = -1;

            tail = -1;

            length = 1;

            speed = 3;

            x = 50;

            y = 50;

            diameter = 10;

        }

     

        public void update() {

     

     

            int direction=gameP.getDirection();

            switch (direction) {

                case GamePanel.SOUTH:

                    y += speed;

                    break;

                case GamePanel.NORTH:

                    y -= speed;

                    break;

                case GamePanel.EAST:

                    x += speed;

                    break;

                case GamePanel.WEST:

                    x -= speed;

                    break;

            }

     

            if (x > gameP.width) {

                x = -diameter;

            }

            if (y > gameP.heigth) {

                y = -diameter;

            }

            if (x < -diameter) {

                x = gameP.width;

            }

            if (y < -diameter) {

                y = gameP.heigth;

            }

     

            head = (head + 1) % body.length;

     

            tail = (head + body.length - length + 1) % body.length;

     

            body[head] = new Point(x, y);

     

        }

     

        public void draw(Graphics g) {

            g.setColor(Color.blue);

            if (length > 1) {

                int i = tail;

                while (i != head) {

                    g.fillRect(body[i].x, body[i].y, diameter, diameter);

                    i = (i + 1) % body.length;

                }

            }

     

            g.setColor(Color. blue);

            g.fillRect(body[head].x, body[head].y, diameter, diameter);

        }

    }

     

      保存全部,运行,试玩一下游戏,并自行理解代码.

      小编结语:其实,这个游戏的java代码并不难,最主要是大家能够好好熟悉一下游戏框架,并在此框架上,自行设计自己喜欢的游戏。

课课家教育

未登录

1