java贪吃蛇

LinkedList:贪吃蛇

新手,这几天刚学到集合,用LinkedList写了一个很low的贪吃蛇小游戏(只能在控制台 一帧一帧的跳),纪念一下学习的过程.但是还是用到了一些关于集合的知识,可以参考下.希望大家多多指点让我这个新手慢慢成长^_^.
这里写图片描述

snake 类

package com.lsm.program.snakemodel;

import java.util.LinkedList;
import java.util.Queue;

import org.junit.Test;

/**
* 描述一条蛇
*
* @author lsm
* @create time 2016年8月5日 下午5:13:58
*/
public class Snake {
private LinkedList snake = new LinkedList<>();

public LinkedList<Node> getSnake() {

    return snake;
}

public void setSnake(LinkedList<Node> snake) {
    this.snake = snake;
}

public Snake() {
    super();

}

public Snake(LinkedList<Node> snake) {
    super();
    this.snake = snake;
}

// 蛇进一步
public boolean step(int dir, SnakePanel dd) {

    //判断是否已经吃完所有的豆子
    if(dd.getFood().isEmpty()){
        System.out.println("你赢了,你已经吃完所有的豆子!");
        return false;
    }


    //System.out.println("-------=" + dir);
    int i = dir / 10 % 10;// 记录上下方向
    int j = dir % 10;// 记录左右方向

    // 获取头节点以确定 ,并保存起来
    Node temp = new Node();
    // 记录起来
    temp = snake.getFirst();
    //System.out.println(temp);
    // 获取你将要走的那一个点的坐标
    temp = new Node(temp.getI() + i, temp.getJ() + j);

    // 判断是否下个节点是自身或者是墙壁
    if (temp.getI() == 0 || temp.getI() == 10 || temp.getJ() == 0 || temp.getJ() == 30) {
        System.out.println("你已经阵亡,你撞墙了!");
        return false;
    }
    // 判断蛇是否吃到自己
    if (snake.contains(temp)) {
        System.out.println("很遗憾!你吃了自己!");
        return false;
    }

    if (dd.getFood().contains(temp)) {
        //如果是食物则吃了它
        snake.addFirst(temp);
        dd.getFood().remove(temp);
    } else {
        //如果不是食物吃了它并把尾部去掉
        snake.addFirst(temp);
        snake.removeLast();
    }

    return true;
}
//这个是设计当玩家不输入指令时自己往上走
public boolean step(SnakePanel dd){
    return  step(-10,dd);
}

}

Node 类

package com.lsm.program.snakemodel;

/**
* 描述一个节点
*
* @author lsm
* @create time 2016年8月5日 下午5:14:20
*/
public class Node {
// 保存一个点的坐标
private int i;
private int j;

public int getI() {
    return i;
}

public void setI(int i) {
    this.i = i;
}

public int getJ() {
    return j;
}

public void setJ(int j) {
    this.j = j;
}

@Override
public String toString() {
String s=”[“+i+”,”+j+”]”;
return s;
}
public Node() {
super();
// TODO Auto-generated constructor stub
}

public Node(int i, int j) {
    super();
    this.i = i;
    this.j = j;
}
@Override
public int hashCode() {
    // TODO Auto-generated method stub
    return (i+j)*i*j;
}
@Override
public boolean equals(Object obj) {
    if(obj==null) return false;
    if(obj==this) return true;
    if(obj instanceof Node){
        Node u=(Node)obj;
        return u.i==this.i&&u.j==this.j;
    }
    return false;
}

}

SnakePanel类

package com.lsm.program.snakemodel;

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

import org.junit.Ignore;
import org.junit.Test;

/**
* 描述一个游戏界面
* @author lsm
* @create time 2016年8月5日 下午9:00:26
*/
public class SnakePanel {
private Snake snake1=new Snake();
// 储存食物
private Set food = new HashSet();
// 将游戏的表盘的长宽定义成常量
private final static int HIGHT = 10;
private final static int WIDTH = 30;

// 初始化食物

public void intFood() {
    Random r = new Random();
    for (int k = 0; k < 6; k++) {
        // 随机生成食物的横坐标
        int i = r.nextInt(9)+1;
        // 随机生成食物的纵坐标
        int j = r.nextInt(29)+1;
        food.add(new Node(i, j));
        //System.out.println(food);
    }
    /*System.out.println("-----shiwu-----");
    System.out.println(food);

*/
}

// 初始化蛇

public void intSnake() {
    Random r = new Random();

    // 随机蛇的坐标
    int i = r.nextInt(9)+1;
    int j = r.nextInt(29)+1;
    int k=0;
    // 将随机得到的点作为蛇的第一个节点也是的初始化点
    snake1.getSnake().addLast(new Node(i, j));
    /*k++;
    System.out.println(k+"---->"+snake1.getSnake());*/
}

public SnakePanel() {
    // 当实例化一个对象是直接给food和蛇初始化
    intFood();
    intSnake();
}

public SnakePanel(Snake snake1, Set<Node> food) {
    super();
    this.snake1 = snake1;
    this.food = food;
}

// 打印蛇和游戏盘和食物
@Test
public void print() {
    for (int i = 0; i <= HIGHT; i++) {
        for (int j = 0; j <= WIDTH; j++) {
            Node now=new Node(i,j);
            if (i == 0 || i == HIGHT) {
                System.out.print("-");
            } else if (j == 0 || j == WIDTH) {
                System.out.print("|");
            }else if(snake1.getSnake().contains(now)){
                  //用#表示蛇身
                System.out.print("#");
            }else if(food.contains(now)){
                //用o表示食物
                System.out.print("o");
            }else{
                System.out.print(" ");
            }
        }
        System.out.println();
    }
}

public Snake getSnake1() {
    return snake1;
}

public void setSnake1(Snake snake1) {
    this.snake1 = snake1;
}

public Set<Node> getFood() {
    return food;
}

public void setFood(Set<Node> food) {
    this.food = food;
}

}

SnakeTest类(用于测试游戏)

package com.lsm.program.snakemodel;

import java.util.Scanner;

import org.junit.Test;

/**
 * @author lsm
 * @create time 2016年8月5日 下午9:33:38
 */

public class SnakeTest {
    @Test
    public void test() {
        SnakePanel p = new SnakePanel();
        // 打印游戏开始的界面
        p.print();
        Scanner in = new Scanner(System.in);
        while (true) {
            System.out.println("请输入你的指令:");
            String dir = in.nextLine();
            if (dir.equals("w")) {
                if (p.getSnake1().step(-10, p) == false)
                    break;

            } else if (dir.equals("s")) {
                if (p.getSnake1().step(10, p) == false)
                    break;
            } else if (dir.equals("a")) {
                if (p.getSnake1().step(-1, p) == false)
                    break;
            } else if (dir.equals("d")) {
                if (p.getSnake1().step(1, p) == false)
                    break;
            } else {
                if (p.getSnake1().step(p) == false) {
                    break;
                }

            }
            // 走完后在打印地图
            p.print();
        }
    }
}

“`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值