Java的控制台小游戏(贪吃蛇)

几年前花了一整天的时间在宿舍去研究一个贪吃蛇

无聊的话可以看一下,对于那些刚刚接触不久的小伙伴可以看一下,研究研究思路,话不多说,干 @!

玩法(w上)(s下)(a左)(d右):输入还不够喔,每次输入一个按键需要按(回车)才生效,

思路的话可以大概讲一下,
1、定义一个二维数组模拟地图、数组外围使用■填充围墙、内部元素填充一个空格、蛇头填充●、蛇实体填充□、食物用○填充
2、创建一个蛇的集合,集合保存俩个数字,代表x和y坐标(蛇当前的坐标)
3、创建线程、死循环、创建上下左右方法控制台输入后改变线程调用方法(调用的方法是修改保存蛇集合的方法)
4、好了,话不多是说(其实我也忘得差不多了)直接上图上源代码:
在这里插入图片描述

import java.util.*;

/**
 * Lijie
 * 只需要导入util.*包
 */
public class tcs {

    // 初始化地图
    public static String[][] aa = new String[24][30];

    // 线程休息时间,太快了就会实现无线输出,蛇吃东西越长就会越快
    public static int seet = 100;

    // 记录蛇的集合 关键,用他加上,号隔开,俩个数字,x和y坐标
    public static LinkedList<String> dd = new LinkedList();

    // 定一个用有的变量接受wsad的上下移动端的操作
    public static String nana = "";

    // ****************************************************
    public static void main(String[] args) {
        tcs a = new tcs();
        a.load();
    }

    // 默认加载事件
    public void load() {
        Info();     //添加地图方法
        addList();  //加载蛇的默认位置
        print();    //输出地图加上蛇身的方法
        Random();   //随机生成贪吃蛇的食物
        Random();   //调用几次在场上就会有几个食物
        Random();
        startUp();  //启动线程,开启
    }

    // 创建启动贪吃蛇移动线程
    public void startUp() {
        Thread sd = new Thread(new move(), "杰");
        sd.start();
        while (true) {
            Scanner input = new Scanner(System.in);
            nana = input.next();
            // 如果输入较多就提取第一个
            if (nana.length() >= 2) {
                nana = nana.substring(0, 1);
            }
        }
    }

    // 实现线程移动类
    public class move implements Runnable {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            while (true) {
                if (nana.equals("w")) {
                    w();
                } else if (nana.equals("s")) {
                    s();
                } else if (nana.equals("a")) {
                    a();
                } else if (nana.equals("d")) {
                    d();
                } else {
                    // 暂停线程
                    Thread.yield();
                }
                try {
                    // 最低速度80
                    if (seet < 80) {
                        seet = 80;
                    }
                    Thread.sleep(seet);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }


    // ******************************************************

    // 蛇身的x坐标
    public int X(int x) {
        return Integer.parseInt(dd.get(x).split(",")[0]);
    }

    // 蛇身的y坐标
    public int Y(int y) {
        return Integer.parseInt(dd.get(y).split(",")[1]);
    }

    /**
     * 添加地图方法
     */
    public void Info() {
        for (int i = 0; i < 24; i++) {
            for (int j = 0; j < 30; j++) {
                if (i == 0) {
                    aa[i][j] = "■";
                }
                if (i == 23) {
                    aa[i][j] = "■";
                } else {
                    if (j == 0 || j == 29) {
                        aa[i][j] = "■";
                    } else {
                        if (i == 0) {

                        } else {
                            aa[i][j] = " ";
                        }
                    }
                }
            }
        }
        // 在此之前都是默认地图******************************
    }

    // 加载蛇身,保存在LinkedLis集合类,,这个集合增删改方便
    public void addList() {
        dd.add("16,14");
        dd.add("16,15");
        dd.add("16,16");
        dd.add("16,17");
    }

    /**
     * 控制台输出方法 ,输出集合,集合内包括蛇和地图
     * 控制集合操作蛇 把集合中的第一个变成蛇头后面的变成蛇尾
     */
    public void print() {
        // 修改添加蛇,配合LinkedList
        for (int i = 0; i < dd.size(); i++) {
            int x = X(i);
            int y = Y(i);
            if (i == 0) {
                aa[x][y] = "●"; // 蛇头●
                continue;
            }
            aa[x][y] = "□";// 身体□
        }

        for (int i = 0; i < 24; i++) {
            for (int j = 0; j < 30; j++) {
                System.out.print(aa[i][j] + " ");
            }
            System.out.println();
        }

    }

    // 随机添加吃的
    public void Random() {
        int ii = (int) (Math.round(Math.random() * 20 + 2));
        int jj = (int) (Math.round(Math.random() * 26 + 2));
        if (ii == 0 || jj == 0 || ii == 23 || jj == 28) {
            Random();
        } else {
            for (int i = 0; i < dd.size(); i++) {
                int x = X(i);
                int y = Y(i);

                if (x == ii && jj == y) {
                    Random();
                } else {
                    aa[ii][jj] = "○";
                }
            }
        }

    }

    // 上移动方法
    public void w() {
        // 添加蛇头移除蛇尾,实现移动
        dd.addFirst(X(0) - 1 + "," + Y(0));
        ss();// 判断是否撞到围墙或者你自己的身体
        if (aa[X(0)][Y(0)].equals("○")) {// 判断有没有吃到食物
            dd.addFirst(X(0) - 1 + "," + Y(0));
            Random();
            seet -= 15;
        }
        Remove();
    }

    // 下移动方法
    public void s() {
        // 添加蛇头移除蛇尾,实现移动
        dd.addFirst(X(0) + 1 + "," + Y(0));
        ss();// 判断是否撞到围墙或者你自己的身体
        if (aa[X(0)][Y(0)].equals("○")) {// 判断有没有吃到食物
            dd.addFirst(X(0) + 1 + "," + Y(0));
            Random();
            seet -= 15;
        }
        Remove();
    }

    // 左移动方法
    public void a() {
        // 添加蛇头移除蛇尾,实现移动
        dd.addFirst(X(0) + "," + (Y(0) - 1));
        ss();// 判断是否撞到围墙或者你自己的身体
        if (aa[X(0)][Y(0)].equals("○")) {// 判断有没有吃到食物
            dd.addFirst(X(0) + "," + (Y(0) - 1));
            Random();
            seet -= 15;
        }
        Remove();
    }

    // 右移动方法
    public void d() {
        // 添加蛇头移除蛇尾,实现移动
        dd.addFirst(X(0) + "," + (Y(0) + 1));
        ss();// 判断是否撞到围墙或者你自己的身体
        if (aa[X(0)][Y(0)].equals("○")) {// 判断有没有吃到食物
            dd.addFirst(X(0) + "," + (Y(0) + 1));
            Random();
            seet -= 15;
        }
        Remove();
    }

    // 判断是否撞到围墙或者你自己的身体
    public void ss() {
        if (aa[X(0)][Y(0)].equals("■")) {
            System.out.println("凉凉");
            System.exit(0);
        }
        if (aa[X(0)][Y(0)].equals("□")) {
            System.out.println("凉凉");
            System.exit(0);
        }
    }

    // 移除蛇身和蛇尾方法
    public void Remove() {
        // 移除蛇,aa的蛇尾最后一个变成" ",
        aa[X(dd.size() - 1)][Y(dd.size() - 1)] = " ";
        // 移除最后一个
        dd.removeLast();
        // 打印蛇和地图
        print();
    }
}


发布了36 篇原创文章 · 获赞 36 · 访问量 9915

猜你喜欢

转载自blog.csdn.net/weixin_43122090/article/details/103433917