📄 house.java
字号:
package com.dfun.blackjackServer;
import java.util.*;
public class House {
private Control ctrl; //主控
private HouseManage houseManage; //房间管理
public String houseId; //户间id
public String houseName; //房间名称
public String creatorId; //创建者id
public String creatorName; //创建者名称
public int maxClient; //最高上限
private int userCount; //当前房间用户总数
private Vector cards = new Vector(); //还未发的牍列表
private int[][] userCards; //已经下发牌列表
private int userCardsIndex;
//游戏状态0为等待人数到齐,1为游戏已开始进入下注等待,2为下注完毕进入要牌等待,
//3普通用户要牌完毕将游戏状态标志为庄家要牌并进入下一盘游戏开始的等待
private int gameState;
public House(Control ctrl, HouseManage houseManage, String houseId, String houseName, String creatorId, String creatorName, int maxClient) {
this.ctrl = ctrl;
this.houseManage = houseManage;
this.houseId = houseId;
this.houseName = houseName;
this.creatorId = creatorId;
this.creatorName = creatorName;
this.maxClient = maxClient;
initCard();
}
/*****************************************************
* 功能介绍:初始化牌
* 输入参数:无
* 输出参数:无
****************************************************/
public void initCard() {
userCardsIndex = -1;
userCards = new int[52][3];
while (cards.size() != 0) {
cards.remove(0);
}
for (int i = 1; i <= 52; i++) {
cards.add(Integer.toString(i));
}
}
/*****************************************************
* 功能介绍:当前房间用户总数
* 输入参数:无
* 输出参数:当前房间用户总数
****************************************************/
public int getUserCount() {
return userCount;
}
/*****************************************************
* 功能介绍:进入房间
* 输入参数:用户id
* 输出参数:是否成功
****************************************************/
public void intoHouse(String userId) {
User user = (User) ctrl.userManage.getUser(userId);
if (user == null) {
return;
}
//检测人数是否上限,如果上限则不能进入
if (userCount >= maxClient) {
ctrl.sendTwoData(userId, "05full");
return;
}
user.houseId = houseId;
userCount++;
Hashtable houseList = ctrl.userManage.getHouseUserList(houseId);
Enumeration em = houseList.elements();
String strHouseUser = "999999" + "," + "庄家" + "," + "00000000000" + ",";
String strChipIn = getJettonList(houseList.elements(), houseList.size());
for (int i = 0; i < houseList.size(); i++) {
user = (User) em.nextElement();
strHouseUser = strHouseUser + user.userId + "," + user.userName + "," + user.phoneNumber + ",";
}
if (userCount < maxClient) { //加入后人数未达上限
if (gameState == 0) { //游戏还未开始则已普通身份加入并等待用户到齐
sendInfoToHouseUser("05" + strHouseUser);
}
else if (gameState > 0) { //如果游戏已开始,该用户则以观众身份加入,并下发用户列表,筹码列表,已发牌列表
user.userState = 10;
String userCards = this.getCards();
ctrl.sendTwoData(userId, "16" + strHouseUser + "*" + strChipIn + "*" + userCards + "*");
sendInfoToHouseUser("15" + strHouseUser + "*" + strChipIn + "*", userId);
}
}
else { //人数上限
if (gameState == 0) { //游戏还未开始则已普通身份加入并等待用户到齐
gameState = 1; //把游戏状态标志为开始下注,让游戏开始
sendInfoToHouseUser("07" + strHouseUser + "*" + strChipIn + "*");
}
else if (gameState > 0) { //如果游戏已开始,该用户则以观众身份加入,并下发用户列表,筹码列表,已发牌列表
user.userState = 10;
String userCards = this.getCards();
ctrl.sendTwoData(userId, "16" + strHouseUser + "*" + strChipIn + "*" + userCards + "*");
sendInfoToHouseUser("15" + strHouseUser + "*" + strChipIn + "*", userId);
}
}
System.out.println("新加入用户状态为" + user.userState);
}
/*****************************************************
* 功能介绍:退出房间
* 输入参数:用户id
* 输出参数:无
****************************************************/
public void outHouse(String userId) {
//判断是否可以退出
User user = (User) ctrl.userManage.getUser(userId);
if (user == null) {
return;
}
userCount--;
user.houseId = "";
ctrl.sendOneData(userId, "06" + "ok");
//如果当前房间为空固定房间则清理房间,用户自建房间则删除房间
//如果不为空则发用户列表
if (userCount == 0) {
if (!creatorId.equals("999999")) {
houseManage.removeHouse(houseId); //删除临时房间
}
else {
initCard(); //如果是固定房间则重新洗牌
gameState = 0; //将游戏状态置为未开始
}
ctrl.userManage.sendInfoToAllUser("18" + houseManage.getHouseList());
}
else {
Hashtable userList = ctrl.userManage.getHouseUserList(houseId);
Enumeration em = userList.elements();
String strHouseUser = "999999" + "," + "庄家" + "," + "00000000000" + ",";
for (int i = 0; i < userList.size(); i++) {
user = (User) em.nextElement();
strHouseUser = strHouseUser + user.userId + "," + user.userName + "," + user.phoneNumber + ",";
}
sendInfoToHouseUser("17" + strHouseUser);
//用户离开发,针对游戏现在所处的状况做一些处理
switch (gameState) {
case 0: //游戏状态0为等待人数到齐
break;
case 1: //1为游戏已开始进入下注等待
chuckChipOver();
break;
case 2: //2为下注完毕进入要牌等待
checkDellOver();
break;
case 3: //3普通用户要牌完毕将游戏状态标志为庄家要牌并进入下一盘游戏开始的等待
break;
}
}
}
/*****************************************************
* 功能介绍:用户下线
* 输入参数:用户id
* 输出参数:无
****************************************************/
public void userOffline(String userId) {
userCount--;
User user = (User) ctrl.userManage.getUser(userId);
user.houseId = "";
ctrl.userManage.removeUser(userId);
if (userCount == 0) {
if (!creatorId.equals("999999")) {
//删除临时房间
houseManage.removeHouse(houseId);
}
else {
//如果是固定房间则重新洗牌
initCard();
gameState = 0;
}
ctrl.userManage.sendInfoToAllUser("18" + houseManage.getHouseList());
}
else {
Hashtable userList = ctrl.userManage.getHouseUserList(houseId);
Enumeration em = userList.elements();
String strHouseUser = "999999" + "," + "庄家" + "," + "00000000000" + ",";
for (int i = 0; i < userList.size(); i++) {
user = (User) em.nextElement();
strHouseUser = strHouseUser + user.userId + "," + user.userName + "," + user.phoneNumber + ",";
}
sendInfoToHouseUser("17" + strHouseUser);
//用户离开发,针对游戏现在所处的状况做一些处理
switch (gameState) {
case 0: //游戏状态0为等待人数到齐
break;
case 1: //1为游戏已开始进入下注等待
chuckChipOver();
break;
case 2: //2为下注完毕进入要牌等待
checkDellOver();
break;
case 3: //3普通用户要牌完毕将游戏状态标志为庄家要牌并进入下一盘游戏开始的等待
break;
}
}
}
/*****************************************************
* 功能介绍:发送消息给当前房间中的所有用户
* 输入参数:要输出的消息
* 输出参数:无
****************************************************/
public void sendInfoToHouseUser(String outStr) {
Hashtable userList = ctrl.userManage.getHouseUserList(houseId);
Enumeration em = userList.elements();
for (int i = 0; i < userList.size(); i++) {
User user = (User) em.nextElement();
ctrl.sendTwoData(user.userId, outStr);
}
}
/*****************************************************
* 功能介绍:发送消息给当前房间中的所有用户指定的用户除外
* 输入参数:要输出的消息,除外的用户
* 输出参数:无
****************************************************/
public void sendInfoToHouseUser(String outStr, String userId) {
Hashtable userList = ctrl.userManage.getHouseUserList(houseId);
Enumeration em = userList.elements();
for (int i = 0; i < userList.size(); i++) {
User user = (User) em.nextElement();
if (!user.userId.equals(userId)) { //不包含指定的用户
ctrl.sendTwoData(user.userId, outStr);
}
}
}
/*****************************************************
* 功能介绍:检查下注是否完毕
* 输入参数:无
* 输出参数:无
****************************************************/
public void chuckChipOver() {
Hashtable userList = ctrl.userManage.getHouseUserList(houseId);
Enumeration em = userList.elements();
for (int i = 0; i < userList.size(); i++) {
User user = (User) em.nextElement();
if (user.userState != 1 && user.userState != 10) {
System.out.println(user.userId + " 没有准备好进入等待,当前状态为" + user.userState);
return;
}
}
gameState = 2; //所有用户均下注完毕则进入要牌程序
em = userList.elements();
deal(999999, 0);
for (int i = 0; i < userList.size(); i++) {
User user = (User) em.nextElement();
if (user.userState == 1) {
deal(Integer.parseInt(user.userId), 0);
deal(Integer.parseInt(user.userId), 0);
}
}
String cards = getCards();
String jeton = getJettonList(userList.elements(), userList.size());
sendInfoToHouseUser("08" + cards);
sendInfoToHouseUser("09" + jeton);
checkDellOver(); //检查是否要牌结束,防止所有人都没下注变成观众
}
/*****************************************************
* 功能介绍:发牌
* 输入参数:用户id,第几手牌(分牌)
* 输出参数:无
****************************************************/
public void deal(int userId, int number) {
int index = Init.ramdon(cards.size()) - 1;
userCardsIndex++;
userCards[userCardsIndex][0] = userId;
userCards[userCardsIndex][1] = Integer.parseInt( (String) cards.elementAt(index));
userCards[userCardsIndex][2] = number;
cards.remove(index);
}
/*****************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -