黑马程序员技术交流社区

标题: 贪食蛇小游戏 [打印本页]

作者: 宁静||致远    时间: 2016-5-25 23:34
标题: 贪食蛇小游戏
       在黑马学习了也将近2个多礼拜,利用上课老师讲的知识和自己平时学写了一个贪食蛇的小游戏,由于目前所学有限,写的贪食蛇不能连续移动,需要根据键盘录入进行移动,但也能实现游戏,代码如下:这是主函数

package snake.run;
import java.util.LinkedList;
import java.util.Scanner;
/**
* 该类定义的是操作蛇的方法,让蛇能够上下左右进行移动
* */
public class Main_Snack {
        static LinkedList<BodyPoint> list = new LinkedList<BodyPoint>(); // 定义一个容器用来装蛇的身体
        static Point point; // 定义一个位置坐标,用来记录蛇最末尾的坐标值,目的是在蛇吃食物时将食物转到蛇体最末端,增长蛇体
        static int score = 0; // 定义一个计数器,用来计算最后的分数。

        public static void main(String[] args) {
                Point.InniMap(); // 初始化刚开始的地图。
                Point.draw();
                Scanner sc = new Scanner(System.in); // 定义一个扫描器对象,来接收玩家输入的上下左右键
                while (!isDead()) {
                        String s = sc.nextLine();
                        if ("d".equalsIgnoreCase(s)) {
                                goRight(list); // 输入d用来控制蛇往右边前进
                        } else if ("w".equalsIgnoreCase(s)) {
                                goUp(list); // 输入w用来控制蛇往前面前进
                        } else if ("a".equalsIgnoreCase(s)) {
                                goLeft(list); // 输入a用来控制蛇往左边前进
                        } else if ("s".equalsIgnoreCase(s)) {
                                goDown(list); // 输入s用来控制蛇往下边前进
                        }
                        Point.draw(); // 每改变一次坐标都需要地图进行重新绘制
                }
                System.out.println("游戏结束了,您的分数为:" + score + "分");
        }

        /**
         * @param 传入蛇的容器数组
         * @return 返回蛇最末端的位置,目的是在蛇吃进一个食物时将食物转到蛇体最末端
         * */
        private static void followOneByOne(LinkedList<BodyPoint> list) { // 让蛇的后一个节点能跟随前一个节点移动。
                Point p = list.getLast().location;
                Point.st[p.getX()][p.getY()] = " ";
                point = p; // 获取蛇最后节点的位置,目的是在蛇吃食物之后蛇身节点自动增长一个。
                for (int i = list.size() - 2; i >= 0; i--) {
                        list.get(i + 1).location = list.get(i).location;
                        list.get(i + 1).showPosition();
                }
        }

        private static void goUp(LinkedList<BodyPoint> list) { // 控制蛇的身体向上移动
                followOneByOne(list);
                list.get(0).location = new Point(list.get(0).location.getX() - 1,
                                list.get(0).location.getY());
        }

        private static void goLeft(LinkedList<BodyPoint> list) { // 控制蛇的身体向左移动
                followOneByOne(list);

                list.getFirst().location = new Point(list.getFirst().location.getX(),
                                list.getFirst().location.getY() - 1);

        }

        private static void goRight(LinkedList<BodyPoint> list) { // 控制蛇的身体向右移动
                followOneByOne(list);
                list.getFirst().location = new Point(list.getFirst().location.getX(),
                                list.getFirst().location.getY() + 1);

        }

        private static void goDown(LinkedList<BodyPoint> list) { // 控制蛇的身体向下移动
                followOneByOne(list);
                list.getFirst().location = new Point(
                                list.getFirst().location.getX() + 1,
                                list.getFirst().location.getY());
        }
        /**
         * 此方法用来判断蛇头是否与蛇自身或是与墙壁相撞。
         * */
        public static boolean isDead() {
                Point newPoint = list.getFirst().location;                               
                if (newPoint.getX() == 0 || newPoint.getX() == Point.st.length - 1
                                || newPoint.getY() == 0
                                || newPoint.getY() == Point.st[0].length - 1) {
                        return true;
                }
                for (int i = 1; i < list.size(); i++) {
                        if (list.getFirst().location.equals(list.get(i).location)) {
                                return true;
                        }
                }
                return false;
        }
}



