⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 player.java

📁 贪吃蛇网络版 运行平台 LINUX/UNIX Macintosh Windows Server 2003 Windows 2000 Windows XP Windows CE Windows 9*/
💻 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 + -