核心代码
public static void main(String[] args) {
GreedySnake();
}
private static void GreedySnake(){
//蛇
LinkedList<List<Integer>> snake = new LinkedList<>();
//希望线程安全的话,可以使用ConcurrentLinkedQueue<T>替代LinkedList<T>(注意出入顺序不同,这个队列先入先出,双向链表更加自由)
//ConcurrentLinkedQueue队列操作方法:offer()添加末尾,poll()获取并移除首个元素
int sumFood = 0;
int len = 10;
int wei = 10;
//1.生成地图
int[][] a = new int[wei][len];
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
int v = roundZero();
a[i][j] = v;
}
}
System.out.println("=========================");
//2.开始确定出生位置
int x;
int y;
int xx;
int yy;
do {
x = randomNum(9);
y = randomNum(9);
}while(a[x][y]!=1);
//尾巴位置=开始位置 此时长度为1
xx = x;
yy = y;
a[x][y] = -1;
//打印地图
printMap(a);
System.out.println("随即生成玩家位置" + (x + 1) + "," + (y + 1));
List<Integer> list = new ArrayList<>();
list.add(0,x);
list.add(1,y);
snake.addFirst(list);
//3.输入移动命令,碰到食物长度增加一,碰到边界|自身结束
//上次走的方向
String lastInStr = "";
do{
//规定:wsad 分别为上下左右
//实现移动:把尾部位置移动到预前进位置,如果有食物则不删除尾部
System.out.println("请输入移动命令(w、s、a、d):");
Scanner scanner = new Scanner(System.in);
String inStr = scanner.next();
switch (inStr) {
case "w":
//长度大于1时,不能反向移动
if("s".equals(lastInStr) && snake.size() > 1){
System.out.println("无法向此移动!");
break;
}
//向上移动,如果在第一行则死亡
if (x == 0) {
System.out.println("第一行无法向上移动,游戏结束");
return;
} else {
//移动到有食物的位置
int to = a[x - 1][y];
if (to == 1) {
//食物所在格子变为身体
a[x - 1][y] = -1;
//蛇头位置更新
x = x - 1;
updateSnakeHead(snake,x,y);
//不需要删除尾部,因为长度增加了1
} else if (to == 0) {
//正常行走
//1.清空最后一格子尾部
a[xx][yy] = 0;
//2.蛇头位置更新
x = x - 1;
a[x][y] = -1;
updateSnakeHead(snake,x,y);
//3.尾巴位置更新
delSnakeTail(snake);
xx = snake.getLast().get(0);
yy = snake.getLast().get(1);
} else if (to == -1) {
System.out.println("咬到自己,游戏结束");
return;
}
}
break;
case "s":
if("w".equals(lastInStr) && snake.size() > 1){
System.out.println("无法向此移动!");
break;
}
if (x == wei - 1) {
System.out.println("最后一行无法向下移动,游戏结束");
return;
} else {
int to = a[x + 1][y];
if (to == 1) {
//食物所在格子变为身体
a[x + 1][y] = -1;
//蛇头位置更新
x = x + 1;
updateSnakeHead(snake,x,y);
//不需要删除尾部,因为长度增加了1
} else if (to == 0) {
//正常行走
//1.清空最后一格子尾部
a[xx][yy] = 0;
//2.蛇头位置更新
x = x + 1;
a[x][y] = -1;
updateSnakeHead(snake,x,y);
//3.尾巴位置更新
delSnakeTail(snake);
xx = snake.getLast().get(0);
yy = snake.getLast().get(1);
} else if (to == -1) {
System.out.println("咬到自己,游戏结束");
return;
}
}
break;
case "a":
if("d".equals(lastInStr) && snake.size() > 1){
System.out.println("无法向此移动!");
break;
}
if (y == 0) {
System.out.println("最左行无法向左移动,游戏结束");
return;
} else {
int to = a[x][y-1];
if (to == 1) {
//食物所在格子变为身体
a[x][y-1] = -1;
//蛇头位置更新
y = y - 1;
updateSnakeHead(snake,x,y);
//不需要删除尾部,因为长度增加了1
} else if (to == 0) {
//正常行走
//1.清空最后一格子尾部
a[xx][yy] = 0;
//2.蛇头位置更新
y = y - 1;
a[x][y] = -1;
updateSnakeHead(snake,x,y);
//3.尾巴位置更新
delSnakeTail(snake);
xx = snake.getLast().get(0);
yy = snake.getLast().get(1);
} else if (to == -1) {
System.out.println("咬到自己,游戏结束");
return;
}
}
break;
case "d":
if("a".equals(lastInStr) && snake.size() > 1){
System.out.println("无法向此移动!");
break;
}
if (y == len - 1) {
System.out.println("最右行无法向右移动,游戏结束");
return;
}else{
int to = a[x][y+1];
if (to == 1) {
//食物所在格子变为身体
a[x][y+1] = -1;
//蛇头位置更新
y = y + 1;
updateSnakeHead(snake,x,y);
//不需要删除尾部,因为长度增加了1
} else if (to == 0) {
//正常行走
//1.清空最后一格子尾部
a[xx][yy] = 0;
//2.蛇头位置更新
y = y + 1;
a[x][y] = -1;
updateSnakeHead(snake,x,y);
//3.尾巴位置更新
delSnakeTail(snake);
xx = snake.getLast().get(0);
yy = snake.getLast().get(1);
} else if (to == -1) {
System.out.println("咬到自己,游戏结束");
return;
}
}
break;
default:
System.out.println("错误的输入,请重新输入");
break;
}
lastInStr = inStr;
System.out.println("-------------------------------------------------- ");
boolean success = printMap(a);
if(success){
//游戏结束
System.out.println("你赢了!");
return;
}
System.out.println("蛇头位置:" + (x + 1) + "," + (y + 1));
System.out.println("尾部位置:" + (xx + 1) + "," + (yy + 1));
}while (true);
}
//打印地图并统计剩余食物
private static boolean printMap(int a[][]){
int sumFood = 0;
for (int[] ints : a) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
if(anInt == 1){
sumFood ++ ;
}
}
System.out.println();
}
if(sumFood == 0){
return true;
}
return false;
}
//随机值 0 到 最大值 包含最大值
private static int randomNum(int maxNum){
//指定范围随机值公式:new Random().nextInt(max-min+1)+min;
return new Random().nextInt(maxNum+1);
}
// 1/10几率地图
private static int roundZero(){
int v = new Random().nextInt(10);
if(v == 0){
// 1/10 几率=1
v = 1;
}else{
v = 0;
}
return v;
}
//更新蛇头
private static void updateSnakeHead(LinkedList<List<Integer>> snake,int x,int y){
List<Integer> add = new ArrayList<>();
add.add(0,x);
add.add(1,y);
snake.addFirst(add);
}
//删除尾巴
private static void delSnakeTail(LinkedList<List<Integer>> snake){
snake.removeLast();
}