- 浏览: 253644 次
- 性别:
- 来自: 宁波
文章分类
最新评论
-
wangxiang243:
文件保存为utf8编码格式就可以了吧
java.util.Properties 乱码问题解决方案 -
uyiab:
真心感谢,之前搞了一套2.1.4的程序,一直发生这个问题,找了 ...
如何解决cocos2dx2.1.4回到前台后出现的黑屏现象 -
Tongqing-Qiu:
我用的Intellij IDEA集成的GIT工具,挺方便的。有 ...
git分支、合并的使用记录 -
nbtlxx:
...
三星s7572无法显示toast的问题解决 -
kouwoo:
这篇文章对我非常有用,谢谢
三星s7572无法显示toast的问题解决
今天介绍下Desk、Umpire类
Desk这个类非常重要,可以说是整个服务器框架的核心。
和Server类交互:使用server提供的发送消息的方法,发送消息给特定玩家(全体或者对家)
和LogicHandler交互:提供被调用的具体的方法
包括:玩家坐下、棋子move等等重要动作
和Player类交互:保存该桌子上的玩家
设置玩家到某个桌子
从特定桌子remove 玩家对象
检查player的start状态,决定本周游戏是否可以开始
和Umpire类交互:初始化umpire
启动
判断输赢
详细查看代码
Desk.java
Umpire.java
主要功能:
游戏核心逻辑的启动、判断、移动等等
具体算法,还需要花费时间加深理解。
今后可以进一步将通信、逻辑(大厅、游戏逻辑等)封装,加强后续的扩展和维护性。
具体参考代码
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; } }
发表评论
-
cocos2dx斗地主产品错误修复过程
2013-12-27 10:57 1343一个多星期没有写新的东西了。下面内容是最近修复的一个bug的过 ... -
eclipse adt 更新到22.3后R文件不能自动生成的解决
2013-12-16 14:05 1960上周六手痒,把android develop tools(ad ... -
如何解决cocos2dx2.1.4回到前台后出现的黑屏现象
2013-12-11 14:17 1986cocos2dx1.4引擎上开发的app。安装好点击打开运行。 ... -
手机游戏UI的初步设计
2010-09-03 13:32 1412主要工作参考无花的代码,再次感谢。 1. Part.java ... -
手机游戏引擎框架的初步想法
2010-09-03 13:25 1339一直想重构下手机游戏客户端的引擎 主要思路: 1. Main. ... -
ioserver的学习体会
2010-08-31 18:21 1173ioserver的学习体会 1. config. 设置地址(s ... -
MMORPG开发入门
2009-07-25 23:37 1867原著:Radu Privantu 翻译:pAnic ... -
手机网络象棋开发(7): 架构优化规划
2009-06-27 12:50 1200主要是针对Server进行架构的优化 1. 采用最新NIO机 ... -
手机网络象棋开发(6):Mycanvas及共用类介绍
2009-06-27 11:44 1357MyCancas类比较复杂 主要 ... -
手机网络象棋开发(5):客户端Game类、网络通讯类NetClient介绍
2009-06-27 11:34 3121Game.java 继承midlet * 游戏程序的入口 ... -
手机网络象棋开发(3):公用类介绍
2009-06-26 17:54 1224共用类主要包括Player,Queue,Message 这些 ... -
手机网络象棋开发(2):网络通信、逻辑处理模块
2009-06-26 17:51 1550上次简单介绍了Server的写法,这个类比较简单,主要的功能包 ... -
手机网络象棋开发(1): 服务器类Server介绍
2009-06-24 22:56 1365为了更好的理解手机网络游戏的架构和开发技巧,本人在他人手机网络 ... -
参考学习封装Queue队列,先进先出
2009-06-06 11:56 2105最近由于项目需求,参考有关的代码,学习封装了一个队列 主要技术 ... -
手机网络游戏的几个特点
2009-05-19 09:14 1714本人觉得手机网络游戏 ... -
手机游戏网络休闲游戏开发思路
2009-05-19 08:53 1781项目初步设想:开发一个基于目前pc游戏平台的手机休闲游戏,将符 ...
相关推荐
《Java项目开发全程实录》这一本书从开发背景、需求分析、系统功能分析、数据库分析、数据库建模、网站开发和网站发布或者程序打包与运行,每一过程都进行了详细的介绍。 目 录 第1章 进销存管理系统(Swing+SQL ...
4. **定量分析**:DIA-Umpire能够对不同样品间的肽段或蛋白质进行相对或绝对定量,这在比较实验中尤为重要。软件提供多种定量方法,如iTRAQ、TMT等标签定量,以及基于峰面积或强度的无标签定量。 5. **结果可视化和...
Umpire库可能是由Python社区开发的一个工具,用于特定的编程任务。由于没有提供详细的库功能介绍,我们可以基于通用的Python库特性进行一些推测。通常,Python库会针对数据处理、科学计算、网络编程、图形用户界面、...
裁判员v5.0.0 Umpire是一个资源管理库,它允许在具有多个内存设备(例如NUMA和GPU)的计算机上发现,提供和管理内存。 裁判使用CMake和BLT处理构建。 由于BLT作为子模块提供,因此首先请确保运行: $ git submodule ...
4. **CSS预处理器**:为了提高效率和代码复用,开发人员可能会使用Sass、Less或Stylus等CSS预处理器,它们提供了变量、嵌套规则、函数等功能。 5. **动画和过渡**:CSS可以实现元素的动态效果,如淡入淡出、滑动等...
裁判-SearchResultParser 带有估计 FDR 过滤的 PepXML 和 ProtXML 文件解析器裁判搜索结果解析器(版本:v1.0,2014.11)命令:java –jar –Xmx1G Umpire-SearchResultParser.jar [Options] [Combined ProtXML file...
4. **平均分计算**:平均分计算时去除了最高分和最低分,这种处理方式在实际比赛中较为常见。 5. **代码复用性**:通过类的封装,使得该程序具有较好的可扩展性和复用性,可以在不同场景下进行调整使用。 #### 五、...
4. **订阅事件**:如`Pitcher`、`Umpire`、`Fans`等对象可以订阅`BallInPlay`事件,以便在事件发生时采取相应行动。 5. **处理事件**:各个订阅者在接收到事件通知后,可以通过各自的事件处理方法来处理事件。 ...
订阅者类(如`Pitcher`, `Audience`, `Umpire`)需要响应事件。它们通过在类中定义处理事件的方法,并在实例化时将这些方法附加到事件上: ```csharp public class Pitcher { private GameController game...
- 副裁判(Umpire): 辅助主裁判的工作。 - 计分员(Scorer): 负责记录比赛得分。 - 司线员(Linesman): 负责判断球是否出界的辅助裁判。 以上是排球专业英语词汇及其含义的详细介绍。这些词汇涵盖了场地设置...
4. `forum_moderate.js`、`forum_post.js`、`home_blog.js`、`smilies.js`、`space_diy.js`、`threadsort.js`和`tree.js`:这些JavaScript文件分别服务于论坛管理、发帖、家园日志、表情、个人空间DIY、主题排序和树...
3. **职业角色**:文档中涉及的与运动相关的职业角色包括经理(manager)、教练(instructor)、领队(guide)、助理教练(trainer)、裁判(referee, umpire)和运动员(contestant, competitor, player)。此外,还有专业...
DIA-group软件包含了对多个DIA数据文件进行分析的核心方法——Group-DIA。Group-DIA是一种非靶向分析方法,其独特之处在于可以同时分析多个DIA数据文件。与最近在《Nature Methods》上发表的另一种非靶向分析方法DIA...
2. **角色和职位**:文档提到了与运动相关的人士,如经纪人(manager)、教练(instructor)、领队(guide)、助理教练(trainer)、裁判(referee, umpire)、运动员(contestant, competitor, player)等。了解这些术语有助于...
4. **体育术语**:如"chalk up"表示用粉笔记下分数,"make one's mark"意味着在体育领域取得成就或出名,"make headway"则表示在比赛中取得进展。 5. **体育对社会的影响**:文档中提到了体育对个人健康的重要性,...
此外,厦门大学的研究团队开发了一种通过分析肽段母离子和子离子信号相关性的方法,以及MSPLIT-DIA匹配分析方法,这些都为DIA质谱数据分析提供了新思路。 深度学习在DIA质谱数据分析中的应用表明,机器学习技术能够...
本文将详细介绍与网球相关的英语词汇,帮助你更好地理解和参与网球活动,特别是对于裁判工作。 首先,我们关注一下与比赛和球员相关的基本词汇。"Manager"指的是负责运动员职业生涯的经纪人,而"instructor"则是...
随着计算机技术的发展,线性规划的求解软件如MPSX、OPHEIE和UMPIRE等应运而生,能够高效解决具有数千个变量的问题。 线性规划的应用不仅限于传统的数学问题,它还推动了其他数学规划领域的发展,包括整数规划、随机...
FragPipe 二进制文件中还包括用于基于 TMT/iTRAQ 同量异位标记量化的 、用于具有运行间匹配 (MBR) 功能的无标签量化的 、SpectraST 和 EasyPQP 谱库构建模块以及 DIA-Umpire SE 模块用于直接分析数据独立采集 (DIA)...