📄 player.java
字号:
package logic;
//用途:在服务器端检测游戏情况(一个Player类只检测一个玩家的游戏情况),有事件发生时将产生的的事件处理命令放到命令队列中。命令队列中的命令将对所有玩家广播。
import java.util.*;
public class Player implements Directable, Runnable {
private int id; //玩家编号
private int len = 3; //长度
private int xHead; //头的x坐标
private int yHead; //头的y坐标
private int direction = 0; //方向(0表示没有方向,不动)
private int speed = 100; //速度,每100毫秒移动一格
private CommandSender commandSender; // 命令发送者
private Food food; // 食物
private WorldMap worldMap; // 地图
private Vector footPrint = new Vector(); // 足迹(走过的路线)
public Player(int id, CommandSender commandSender, Food food, WorldMap worldMap) {
this.id = id;
this.commandSender = commandSender;
this.food = food;
this.worldMap = worldMap;
// 初始化开始位置
xHead = Integer.parseInt(worldMap.getPlayerStartPosition(id*2));
yHead = Integer.parseInt(worldMap.getPlayerStartPosition(id*2+1));
// 将开始位置加入足迹
footPrint.insertElementAt(String.valueOf(xHead)+" "+String.valueOf(yHead),0);
worldMap.add(String.valueOf(xHead)+" "+String.valueOf(yHead));
new Thread(this).start();
}
public int getId() {
return id;
}
public void setLen(int len) {
this.len = len;
}
public void setXHead(int xHead) {
this.xHead = xHead;
}
public void setYHead(int yHead) {
this.yHead = yHead;
}
public void setDirection(int direction) {
this.direction = direction;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public int getLen() {
return len;
}
public int getXHead() {
return xHead;
}
public int getYHead() {
return yHead;
}
public int getDirection() {
return direction;
}
public int getSpeed() {
return speed;
}
public void run() {
String command;
try {
while (!Thread.interrupted()) {
// 根据方向决定头部的坐标变化
switch (direction) {
case UP:
yHead -= 20;
// 如果跑到窗体外,则置为相反方向(以下同)
if (yHead<0) yHead = worldMap.getMapHeight() - 20;
break;
case RIGHT:
xHead += 20;
xHead %= worldMap.getMapWidth();
break;
case DOWN:
yHead += 20;
yHead %= worldMap.getMapHeight();
break;
case LEFT:
xHead -= 20;
if (xHead<0) xHead = worldMap.getMapWidth() - 20;
break;
}
if (direction != 0) {
// 坐标变化后,发送‘移动’命令。
command = "Move|"+String.valueOf(id)+"|"+String.valueOf(xHead)+"|"+String.valueOf(yHead);
// 加入到命令队列
commandSender.add(command);
// 若撞到障碍
if (worldMap.isBarrier(String.valueOf(xHead)+" "+String.valueOf(yHead))) {
command = "Die|"+String.valueOf(id);
commandSender.add(command);
break;
}
// 若吃到食物
if (xHead==food.getX() && yHead==food.getY()) {
// 重新生成食物
do {
food.foodGenerator();
}while(worldMap.isBarrier(String.valueOf(food.getX())+" "+String.valueOf(food.getY())));
// 食物坐标改变,发送‘食物’命令
command = "Food|"+String.valueOf(food.getX())+"|"+String.valueOf(food.getY()+"|"+String.valueOf(id));
commandSender.add(command);
// 自己的长度加一,发送‘增长’命令
command = "Grow|"+String.valueOf(id);
commandSender.add(command);
len++;
// 每吃4个食物,速度增加一点
if (len % 4 ==0) {
speed -= 10;
}
}
// 记录足迹
footPrint.insertElementAt(String.valueOf(xHead)+" "+String.valueOf(yHead),0);
worldMap.add(String.valueOf(xHead)+" "+String.valueOf(yHead));
// 若记录长度超过蛇的长度,则消去太旧的记录
if (footPrint.size()==len) {
worldMap.remove((String)footPrint.lastElement());
footPrint.removeElementAt(footPrint.size()-1);
}
}
// 这里控制蛇的速度
Thread.sleep(speed);
}
}catch(Exception e){
e.printStackTrace();
}
}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -