?? 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 + -