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();
}
}
}
“`