java贪吃蛇怎么增加蛇的速度?java贪吃蛇游戏思路是什么?

Java是现在最受欢迎的开发语言,我们将java学会,就可以使用java开发合种小游戏,你如贪吃蛇游戏,那java贪吃蛇怎么增加蛇的速度?接下来我们就来给大家讲解一下这方面的内容。

代码如下:

package mvcTest;
//SnakeModel.java
import javax.swing.*;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Observable;
import java.util.Random;
class SnakeModel extends Observable implements Runnable
{
    boolean[][] matrix; // 指示位置上有没蛇体或食物
    LinkedList nodeArray = new LinkedList(); // 蛇体
    Node food;
    int maxX;
    int maxY;
    int direction = 2; // 蛇运行的方向
    boolean running = false; // 运行状态
    int timeInterval = 200; // 时间间隔,毫秒
    double speedChangeRate = 0.75; // 每次得速度变化率
    boolean paused = false; // 暂停标志
    int score = 0; // 得分
    int countMove = 0; // 吃到食物前移动的次数
    // UP and DOWN should be even
    // RIGHT and LEFT should be odd
    public static final int UP = 2;
    public static final int DOWN = 4;
    public static final int LEFT = 1;
    public static final int RIGHT = 3;
    public SnakeModel(int maxX, int maxY)
    {
        this.maxX = maxX;
        this.maxY = maxY;
        reset();
    }
    public void reset()
    {
        direction = SnakeModel.UP; // 蛇运行的方向
        timeInterval = 200; // 时间间隔,毫秒
        paused = false; // 暂停标志
        score = 0; // 得分
        countMove = 0; // 吃到食物前移动的次数
        // initial matirx, 全部清0
        matrix = new boolean[maxX][];
        for (int i = 0; i < maxX; ++i)
        {
            matrix[i] = new boolean[maxY];
            Arrays.fill(matrix[i], false);
        }
        // initial the snake
        // 初始化蛇体,如果横向位置超过20个,长度为10,否则为横向位置的一半
        int initArrayLength = maxX > 20 ? 10 : maxX / 2;
        nodeArray.clear();
        for (int i = 0; i < initArrayLength; ++i)
        {
            int x = maxX / 2 + i; //maxX被初始化为20
            int y = maxY / 2; //maxY被初始化为30
            //nodeArray[x,y]: [10,15]-[11,15]-[12,15]~~[20,15]
            //默认的运行方向向上,所以游戏一开始nodeArray就变为:
            // [10,14]-[10,15]-[11,15]-[12,15]~~[19,15]
            nodeArray.addLast(new Node(x, y));
            matrix[x][y] = true;
        }
        // 创建食物
        food = createFood();
        matrix[food.x][food.y] = true;
    }
    public void changeDirection(int newDirection)
    {
        // 改变的方向不能与原来方向同向或反向
        if (direction % 2 != newDirection % 2)
        {
            direction = newDirection;
        }
    }
    public boolean moveOn()
    {
        Node n = (Node) nodeArray.getFirst();
        int x = n.x;
        int y = n.y;
        // 根据方向增减坐标值
        switch (direction)
        {
        case UP:
            y--;
            break;
        case DOWN:
            y++;
            break;
        case LEFT:
            x--;
            break;
        case RIGHT:
            x++;
            break;
        }
        // 如果新坐标落在有效范围内,则进行处理
        if ((0 <= x && x < maxX) && (0 <= y && y < maxY))
        {
            if (matrix[x][y])
            { // 如果新坐标的点上有东西(蛇体或者食物)
                if (x == food.x && y == food.y)
                { // 吃到食物,成功
                    nodeArray.addFirst(food); // 从蛇头赠长
                    // 分数规则,与移动改变方向的次数和速度两个元素有关
                    int scoreGet = (10000 - 200 * countMove) / timeInterval;
                    score += scoreGet > 0 ? scoreGet : 10;
                    countMove = 0;
                    food = createFood(); // 创建新的食物
                    matrix[food.x][food.y] = true; // 设置食物所在位置
                    return true;
                }
                else // 吃到蛇体自身,失败
                    return false;
            }
            else
            { // 如果新坐标的点上没有东西(蛇体),移动蛇体
                nodeArray.addFirst(new Node(x, y));
                matrix[x][y] = true;
                n = (Node) nodeArray.removeLast();
                matrix[n.x][n.y] = false;
                countMove++;
                return true;
            }
        }
        return false; // 触到边线,失败
    }
    public void run()
    {
        running = true;
        while (running)
        {
            try
            {
                Thread.sleep(timeInterval);
            }
            catch (Exception e)
            {
                break;
            }
            if (!paused)
            {
                if (moveOn())
                {
                    setChanged(); // Model通知View数据已经更新
                    notifyObservers();
                }
                else
                {
                    JOptionPane.showMessageDialog(null
                        , "you failed"
                        , "Game Over"
                        , JOptionPane.INFORMATION_MESSAGE);
                    break;
                }
            }
        }
        running = false;
    }
    private Node createFood()
    {
        int x = 0;
        int y = 0;
        // 随机获取一个有效区域内的与蛇体和食物不重叠的位置
        do {
            Random r = new Random();
            x = r.nextInt(maxX);
            y = r.nextInt(maxY);
        } while (matrix[x][y]);
        return new Node(x, y);
    }
    public void speedUp()
    {
        timeInterval *= speedChangeRate;
    }
    public void speedDown()
    {
        timeInterval /= speedChangeRate;
    }
    public void changePauseState()
    {
        paused = !paused;
    }
    public String toString()
    {
        String result = "";
        for (int i = 0; i < nodeArray.size(); ++i)
        {
            Node n = (Node) nodeArray.get(i);
            result += "[" + n.x + "," + n.y + "]";
        }
        return result;
    }
}
class Node
{
    int x;
    int y;
    Node(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}

java贪吃蛇游戏思路是什么?

贪吃蛇实际上是一个较为简单的线程游戏,其制作思路主要为以下几个步骤:

1.主框架类(GameFrame):作为游戏的顶层容器和游戏程序的入口点。在代码中我将它写入了GamePanel里。

2.游戏面板类(GamePanel):作为游戏画面的显示组件,同时用来运行游戏循环,并对用户的输入事件进行处理。

3.贪吃蛇类(Snake):作为贪吃蛇的封装类,用来设置贪吃蛇的属性,并对其运动逻辑进行更新,同时对其图形进行绘制。

4.食物类(Food):作为食物的封装类,用来设置食物的属性,并对其运动逻辑进行更新,同时对其图形进行绘制。

在制作贪吃蛇游戏的时候,我们需要有开发思路,这样在开发的过程中才会更加顺利!最后大家如果想要了解更多java实例知识,敬请关注奇Q工具网。

推荐阅读:

java已停止工作怎么解决?Java如何正常运行?

git代码怎么还原?git代码如何提交?

qtjson二进制如何传输?qtjson二进制传输格式