在黑马学习了也将近2个多礼拜,利用上课老师讲的知识和自己平时学写了一个贪食蛇的小游戏,由于目前所学有限,写的贪食蛇不能连续移动,需要根据键盘录入进行移动,但也能实现游戏,代码如下:这是主函数
package snake.run;
import java.util.LinkedList;
import java.util.Scanner;
/**
* 该类定义的是操作蛇的方法,让蛇能够上下左右进行移动
* */
public class Main_Snack {
static LinkedList<BodyPoint> list = new LinkedList<BodyPoint>(); // 定义一个容器用来装蛇的身体
static Point point; // 定义一个位置坐标,用来记录蛇最末尾的坐标值,目的是在蛇吃食物时将食物转到蛇体最末端,增长蛇体
static int score = 0; // 定义一个计数器,用来计算最后的分数。
public static void main(String[] args) {
Point.InniMap(); // 初始化刚开始的地图。
Point.draw();
Scanner sc = new Scanner(System.in); // 定义一个扫描器对象,来接收玩家输入的上下左右键
while (!isDead()) {
String s = sc.nextLine();
if ("d".equalsIgnoreCase(s)) {
goRight(list); // 输入d用来控制蛇往右边前进
} else if ("w".equalsIgnoreCase(s)) {
goUp(list); // 输入w用来控制蛇往前面前进
} else if ("a".equalsIgnoreCase(s)) {
goLeft(list); // 输入a用来控制蛇往左边前进
} else if ("s".equalsIgnoreCase(s)) {
goDown(list); // 输入s用来控制蛇往下边前进
}
Point.draw(); // 每改变一次坐标都需要地图进行重新绘制
}
System.out.println("游戏结束了,您的分数为:" + score + "分");
}
/**
* @param 传入蛇的容器数组
* @return 返回蛇最末端的位置,目的是在蛇吃进一个食物时将食物转到蛇体最末端
* */
private static void followOneByOne(LinkedList<BodyPoint> list) { // 让蛇的后一个节点能跟随前一个节点移动。
Point p = list.getLast().location;
Point.st[p.getX()][p.getY()] = " ";
point = p; // 获取蛇最后节点的位置,目的是在蛇吃食物之后蛇身节点自动增长一个。
for (int i = list.size() - 2; i >= 0; i--) {
list.get(i + 1).location = list.get(i).location;
list.get(i + 1).showPosition();
}
}
private static void goUp(LinkedList<BodyPoint> list) { // 控制蛇的身体向上移动
followOneByOne(list);
list.get(0).location = new Point(list.get(0).location.getX() - 1,
list.get(0).location.getY());
}
private static void goLeft(LinkedList<BodyPoint> list) { // 控制蛇的身体向左移动
followOneByOne(list);
list.getFirst().location = new Point(list.getFirst().location.getX(),
list.getFirst().location.getY() - 1);
}
private static void goRight(LinkedList<BodyPoint> list) { // 控制蛇的身体向右移动
followOneByOne(list);
list.getFirst().location = new Point(list.getFirst().location.getX(),
list.getFirst().location.getY() + 1);
}
private static void goDown(LinkedList<BodyPoint> list) { // 控制蛇的身体向下移动
followOneByOne(list);
list.getFirst().location = new Point(
list.getFirst().location.getX() + 1,
list.getFirst().location.getY());
}
/**
* 此方法用来判断蛇头是否与蛇自身或是与墙壁相撞。
* */
public static boolean isDead() {
Point newPoint = list.getFirst().location;
if (newPoint.getX() == 0 || newPoint.getX() == Point.st.length - 1
|| newPoint.getY() == 0
|| newPoint.getY() == Point.st[0].length - 1) {
return true;
}
for (int i = 1; i < list.size(); i++) {
if (list.getFirst().location.equals(list.get(i).location)) {
return true;
}
}
return false;
}
}
package snake.run;
/**
* 该类定义的是单个蛇节点的类,用来记录蛇蛇体节点所在的位置。
* */
public class BodyPoint {
public Point location; //定义蛇的单个节点位置。
public void showPosition() {
Point.setPoint(this.location);
}
public BodyPoint() {
super();
}
public BodyPoint(Point location) {
this.location = location;
}
@Override
public boolean equals(Object obj) {// 重写equals方法,此步的目的是为了Point类的produceFood方法,让食物的坐标不会和蛇体重复。
BodyPoint bodyPoint = (BodyPoint) obj;
return this.location.equals(bodyPoint.location);
}
}
package snake.run;
import java.util.Random;
/**
* 该类定义的是位置类,通过该类来确定蛇在地图的位置
* */
public class Point {
private int x; // 维护一个x坐标,用来记录Point的横坐标
private int y;// 维护一个y坐标,用来记录Point的纵坐标
private static Random r = new Random();// 创建一个随机数对象,此对象用来创建食物的位置
private static Point foodProint; // 维护一个食物的位置属性
public static String[][] st = new String[10][30]; // 地图数组,用来定义边界
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;
}
public Point(int x, int y) {
this.x = x;
this.y = y;
st[x][y] = "*";
}
public static void InniMap() { // 用来初始化地图
for (int i = 0; i < st.length; i++) {
for (int j = 0; j < st[i].length; j++) {
st[i][j] = " ";
}
}
for (int i = 1; i < 4; i++) {// 初始蛇的长度为3
BodyPoint b = new BodyPoint(new Point(st.length / 2, 4 - i));
Main_Snack.list.add(b);
}
produceFood();
}
public static void setPoint(Point point) { // 此方法的目的是在蛇移动的时候改变地图数组的字符串,从而让蛇移动起来
st[point.x][point.y] = "*";
}
public static Point produceFood() {
Point point = new Point(r.nextInt(st.length - 3) + 1,
r.nextInt(st[0].length - 3) + 1);
BodyPoint bodyPoint = new BodyPoint(point);
bodyPoint.location = point;
while (Main_Snack.list.contains(bodyPoint)) {
point = new Point(r.nextInt(st.length - 3) + 1,
r.nextInt(st[0].length - 3) + 1);
}
st[point.x][point.y] = "*";
foodProint = point;
return foodProint; // 返回食物的坐标。
}
public static void draw() { // 画出整个游戏的地图
if (Main_Snack.list.getFirst().location.equals(foodProint)) {// 当且仅当食物坐标与蛇头坐标重合时,才能产生新的食物
Main_Snack.score++;
produceFood();
BodyPoint bodyPoint = new BodyPoint(Main_Snack.point);
Main_Snack.list.add(bodyPoint);
}
for (int i = 0; i < st.length; i++) {
for (int j = 0; j < st[i].length; j++) {
if (i == 0 || i == st.length - 1 || j == 0
|| j == st[i].length - 1) {
System.out.print("*");
} else {
System.out.print(st[i][j]);
}
}
System.out.println();
}
}
@Override
public boolean equals(Object obj) { // 重写equals方法,此步的目的是为了Point类的produceFood方法,让食物的坐标不会和蛇体重复。
Point point = (Point) obj;
return this.x == point.x && this.y == point.y;
}
}
也请教一下,如何用代码清空控制台,知道的大神讲一下哈
|
|