zoukankan      html  css  js  c++  java
  • Java 开发简单的贪吃蛇游戏

    public class Test {
        public static void main(String[] args) {
            Game game = new Game();
            game.start();
        }
    
    }
    public class Node {
    
        private int x ;
        private int y ;
        
        public Node(){}
        
        public Node(int x , int y){
            this.x = x ;
            this.y = y ;
        }
    
        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;
        }
    
        @Override
        public int hashCode() {
            /*final int prime = 31;
            int result = 1;
            result = prime * result + x;
            result = prime * result + y;
            return result;*/
            return x;
        }
    
        @Override
        public boolean equals(Object obj) {
        /*    if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Node other = (Node) obj;
            if (x != other.x)
                return false;
            if (y != other.y)
                return false;
            return true;*/
            
            if (null == obj) {
                return false;
            }
    
            if (this == obj) {
                return true;
            }
    
            if (obj instanceof Node) {
                Node n = (Node) obj;
                if (this.x == n.x && this.y == n.y) {
                    return true;
                }
            }
    
            return false;
        }
    
        @Override
        public String toString() {
            return "Node [x=" + x + ", y=" + y + "]";
        }
        
        
        
    }
    import java.util.LinkedList;
    
    public class Snake {
        //存放节点的链表, 也就是蛇身
        private LinkedList<Node> nodes = new LinkedList<Node>();
        
        //申明一个foods(食物)对象
        InitPanel food;
        //定义方向
        
        public static final int UP = -10;
        public static final int DOWN = 10;
        public static final int LEFT = -1;
        public static final int RIGHT =1;
        
        //定义蛇初始的方向
        private int direction;
        
        /**
         *创建Snake 初始化时的对象 
         */
        public Snake(){
            nodes.add(new Node(3,9));
            nodes.add(new Node(4,9));
            nodes.add(new Node(4,10));
            nodes.add(new Node(5,10));
            
            //蛇头的方向
            this.direction = UP;
        }
        
        public Snake(LinkedList<Node> nodes){
            //清空链表中的所有节点
            this.nodes.clear();
            //添加所有的节点
            this.nodes.addAll(nodes);
    
    
            
        }
        
        /**
         *移动 
         */
        private void step(){
            //先获取头节点, 也就是蛇头
            Node top = this.nodes.getFirst();
            
            //移动后的坐标
            
            int x =top.getX()+ this.direction/10;
            int y =top.getY()+this.direction%10;
            
            //新蛇头的坐标
            Node t = new Node(x,y);
            
            //添加蛇头
            nodes.addFirst(t);
            
            //删除蛇尾巴
            if(food.getFood().contains(nodes.getFirst())){
                food.Meet();
            }else{
                nodes.removeLast();
            }
            
        }
        
        /**
         *移动 
         */
        public void step(int direction,InitPanel sp){
            if(this.direction + direction == 0){
                throw new RuntimeException("方向走反");
            }
            this.direction = direction;
            this.food = sp ;
            step();
        }
        
        /**
         *判断节点是否都在蛇身上 
         */
        public boolean containNode(Node node){
            return nodes.contains(node);
        }
        
        /**
         *得到所有的节点对象 
         */
        public LinkedList<Node> getNodes(){
            return nodes;
        }
        
         
        
        
        
    
    }
    import java.util.HashSet;
    import java.util.Random;
    
    public class InitPanel {
        public int rows = 10;
        public int cols = 30;
        
        private Snake snake;
        
        private HashSet<Node> foods = new HashSet<Node>();
        
        Random random;
        /**
         *界面构造器
         */
        public InitPanel(){
            //创建出蛇对象
            snake = new Snake();
            //创建出食物对象
            this.initFoods(5);
        }
        //返回蛇身
        public Snake getSnake(){
            return snake;
        }
        /**
         * 实例化食物对象
         */
        public void initFoods(int i){
            random = new Random();
            while(true){
                //食物不能出现的位置,不能在边界上 ,也不能在边界外
                int x = random.nextInt(rows-2)+1;
                int y = random.nextInt(cols-2)+1;
                Node food = new Node(x,y);
                //食物还不能在蛇身上
                if(snake.containNode(food)){
                    continue;
                }
                //食物与食物之间出现在界面上的时候还不能再同一个位置
                if(foods.contains(food)){
                    continue;
                }
                
                //添加食物在食物链表中
                foods.add(food);
                
                //如果生成的食物数量达到i,则退出循环
                if(foods.size()==i){
                    break;
                }
            }
        }
        
        //产生界面
        public void print(){
            for(int i = 0 ; i < rows ; i ++){
                
                for(int j = 0 ; j < cols  ; j ++){
                    
                    if(i == 0 || i == rows - 1){
                        System.out.print("-");
                    }else if(j == 0 || j == cols - 1 ){
                        System.out.print("|");
                    }else if(snake.containNode(new Node(i,j))){
                        System.out.print("*");
                    }else if(foods.contains(new Node(i,j))){
                        System.out.print("o");
                    }else {
                        System.out.print(" ");
                    }
                }
                System.out.println();
            }
        }
        
        
        //返回食物的所有节点
        public HashSet<Node> getFood(){
            return foods;
        }
        
        //当蛇吃到食物的时候,该食物就应该消失
        public HashSet<Node> Meet(){
            foods.remove(snake.getNodes().getFirst());
            return foods;
        }
        
    
    }
    import java.util.Scanner;
    
    public class Game {
    
        //游戏开始
        public void start(){
            InitPanel sp = new InitPanel();
            Snake snake = sp.getSnake();
            
            Scanner input = new Scanner(System.in);
            while(true){
                sp.print();
                System.out.println("dir:");
                
                String str =input.nextLine();
                switch (str) {
                case "w":
                    snake.step(Snake.UP,sp);
                    break;
                case "s":
                    snake.step(Snake.DOWN,sp);
                    break;
                case "a":
                    snake.step(Snake.LEFT,sp);
                    break;
                case "d":
                    snake.step(Snake.RIGHT,sp);
                    break;
                case "q":
                    System.out.println("结束了游戏   拜拜");
                    System.exit(0);
                    break;
    
                default:
                    break;
                }
            }
        }
        
        
    }

    贪吃蛇其实可以看成由一节节的节点组成的一个链表的集合
  • 相关阅读:
    软件体系架构复习要点
    Operating System on Raspberry Pi 3b
    2019-2020 ICPC North-Western Russia Regional Contest
    2019 ICPC ShenYang Regional Online Contest
    2019 ICPC XuZhou Regional Online Contest
    2019 ICPC NanChang Regional Online Contest
    2019 ICPC NanJing Regional Online Contest
    Codeforces Edu Round 72 (Rated for Div. 2)
    Codeforces Round #583 (Div.1+Div.2)
    AtCoder Beginning Contest 139
  • 原文地址:https://www.cnblogs.com/sdfd101/p/4870169.html
Copyright © 2011-2022 走看看