这个程序最重要的是对集合子类的LinkedList操作,了解其特有方法,getFirst(),getLast(),
在实现过程中我发现,当对 Point head = snack.getFirst(),对head操作时,会同步到对集合的首元素操作,明天我将验证对其他的集合子类是否具有相应的特性。其中Point是java自带的工具类,实现了equal等常用方法,然后就是要注意二维数组的越界问题,先不多说,附上源码。
package cn.itcast.snake;
import java.awt.Point;
import java.io.IOException;
import java.util.Random;
import java.util.Scanner;
import javax.xml.transform.Templates;
/*
@Author 吴想
@Time 2019年4月19日
类说明:
*/
public class SnackServer {
// 初始化背景
public void initBackground() {
for (int i = 0; i < Parameter.background.length; i++)
for (int j = 0; j < Parameter.background[i].length; j++) {
if (i == 0 || j == 0 || i == Parameter.background.length - 1
|| j == Parameter.background[i].length - 1) {
Parameter.background[i][j] = '*';
} else {
Parameter.background[i][j] = '-';
}
}
}
// 显示游戏界面
public void showGamePanel() {
for (int i = 0; i < Parameter.background.length; i++) {
for (int j = 0; j < Parameter.background[i].length; j++) {
System.out.print(Parameter.background[i][j]);
}
System.out.println();
}
}
// 初始化蛇
public void initSnake() {
Parameter.snake.addFirst(new Point(10, 13));
Parameter.snake.addFirst(new Point(10, 14));
Parameter.snake.addFirst(new Point(10, 15));
Parameter.snake.addFirst(new Point(10, 16));
}
// 把蛇加入背景
public void addSnackToBackground() {
for (int i = 0; i < Parameter.snake.size(); i++) {
Point head = Parameter.snake.get(i);
if (i == 0) {
Parameter.background[head.x][head.y] = '@';
} else {
Parameter.background[head.x][head.y] = '#';
}
}
}
// 调转方向
public void getChangeDir(int changeDir) {
if (changeDir + Parameter.currentDir != 0)
Parameter.currentDir = changeDir;
}
// 移动蛇
public void moveSnake() {
Point head = Parameter.snake.getFirst();
int x, y;
switch (Parameter.currentDir) {
case 1:// 上
x = head.x - 1;
y = head.y;
Parameter.snake.addFirst(new Point(x, y));
break;
case -1:// 下
x = head.x + 1;
y = head.y;
Parameter.snake.addFirst(new Point(x, y));
break;
case 2:// 左
x = head.x;
y = head.y - 1;
Parameter.snake.addFirst(new Point(x, y));
break;
case -2:// 右
x = head.x;
y = head.y + 1;
Parameter.snake.addFirst(new Point(x, y));
break;
default:
break;
}
if (isEatFood(Parameter.snake.getFirst())) {
createFood();
} else {
Parameter.snake.removeLast();
}
if (isHit()) {
System.err.println("GAME OVER!");
System.exit(0);
}
refrush();
}
// 碰撞检测
public boolean isHit() {
if (Parameter.snake.getFirst().equals(Parameter.snake.getLast()) || Parameter.snake.getFirst().x == 0
|| Parameter.snake.getFirst().x == Parameter.heigth || Parameter.snake.getFirst().y == 0
|| Parameter.snake.getFirst().y == Parameter.width) {
return true;
} else {
return false;
}
}
// 刷新地图
public void refrush() {
initBackground();
addFoodToBackground();
addSnackToBackground();
showGamePanel();
}
// 创造食物
public void createFood() {
Random r = new Random();
while (true) {
int x = r.nextInt(Parameter.heigth);
int y = r.nextInt(Parameter.width);
if (Parameter.background[x][y] != '*') {
Parameter.food = new Point(x, y);
break;
}
}
}
// 把食物加入背景
public void addFoodToBackground() {
Parameter.background[Parameter.food.x][Parameter.food.y] = '@';
}
// 是否吃到了食物
public boolean isEatFood(Point p) {
return Parameter.food.equals(p);
}
public void run() {
initBackground();
initSnake();
createFood();
System.out.println("GAME START!");
refrush();
while (true) {
if (sc.hasNext()) {
String dir = sc.next();
switch (dir) {
case "w":
getChangeDir(1);
break;
case "d":
getChangeDir(-2);
break;
case "a":
getChangeDir(2);
break;
case "s":
getChangeDir(-1);
break;
default:
break;
}
}
if (!isHit()) {
moveSnake();
}
}
}
}
package cn.itcast.snake;
import java.awt.Point;
import java.util.LinkedList;
/*
@Author 吴想
@Time 2019年4月19日
类说明:
*/
public class Parameter {
//宽
public static final int width = 60;
//高
public static final int heigth = 20;
//蛇
public static LinkedList snake = new LinkedList();
//食物
public static Point food;
//现在的方向
public static int currentDir = 1;
//改变的方向
public static int upDir = 1;
public static int downDir = -1;
public static int leftDir = -2;
public static int rightDir = 2;
//背景
public static char[][] background = new char[heigth][width];
}
package cn.itcast.snake;
/*
@Author 吴想
@Time 2019年4月19日
类说明:
*/
public class Snake {
public static void main(String[] args) {
SnackServer server = new SnackServer();
}
}