`
nbtlxx
  • 浏览: 253694 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

手机网络象棋开发(4):核心类Desk, Umpire介绍

阅读更多
今天介绍下Desk、Umpire类

Desk这个类非常重要,可以说是整个服务器框架的核心。
 
  和Server类交互:使用server提供的发送消息的方法,发送消息给特定玩家(全体或者对家)
  和LogicHandler交互:提供被调用的具体的方法
                      包括:玩家坐下、棋子move等等重要动作
  和Player类交互:保存该桌子上的玩家
                  设置玩家到某个桌子
                  从特定桌子remove 玩家对象
                  检查player的start状态,决定本周游戏是否可以开始

  和Umpire类交互:初始化umpire
                  启动
                  判断输赢
                 
  详细查看代码
Desk.java
package net.tuolian.newserver;
import java.util.Vector;

/**
 * 
 * @author sean
 * 部分代码来自书本
 *
 */
public class Desk {
	private int ID;					// tableId
	private Player[] players;		// 玩家数组
	private int NUM = 2;			//   每桌玩家个数
	private Player banker = null; 	// 是否庄家
	private int bankerID = 0;	 	// 庄家id
	private Umpire umpire;			// 	裁判
	private int game = 0;   	  	// 
	Server server;

	/**
	 * 游戏桌子
	 */
	public Desk() {
		game = 0;
		server = new Server();
		umpire = new Umpire();
		players = new Player[NUM];    //初始化,本桌子上玩家的数组
		banker = null;
		bankerID = 0;
		
		for (int i = 0; i < NUM; i++) {
			players[i] = null;
		}
	}
	/**
	 * 初始化
	 */
	public void init() {
		banker = null;
		bankerID = 0;
		game = 0;
		
		//裁判类进行初始化
		umpire.init();
	}
	
	/**
	 * 复位
	 */
	public void reset(){
		umpire.init();
		for(int i=0;i<NUM;i++)
			players[i].reset();
	}
	
	/**
	 * 开始游戏
	 * 确定红、白
	 * 发送消息给各自的玩家
	 * 发送轮次
	 */
	public void start() {
		players[bankerID].setColor("red");
		players[(bankerID+1)%NUM].setColor("white");
		sendMessage(players[bankerID], "color:"+players[bankerID].getColor());
		sendMessageToOther(players[bankerID],"color:"+players[(bankerID+1)%NUM].getColor());
		sendMessage(players[bankerID], "turn");
	}
	
	/**
	 * 移动棋子
	 * 解析message
	 * 调用裁判的moveChess方法
	 * 发送消息给对方
	 * 
	 * 如果出现胜负、则发送win消息给双方
	 * @param message
	 */
	public void moveChess(String message) {
		int index0 = message.indexOf(";");
		int index1 = message.indexOf(":");
		int index2 = message.indexOf(",", index1 + 1);
		int index3 = message.indexOf(",", index2 + 1);
		int index4 = message.indexOf(",", index3 + 1);
		
		int seat = Integer.parseInt(message.substring(index0 + 1, index1));
		int selectedY = Integer.parseInt(message.substring(index1 + 1, index2));
		int selectedX = Integer.parseInt(message.substring(index2 + 1, index3));
		int n = Integer.parseInt(message.substring(index3 + 1, index4));
		int m = Integer.parseInt(message.substring(index4 + 1));
		
		//移动棋子,发送消息给对家
		umpire.moveChess(selectedY, selectedX, n, m);
		sendMessageToOther(players[seat], message);
	
		//判断是否有输赢结果,如果有的话,发送相应的消息,扩展:进展游戏的结果的保存,比如分数等
		if (Umpire.isWhiteWin == 0) {
			sendMessage(players[bankerID], "win,you");
			sendMessageToOther(players[bankerID], "win");
			bankerID = (seat + 1) % NUM;
			reset();
		} else if (Umpire.isRedWin == 0) {
			sendMessage(players[(bankerID+1)%NUM], "win,you");
			sendMessageToOther(players[(bankerID+1)%NUM], "win");
			bankerID = (seat + 1) % NUM;
			reset();
		}
	}
	public int getID() {
		return ID;
	}
	public void setID(int id) {
		ID = id;
	}
	public Player getBanker() {
		return banker;
	}
	public void setBanker(Player banker) {
		this.banker = banker;
	}
	public int getGame() {
		return game;
	}
	
	/**
	 * 必须所有人满桌才可以开始游戏
	 * 桌子上的玩家为空,false
	 * 桌子上玩家的状态没有开始, false
	 * @return
	 */
	public boolean isReady() // 
	{
		for (int i = 0; i < NUM; i++) {
			if (players[i] == null)
				return false;
			else if (!players[i].isStart())
				return false;
		}
		
		//裁判类初始化,启动逻辑判断
		umpire.init();
		return true;
	}
	
	/**
	 * 判断当前座位是否为空
	 * @param pos
	 * @return
	 */
	public boolean isEmpty(int pos) {// 
		if (pos >= NUM)
			return false;
		return players[pos] == null;
	}

	/**
	 * 设置坐庄者
	 * @return
	 */
	public int getBankerID() {
		return bankerID;
	}
	
	/**
	 * 获得当前桌子的玩家数
	 * @return
	 */
	public int getPlayersCounter() {
		return NUM;
	}
	
	/**
	 * 获得玩家数组
	 * @return
	 */
	public Player[] getPlayers() {
		return players;
	}
	
	/**
	 * 获得指定玩家
	 * 判断数组是否为空,是,则进行下次循环
	 * 否则查看数组中玩家是否等于传入的玩家对象
	 * @param p
	 * @return
	 */
	public int getPlayerSeat(Player p) 
	{
		for (int i = 0; i < NUM; i++) {
			if (players[i] == null)
				continue;
			if (players[i].equals(p))
				return i;
		}
		return -1;
	}
	
	/**
	 * 设置玩家
	 * @param pos
	 * @param p
	 */
	public void setPlayer(int pos, Player p) {
		if (pos >= NUM)
			return;
		players[pos] = p;
	}
	
	/**
	 * 去掉某个指定玩家
	 * @param p
	 */
	public void removePlayer(Player p) {// �Ƴ����p
		for (int i = 0; i < NUM; i++) {
			if (players[i] == null)
				continue;
			else if (players[i].equals(p))
				players[i] = null;
		}
	}
	
	/**
	 * 发送消息给所有玩家
	 * @param mes
	 */
	public void sendMessageToAll(String mes) {
		for (int i = 0; i < NUM; i++)
			if (players[i] != null)
				sendMessage(players[i], mes);
	}
	
	/**
	 * 发送消息给游戏的对家
	 * 根据playerId比较,如果是本人就跳出本次循环
	 * 否则发送消息
	 * @param player
	 * @param message
	 */
	public void sendMessageToOther(Player player, String message) {
		for (int i = 0; i < NUM; i++) {
			System.out.println("玩家id比较: " + (players[i].getID() == player.getID()));
			System.out.println("玩家比较:" +players[i].equals(player));
			if (players[i] != null){
				if(players[i].getID() == player.getID()){
					continue;
				}
				else{
					sendMessage(players[i], message);
				}
			}
		}
	}
	
	/**
	 * 发送消息给指定玩家
	 * 调用server的发送消息方式,
	 * 在后者的方法中:提取消息的各个部分,二进制方式写到网络流
	 * @param p
	 * @param m
	 */
	public void sendMessage(Player p, String m) {
		Server.sendMessage(p, m);
	}
}


Umpire.java
主要功能:
   游戏核心逻辑的启动、判断、移动等等
   具体算法,还需要花费时间加深理解。
   今后可以进一步将通信、逻辑(大厅、游戏逻辑等)封装,加强后续的扩展和维护性。
具体参考代码
package net.tuolian.newserver;

/**
 * 
 * @author sean
 * 裁判类
 * 1. 构造函数
 * 2. 
 *
 */
public class Umpire {
	private int huihe;
	private int score;
	protected static int i, j;
	protected static int isRedWin = 1, isWhiteWin = 1;// 
	private int point[][];			//棋牌坐标
	
	/**
	 * 构造方法
	 */
	public Umpire() {
		huihe = 0;
		score = 0;
		
		point = new int[][] { { 1, 2, 3, 4, 5, 6, 7, 8, 9 },// 
				{ 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
				{ 0, 10, 0, 0, 0, 0, 0, 11, 0 },
				{ 12, 0, 13, 0, 14, 0, 15, 0, 16 },
				{ 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
				{ 0, 0, 0, 0, 0, 0, 0, 0, 0 },
				{ 28, 0, 29, 0, 30, 0, 31, 0, 32 },
				{ 0, 26, 0, 0, 0, 0, 0, 27, 0 },
				{ 0, 0, 0, 0, 0, 0, 0, 0, 0 },
				{ 17, 18, 19, 20, 21, 22, 23, 24, 25 } };
	}
	
	/**
	 * 分析输赢结果
	 */
	public void checkWin() {// 
		isRedWin = 0;
		isWhiteWin = 0;
		for (i = 0; i < 3; i++) {
			for (j = 0; j < 3; j++) {
				if (point[0 + i][3 + j] == 5) {
					isRedWin++;
				}
			}
		}
		for (i = 0; i < 3; i++) {
			for (j = 0; j < 3; j++) {
				if (point[7 + i][3 + j] == 21) {
					isWhiteWin++;
				}
			}
		}
	}
	
	/**
	 * 移动棋子
	 * @param selectedY
	 * @param selectedX
	 * @param n
	 * @param m
	 */
	public void moveChess(int selectedY, int selectedX, int n, int m) {
		point[selectedY][selectedX] = point[n][m];
		point[n][m] = 0;
		checkWin();
	}
	
	/**
	 * 
	 */
	public void logHuihe() {
		huihe++;
	}
	
	/**
	 * 
	 * @return
	 */
	public int getHuihe() {
		return huihe;
	}
	
	/**
	 * 初始化
	 */
	public void init() {
		System.out.println("裁判程序初始化完成");
		huihe = 0;
		score = 0;
		isRedWin = 1;
		isWhiteWin = 1;
		point = new int[][] { { 1, 2, 3, 4, 5, 6, 7, 8, 9 },
				{ 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
				{ 0, 10, 0, 0, 0, 0, 0, 11, 0 },
				{ 12, 0, 13, 0, 14, 0, 15, 0, 16 },
				{ 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
				{ 0, 0, 0, 0, 0, 0, 0, 0, 0 },
				{ 28, 0, 29, 0, 30, 0, 31, 0, 32 },
				{ 0, 26, 0, 0, 0, 0, 0, 27, 0 }, 
				{ 0, 0, 0, 0, 0, 0, 0, 0, 0 },
				{ 17, 18, 19, 20, 21, 22, 23, 24, 25 } };
	}
	
	public int score() {
		return score;
	}
	
	public void clearScore() {
		score = 0;
	}
	
	public void clearhuihe() {
		huihe = 0;
	}
}



分享到:
评论

相关推荐

    JAVA项目开发全程实录(含电子书和所有源代码)

    《Java项目开发全程实录》这一本书从开发背景、需求分析、系统功能分析、数据库分析、数据库建模、网站开发和网站发布或者程序打包与运行,每一过程都进行了详细的介绍。 目 录 第1章 进销存管理系统(Swing+SQL ...

    DIA-Umpire:DIA蛋白质组学数据的计算分析管道-开源

    4. **定量分析**:DIA-Umpire能够对不同样品间的肽段或蛋白质进行相对或绝对定量,这在比较实验中尤为重要。软件提供多种定量方法,如iTRAQ、TMT等标签定量,以及基于峰面积或强度的无标签定量。 5. **结果可视化和...

    Python库 | Umpire-0.3.1-py2-none-any.whl

    Umpire库可能是由Python社区开发的一个工具,用于特定的编程任务。由于没有提供详细的库功能介绍,我们可以基于通用的Python库特性进行一些推测。通常,Python库会针对数据处理、科学计算、网络编程、图形用户界面、...

    Umpire:面向应用程序的API,用于NUMA和GPU架构上的内存管理

    裁判员v5.0.0 Umpire是一个资源管理库,它允许在具有多个内存设备(例如NUMA和GPU)的计算机上发现,提供和管理内存。 裁判使用CMake和BLT处理构建。 由于BLT作为子模块提供,因此首先请确保运行: $ git submodule ...

    garden-umpire:花园裁判网站

    4. **CSS预处理器**:为了提高效率和代码复用,开发人员可能会使用Sass、Less或Stylus等CSS预处理器,它们提供了变量、嵌套规则、函数等功能。 5. **动画和过渡**:CSS可以实现元素的动态效果,如淡入淡出、滑动等...

    Umpire-SearchResultParser:带有估计 FDR 过滤的 PepXML 和 ProtXML 文件解析器

    裁判-SearchResultParser 带有估计 FDR 过滤的 PepXML 和 ProtXML 文件解析器裁判搜索结果解析器(版本:v1.0,2014.11)命令:java –jar –Xmx1G Umpire-SearchResultParser.jar [Options] [Combined ProtXML file...

    c++的一些简单的程序。有用的哟。来看看吧

    4. **平均分计算**:平均分计算时去除了最高分和最低分,这种处理方式在实际比赛中较为常见。 5. **代码复用性**:通过类的封装,使得该程序具有较好的可扩展性和复用性,可以在不同场景下进行调整使用。 #### 五、...

    Head.First.C#.中文版.图文皆译.第十一章.事件和委托.翻译完毕.PDF下载

    4. **订阅事件**:如`Pitcher`、`Umpire`、`Fans`等对象可以订阅`BallInPlay`事件,以便在事件发生时采取相应行动。 5. **处理事件**:各个订阅者在接收到事件通知后,可以通过各自的事件处理方法来处理事件。 ...

    head first C#学习笔记:如何创建事件

    订阅者类(如`Pitcher`, `Audience`, `Umpire`)需要响应事件。它们通过在类中定义处理事件的方法,并在实例化时将这些方法附加到事件上: ```csharp public class Pitcher { private GameController game...

    排球专业英语词汇一览表.doc

    - 副裁判(Umpire): 辅助主裁判的工作。 - 计分员(Scorer): 负责记录比赛得分。 - 司线员(Linesman): 负责判断球是否出界的辅助裁判。 以上是排球专业英语词汇及其含义的详细介绍。这些词汇涵盖了场地设置...

    DiscuzX2目录结构文件与文件夹详细说明.docx

    4. `forum_moderate.js`、`forum_post.js`、`home_blog.js`、`smilies.js`、`space_diy.js`、`threadsort.js`和`tree.js`:这些JavaScript文件分别服务于论坛管理、发帖、家园日志、表情、个人空间DIY、主题排序和树...

    有关运动的英语单词2.doc

    3. **职业角色**:文档中涉及的与运动相关的职业角色包括经理(manager)、教练(instructor)、领队(guide)、助理教练(trainer)、裁判(referee, umpire)和运动员(contestant, competitor, player)。此外,还有专业...

    SWATH最新软件DIA-group

    DIA-group软件包含了对多个DIA数据文件进行分析的核心方法——Group-DIA。Group-DIA是一种非靶向分析方法,其独特之处在于可以同时分析多个DIA数据文件。与最近在《Nature Methods》上发表的另一种非靶向分析方法DIA...

    关于运动的英语单词2.doc

    2. **角色和职位**:文档提到了与运动相关的人士,如经纪人(manager)、教练(instructor)、领队(guide)、助理教练(trainer)、裁判(referee, umpire)、运动员(contestant, competitor, player)等。了解这些术语有助于...

    所有运动 英语.doc

    4. **体育术语**:如"chalk up"表示用粉笔记下分数,"make one's mark"意味着在体育领域取得成就或出名,"make headway"则表示在比赛中取得进展。 5. **体育对社会的影响**:文档中提到了体育对个人健康的重要性,...

    数据不依赖获取的质谱数据的深度学习分析方法.pdf

    此外,厦门大学的研究团队开发了一种通过分析肽段母离子和子离子信号相关性的方法,以及MSPLIT-DIA匹配分析方法,这些都为DIA质谱数据分析提供了新思路。 深度学习在DIA质谱数据分析中的应用表明,机器学习技术能够...

    和网球有关的英语词汇

    本文将详细介绍与网球相关的英语词汇,帮助你更好地理解和参与网球活动,特别是对于裁判工作。 首先,我们关注一下与比赛和球员相关的基本词汇。"Manager"指的是负责运动员职业生涯的经纪人,而"instructor"则是...

    线性规划发展史及简单的线性规划PPT学习教案.pptx

    随着计算机技术的发展,线性规划的求解软件如MPSX、OPHEIE和UMPIRE等应运而生,能够高效解决具有数千个变量的问题。 线性规划的应用不仅限于传统的数学问题,它还推动了其他数学规划领域的发展,包括整数规划、随机...

    FragPipe:用于运行 MSFragger 和 Philosopher 的跨平台图形用户界面 (GUI) - 用于全面分析霰弹枪蛋白质组学数据的管道

    FragPipe 二进制文件中还包括用于基于 TMT/iTRAQ 同量异位标记量化的 、用于具有运行间匹配 (MBR) 功能的无标签量化的 、SpectraST 和 EasyPQP 谱库构建模块以及 DIA-Umpire SE 模块用于直接分析数据独立采集 (DIA)...

Global site tag (gtag.js) - Google Analytics