package snake.run;
/**
* 该类定义的是单个蛇节点的类,用来记录蛇蛇体节点所在的位置。
* */
public class BodyPoint {
        public Point location;                //定义蛇的单个节点位置。

        public void showPosition() {
                Point.setPoint(this.location);
        }

        public BodyPoint() {
                super();
        }

        public BodyPoint(Point location) {
                this.location = location;
        }

        @Override
        public boolean equals(Object obj) {// 重写equals方法,此步的目的是为了Point类的produceFood方法,让食物的坐标不会和蛇体重复。
                BodyPoint bodyPoint = (BodyPoint) obj;
                return this.location.equals(bodyPoint.location);
        }

}

package snake.run;

import java.util.Random;

/**
* 该类定义的是位置类,通过该类来确定蛇在地图的位置
* */
public class Point {
        private int x; // 维护一个x坐标,用来记录Point的横坐标
        private int y;// 维护一个y坐标,用来记录Point的纵坐标
        private static Random r = new Random();// 创建一个随机数对象,此对象用来创建食物的位置
        private static Point foodProint; // 维护一个食物的位置属性
        public static String[][] st = new String[10][30]; // 地图数组,用来定义边界

        public int getX() {
                return x;
        }

        public void setX(int x) {
                this.x = x;
        }

        public int getY() {
                return y;
        }

        public void setY(int y) {
                this.y = y;
        }

        public Point(int x, int y) {
                this.x = x;
                this.y = y;
                st[x][y] = "*";
        }

        public static void InniMap() { // 用来初始化地图
                for (int i = 0; i < st.length; i++) {
                        for (int j = 0; j < st[i].length; j++) {
                                st[i][j] = " ";
                        }
                }
                for (int i = 1; i < 4; i++) {// 初始蛇的长度为3
                        BodyPoint b = new BodyPoint(new Point(st.length / 2, 4 - i));
                        Main_Snack.list.add(b);
                }
                produceFood();
        }

        public static void setPoint(Point point) { // 此方法的目的是在蛇移动的时候改变地图数组的字符串,从而让蛇移动起来
                st[point.x][point.y] = "*";
        }

        public static Point produceFood() {
                Point point = new Point(r.nextInt(st.length - 3) + 1,
                                r.nextInt(st[0].length - 3) + 1);
                BodyPoint bodyPoint = new BodyPoint(point);
                bodyPoint.location = point;
                while (Main_Snack.list.contains(bodyPoint)) {
                        point = new Point(r.nextInt(st.length - 3) + 1,
                                        r.nextInt(st[0].length - 3) + 1);
                }
                st[point.x][point.y] = "*";
                foodProint = point;
                return foodProint; // 返回食物的坐标。
        }

        public static void draw() { // 画出整个游戏的地图
                if (Main_Snack.list.getFirst().location.equals(foodProint)) {// 当且仅当食物坐标与蛇头坐标重合时,才能产生新的食物
                        Main_Snack.score++;
                        produceFood();
                        BodyPoint bodyPoint = new BodyPoint(Main_Snack.point);
                        Main_Snack.list.add(bodyPoint);
                }
                for (int i = 0; i < st.length; i++) {
                        for (int j = 0; j < st[i].length; j++) {
                                if (i == 0 || i == st.length - 1 || j == 0
                                                || j == st[i].length - 1) {
                                        System.out.print("*");

                                } else {
                                        System.out.print(st[i][j]);
                                }
                        }
                        System.out.println();
                }
        }

        @Override
        public boolean equals(Object obj) { // 重写equals方法,此步的目的是为了Point类的produceFood方法,让食物的坐标不会和蛇体重复。
                Point point = (Point) obj;
                return this.x == point.x && this.y == point.y;
        }
}


也请教一下,如何用代码清空控制台,知道的大神讲一下哈

作者: nanliner    时间: 2016-5-26 00:45
真牛,厉害
作者: 不忘初心2016    时间: 2016-5-26 08:05
厉害厉害




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2