本篇文章围绕如下主线:
自己打出一张牌,服务器做碰牌检查
1 如果其它家可以碰牌->提示其碰牌->客户端确认碰牌->服务器端碰牌处理->将碰牌响应返回给所有的玩家
2 如果其它家没有碰的可能->服务器端这边算出摸牌信息,然后将这些信息返回给所有玩家
告诉服务器是我打的牌以及打的是什么牌
将我在玩家列表中的下标编号发给服务器
服务器出牌处理器:
自己出牌后先检查一下其它家是否可以碰杠,如果其它家能够碰和杠则通知那家
public void putOffCard(Avatar avatar,int cardPoint){
avatar.avatarVO.setHuType(0);//重置划水麻将胡牌格式
//出牌信息放入到缓存中,掉线重连的时候,返回房间信息需要
avatar.avatarVO.updateChupais(cardPoint);
avatar.avatarVO.setHasMopaiChupai(true);//修改出牌 摸牌状态
//已经出牌就清除所有的吃,碰,杠,胡的数组
clearAvatar();
//下面这两张牌很重要,服务器将出牌信息先缓存起来,拱后续其它人碰使用
putOffCardPoint = cardPoint;
curAvatarIndex = playerList.indexOf(avatar);
PlayRecordOperation(curAvatarIndex,cardPoint,1,-1,null,null);
avatar.pullCardFormList(putOffCardPoint); //将牌从自己的牌中
for(int i=0;i<playerList.size();i++){
//不能返回给自己
if(i != curAvatarIndex) {
playerList.get(i).getSession().sendMsg(new ChuPaiResponse(1, putOffCardPoint, curAvatarIndex));
}
else{
playerList.get(i).gangIndex.clear();//每次出牌就先清除缓存里面的可以杠的牌下标
}
}
Avatar ava;
StringBuffer sb;
for(int i=0;i<playerList.size();i++){
ava = playerList.get(i);
if(ava.getUuId() != avatar.getUuId()) { //检测其它玩家
sb = new StringBuffer();
if (ava.checkGang(putOffCardPoint)) {
gangAvatar.add(ava);
//同时传会杠的牌的点数
sb.append("gang:"+putOffCardPoint+",");
}
if (ava.checkPeng(putOffCardPoint)) {
penAvatar.add(ava);
sb.append("peng:"+curAvatarIndex+":"+putOffCardPoint+",");
}
if(sb.length()>1){
//如果有人能够碰和杠 则通知他
ava.getSession().sendMsg(new ReturnInfoResponse(1, sb.toString()));
}
}
}
//如果没有吃,碰,杠,胡的情况,则下家自动摸牌
chuPaiCallBack();
}
如果这名玩家点击碰按钮:
其实我个人觉得这里isDrag是不能够设置成True,因为还没有收到服务器端碰牌的响应
服务器在碰牌处理后,告诉所有玩家碰牌信息
public boolean pengCard(Avatar avatar , int cardIndex){
if((penAvatar.size() >= 1 && huAvatar.size() == 0) ||
( huAvatar.contains(avatar) && huAvatar.size() ==1 && penAvatar.size() ==1)) {
avatar.avatarVO.setHasMopaiChupai(true);//修改出牌 摸牌状态
if(huAvatar.contains(avatar)){
huAvatar.remove(avatar);
}
if(gangAvatar.contains(avatar)){
gangAvatar.remove(avatar);
}
if(penAvatar.contains(avatar)){
//回放记录
PlayRecordOperation(playerList.indexOf(avatar),cardIndex,4,-1,null,null);
playerList.get(curAvatarIndex).avatarVO.removeLastChupais(); //从出牌玩家中移除所碰的牌
penAvatar.remove(avatar);
flag = avatar.putCardInList(cardIndex);//把碰的这张牌加入自己的牌组中
avatar.setCardListStatus(cardIndex,1);
//把各个玩家碰的牌记录到缓存中去,牌的index
avatar.avatarVO.getHuReturnObjectVO().updateTotalInfo("peng", cardIndex+"");
clearArrayAndSetQuest();
for (int i=0;i<playerList.size();i++){
if(playerList.get(i).getUuId() == avatar.getUuId()){
//碰了的牌放入到avatar的resultRelation Map中
playerList.get(i).putResultRelation(1,cardIndex+"");
playerList.get(i).avatarVO.getPaiArray()[1][cardIndex]=1;
avatar.getPaiArray()[1][cardIndex] = 1;
}
playerList.get(i).getSession().sendMsg(new PengResponse(1,cardIndex,playerList.indexOf(avatar)));
}
pickAvatarIndex = playerList.indexOf(avatar);
curAvatarIndex = playerList.indexOf(avatar);
currentCardPoint = -2;//断线重连判断该自己出牌
}
}else{
if(penAvatar.size() > 0) {
for (Avatar ava : penAvatar) {
ava.pengQuest = true;
}
}
}
return flag;
}
客户端碰的响应处理:
public void otherPeng(ClientResponse response)//对服务器端碰牌响应处理
{
UpateTimeReStart ();
OtherPengGangBackVO cardVo = JsonMapper.ToObject<OtherPengGangBackVO>(response.message);
otherPengCard = cardVo.cardPoint;
curDirString = getDirection (cardVo.avatarId);
print("Current Diretion==========>" + curDirString);
SetDirGameObjectAction ();
effectType = "peng";
pengGangHuEffectCtrl();
SoundCtrl.getInstance ().playSoundByAction ("peng",avatarList [cardVo.avatarId].account.sex);
if (cardOnTable != null) {
reSetOutOnTabelCardPosition (cardOnTable);
Destroy (cardOnTable);
}
if (curDirString == DirectionEnum.Bottom) { //自己碰牌
mineList [0] [putOutCardPoint]++;
mineList [1] [putOutCardPoint] = 2;
int removeCount = 0;
for (int i = 0; i < handerCardList [0].Count; i++) {
GameObject temp = handerCardList [0] [i];
int tempCardPoint = temp.GetComponent<bottomScript> ().getPoint ();
if (tempCardPoint == putOutCardPoint) {
handerCardList [0].RemoveAt (i);
Destroy (temp); //从手牌中删除碰的牌
i--;
removeCount++;
if (removeCount == 2) {
break;
}
}
}
SetPosition (true);
List<GameObject> templist = new List<GameObject>();
for (int j = 0; j < 3; j++) //重新生成碰的三张牌
{
GameObject obj1 = createGameObjectAndReturn("Prefab/PengGangCard/PengGangCard_B",
pengGangParenTransformB.transform,
new Vector3(-370 + PengGangCardList.Count * 190 + j * 60f, 0));
obj1.GetComponent<TopAndBottomCardScript>().setPoint(putOutCardPoint);
obj1.transform.localScale = Vector3.one;
templist.Add(obj1);
}
PengGangCardList.Add(templist);
GlobalDataScript.isDrag = true;
}
如果自己打牌后,其它家没有吃碰,那么服务器就可以通知下家拾牌
下面是服务器摸牌代码
public void pickCard(){
clearAvatar();
//摸牌
pickAvatarIndex = getNextAvatarIndex();
//pickAvatarIndex = nextIndex;
//本次摸得牌点数,下一张牌的点数,及本次摸的牌点数
int tempPoint = getNextCardPoint();
if(tempPoint != -1) {
//回放记录
PlayRecordOperation(pickAvatarIndex,tempPoint,2,-1,null,null);
currentCardPoint = tempPoint;
Avatar avatar = playerList.get(pickAvatarIndex);
avatar.avatarVO.setHasMopaiChupai(true);//修改出牌 摸牌状态
avatar.qiangHu = true;
avatar.canHu = true;
avatar.avatarVO.setHuType(0);//重置划水麻将胡牌格式
//记录摸牌信息
//avatar.canHu = true;
//告诉这个玩家可以拾取一张牌
avatar.getSession().sendMsg(new PickCardResponse(1, tempPoint));
for(int i=0;i<playerList.size();i++){
if(i != pickAvatarIndex){
playerList.get(i).getSession().sendMsg(new OtherPickCardResponse(1,pickAvatarIndex));
}else {
playerList.get(i).gangIndex.clear();//每次摸牌就先清除缓存里面的可以杠的牌下标
}
}
//判断自己摸上来的牌自己是否可以胡
StringBuffer sb = new StringBuffer();
//摸起来也要判断是否可以杠,胡
avatar.putCardInList(tempPoint);
if (avatar.checkSelfGang()) {
gangAvatar.add(avatar);
sb.append("gang");
for (int i : avatar.gangIndex) {
sb.append(":"+i);
}
sb.append(",");
//avatar.gangIndex.clear();//9-18出牌了才清楚(在杠时断线重连后需要这里面的数据)
}
if(checkAvatarIsHuPai(avatar,100,"mo")){
huAvatar.add(avatar);
sb.append("hu,");
}
if(sb.length()>2){
avatar.getSession().sendMsg(new ReturnInfoResponse(1, sb.toString()));
}
}
FR:海涛高软(hunk Xu) QQ技术交流群:386476712