A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

看到同学说贪吃蛇   心想自己能不能做个
后面就弄成这个样了   简化版  没学GUI   只能弄个控制台版的

蛇在在程序中就是由一系列的节点组成的,每个节点都记录了对应的坐标
public class Node{
    private int i;//坐标点
    private int j;//坐标点
    public Node(int i,int j){
        this.i=i;
        this.j=j;   
    }
    坐标的getter和setter属性省略
    重写hashCode 和Equals方法
}

蛇类
public  class Worm{
    private LinkedList<Node> nodes=new LinkedList<>();//蛇在程序中的原型由n个节点组成
    private int dir;//蛇要行走的方向
    public static final int UP=-10;//上方向
    public static final int DOWN =10;//下方向
    public static final int LEFT=-1;//左方向
    public static final int RIGHT=1;//右方向
   
    public Worm(){
        nodes.add(new Node(3,9));
        nodes.add(new Node(4,9));
        nodes.add(new Node(5,9));
        nodes.add(new Node(5,10));
        nodes.add(new Node(5,11));
        nodes.add(new Node(6,11));
        nodes.add(new Node(7,11));
        dir=RIGHT;//设置默认行走方向
    }
    //走一步
    public void step(){
        Node head=nodes.getFirst();//获取头节点

        int i=head.getI()+dir/10;
        int j=head.getJ()+dir%10;

        head=new Node(i,j);
        nodes.addFirst(head);
        nodes.removeLast();
    }
    //指定方向后走一步
    public void step(int dir){
        if(this.dir+dir==0){
            throw new RuntimeException("不能掉头行驶");
        }
        this.dir=dir;
        step();
    }
    //判断指定的坐标点是否是蛇身的一部分
    public boolean contains(int i,int j){
        return nodes.contains(new Node(i,j));
    }
}

蛇面板(它具有打印到控制台功能,并且指定了面板的大小)
public class WormPane {
    private Worm worm=null;//蛇类

    public WormPane(){
        worm=new Worm();//初始化蛇
    }

    public WormPane(Worm worm){
        this.worm=worm;
    }

    public Worm getWorm() {
        return worm;
    }

    public void setWorm(Worm worm) {
        this.worm = worm;
    }

    private int rows=10;//行数
    private int cols=32;//列数


    //打印方法
    public void print(){
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                if(i==0 && j<cols){//当是第一行是打印-
                    System.out.print("-");
                }else if(j==0 || j==cols-1){//每一行的行首和行尾打印|
                    System.out.print("|");
                }else if(worm.contains(i, j)){//如果当前坐标是蛇身的一部分就打印#
                    System.out.print("#");
                }
                else if(i==rows-1 && j<cols){//如果是最后一行就打印-
                    System.out.print("-");
                }else{
                    System.out.print(" ");//什么情况都不是的时候打印空格
                }
            }
            System.out.println();//打印一行换一行
        }
    }
}


在主函数里让程序执行
public static void main(String[] args) {
        final WormPane pane=new WormPane();//创建一个面板对象
        final Worm worm=pane.getWorm();//从面板对象中获取到蛇对象
        Scanner sc=new Scanner(System.in);
        while(true){
            pane.print();//调用面板对象的方法把图案打印出来
            //System.out.println(worm);
            String dir=sc.nextLine();//让用户控制蛇行走方向
            if(dir.equalsIgnoreCase("u")){
                worm.step(Worm.UP);//当用户输入u时让蛇往上走
            }else if(dir.equalsIgnoreCase("d")){
                worm.step(Worm.DOWN);//当用户输入d时让蛇往下走
            }else if(dir.equalsIgnoreCase("l")){
                worm.step(Worm.LEFT);//当用户输入L时让蛇往左走
            }else if(dir.equalsIgnoreCase("r")){
                worm.step(Worm.RIGHT);//当用户输入r时让蛇往右走
            }else if(dir.equalsIgnoreCase("q")){
                System.out.println("Byte");//当用户输入q时推出程序
                break;
            }else{
                worm.step();//如果用户什么也不输入就回车就让蛇按默认方向行走
            }
        }
    }

评分

参与人数 1技术分 +2 收起 理由
r1503882525 + 2 赞一个!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马