斗地主+三人+叫地主+设置无作弊+积分属性

斗地主+三人+叫地主+设置无作弊+积分属性

斗地主+三人+叫地主+设置无作弊+积分属性

版权声明原作品版权声明本文版权声明

一、相关文章二、新增功能新增Player类(属性:名字、类型、积分)直到有一位玩家的积分小于0,则游戏结束**地主牌牌型翻倍 方法returnHoleCardPoint()炸弹翻倍每局结束有结算游戏结束有展示战绩

三、运行PlayWithLandlord_CallPoints_NoTip_HasBP_V1展示四、代码代码框架其余代码PlayerPlayWithLandlord_CallPoints_NoTip_HasBP_V1版权声明

版权声明

原作品版权声明

java斗地主游戏开发 算法思路讲解 转载请注明出处 若本文侵犯原作者的版权,联系邮箱3063494684@qq.com删除本文

本文版权声明

代码改编于两人版 java斗地主游戏开发 算法思路讲解

1、本文所有内容文字资料,版权均属作者个人所有, 任何媒体、网站或个人不得复制内容用于发布/发表。 引用必须注明来源

2、本文下载仅供个人学习或研究,不得在任何网站以任何形式上传。

3、转载、链接、转贴必须注明来源,并且不能用作商用,只能用于学习或研究

除注明来源外,以下内容亦不可任意转载: a.本文所指向的非本人内容的相关链接内容; b.已作出不得转载或未经许可不得转载声明的内容; c.其他法律不允许或本人认为不适合的内容。

转载或引用本人内容不得进行如下活动: a.损害本人或他人利益; b.任何违法行为; c.任何可能破坏公秩良俗的行为; d.擅自同意他人继续转载、引用本文内容;

4、对不遵守本声明或其他违法、恶意使用本人内容者,本人保留追究其法律责任的权利。

署名:日星月云

一、相关文章

斗地主三人版 斗地主+三人+叫地主 斗地主+三人+叫地主+作弊(可设置) 斗地主+三人+叫地主+作弊(可设置)+积分属性 斗地主+三人+叫地主+作弊(可设置)+积分属性+记牌器(可设置)

二、新增功能

新增Player类(属性:名字、类型、积分)

直到有一位玩家的积分小于0,则游戏结束**

地主牌牌型翻倍 方法returnHoleCardPoint()

双王 4倍

同花/顺子/三条 3倍

单王 2倍

炸弹翻倍

每局结束有结算

游戏结束有展示战绩

三、运行PlayWithLandlord_CallPoints_NoTip_HasBP_V1展示

"C:\Program Files\Java\jdk-15.0.1\bin\java.exe" "-javaagent:E:\IntelliJ IDEA 2021.1\lib\idea_rt.jar=3805:E:\IntelliJ IDEA 2021.1\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\lenovo\IdeaProjects\DouDiZhu\out\production\DouDiZhu;C:\Users\lenovo\.m2\repository\junit\junit\4.13.1\junit-4.13.1.jar;C:\Users\lenovo\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\lenovo\.m2\repository\org\junit\jupiter\junit-jupiter\5.7.0\junit-jupiter-5.7.0.jar;C:\Users\lenovo\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.7.0\junit-jupiter-api-5.7.0.jar;C:\Users\lenovo\.m2\repository\org\apiguardian\apiguardian-api\1.1.0\apiguardian-api-1.1.0.jar;C:\Users\lenovo\.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;C:\Users\lenovo\.m2\repository\org\junit\platform\junit-platform-commons\1.7.0\junit-platform-commons-1.7.0.jar;C:\Users\lenovo\.m2\repository\org\junit\jupiter\junit-jupiter-params\5.7.0\junit-jupiter-params-5.7.0.jar;C:\Users\lenovo\.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.7.0\junit-jupiter-engine-5.7.0.jar;C:\Users\lenovo\.m2\repository\org\junit\platform\junit-platform-engine\1.7.0\junit-platform-engine-1.7.0.jar com.ddz.PlayWithLandlord_CallPoints_NoTip_HasBP_V1

地主牌为♥6

您的扑克牌:[大王, A, K, Q, Q, J, 10, 10, 9, 8, 7, 5, 5, 5, 3, 3, 3]

=====================================叫地主阶段=====================================

下家有地主牌♥6,下家先叫地主

===下家叫地主===

1分

===上家叫地主===

2分

===玩家叫地主===

输入0,不叫 / 输入3,3分 -----> 0

不叫

======上家是地主======

===================================================================================

底分为:2

底牌为[8, 9, K],并且牌型为杂牌,翻1倍

现在分数为:2

==================================出牌阶段==================================

=======================上家[地主]主动出牌=======================

上家主动出牌:[J, J, 10, 10, 9, 9]

=============玩家[农民]出牌=================

上一次出牌:CardProduct{list=[J, J, 10, 10, 9, 9], type=连对, maxCard=J, len=6, group=[(num=8, sum=2), (num=7, sum=2), (num=6, sum=2)]}

您当前的扑克牌:[大王, A, K, Q, Q, J, 10, 10, 9, 8, 7, 5, 5, 5, 3, 3, 3]

请您出牌:(输入.不出 输入?提示 输入,偷看电脑的牌)

.

=============下家[农民]出牌=================

下家出牌:[6, 6, 6, 6]

所出为炸弹翻2倍,现在分数为:4(2*2)

=============上家[地主]出牌=================

上家不要

=============玩家[农民]出牌=================

上一次出牌:CardProduct{list=[6, 6, 6, 6], type=炸弹, maxCard=6, len=4, group=[(num=3, sum=4)]}

您当前的扑克牌:[大王, A, K, Q, Q, J, 10, 10, 9, 8, 7, 5, 5, 5, 3, 3, 3]

请您出牌:(输入.不出 输入?提示 输入,偷看电脑的牌)

.

=======================下家[农民]主动出牌=======================

下家主动出牌:[A, A, A, 8, 8]

下家出牌:[A, A, A, 8, 8]

=============上家[地主]出牌=================

上家出牌:[2, 2, 2, 7, 7]

=============玩家[农民]出牌=================

上一次出牌:CardProduct{list=[2, 2, 2, 7, 7], type=三带一对, maxCard=2, len=5, group=[(num=12, sum=3), (num=4, sum=2)]}

您当前的扑克牌:[大王, A, K, Q, Q, J, 10, 10, 9, 8, 7, 5, 5, 5, 3, 3, 3]

请您出牌:(输入.不出 输入?提示 输入,偷看电脑的牌)

.

=============下家[农民]出牌=================

下家不要

=======================上家[地主]主动出牌=======================

上家主动出牌:[4, 4, 4, 3]

=============玩家[农民]出牌=================

上一次出牌:CardProduct{list=[4, 4, 4, 3], type=三带一, maxCard=4, len=4, group=[(num=1, sum=3), (num=0, sum=1)]}

您当前的扑克牌:[大王, A, K, Q, Q, J, 10, 10, 9, 8, 7, 5, 5, 5, 3, 3, 3]

请您出牌:(输入.不出 输入?提示 输入,偷看电脑的牌)

5550

出牌成功:CardProduct{list=[5, 5, 5, 10], type=三带一, maxCard=5, len=4, group=[(num=2, sum=3), (num=7, sum=1)]}

=============下家[农民]出牌=================

下家不要

=============上家[地主]出牌=================

上家不要

=======================玩家[农民]主动出牌=======================

您当前的扑克牌:[大王, A, K, Q, Q, J, 10, 9, 8, 7, 3, 3, 3]

请您出牌:(输入?提示 输入,偷看电脑的牌)

7890jqk1

出牌成功:CardProduct{list=[A, K, Q, J, 10, 9, 8, 7], type=顺子, maxCard=A, len=8, group=[(num=11, sum=1), (num=10, sum=1), (num=9, sum=1), (num=8, sum=1), (num=7, sum=1), (num=6, sum=1), (num=5, sum=1), (num=4, sum=1)]}

=============下家[农民]出牌=================

下家不要

=============上家[地主]出牌=================

上家不要

=======================玩家[农民]主动出牌=======================

您当前的扑克牌:[大王, Q, 3, 3, 3]

请您出牌:(输入?提示 输入,偷看电脑的牌)

C

出牌成功:CardProduct{list=[大王], type=单牌, maxCard=大王, len=1, group=[(num=13, sum=1)]}

=============下家[农民]出牌=================

下家不要

=============上家[地主]出牌=================

上家不要

=======================玩家[农民]主动出牌=======================

您当前的扑克牌:[Q, 3, 3, 3]

请您出牌:(输入?提示 输入,偷看电脑的牌)

333q

出牌成功:CardProduct{list=[3, 3, 3, Q], type=三带一, maxCard=3, len=4, group=[(num=0, sum=3), (num=9, sum=1)]}

=======================================================================

你赢啦!

胜利者为mePlayer[农民]分数4

=============================================================================

===============================================结算===============================================

---------------------------------------------------------------------------------------------------

| 局次 | 获胜者 | 上家积分结算 | 玩家积分结算 | 下家积分结算 | 分数 |

| 1 | mePlayer[农民] | 2 (10-8) | 14 (10+4) | 14 (10+4) | 4 |

==================================================================================================

是否要提前结束(Y/N)

n

地主牌为♦K

您的扑克牌:[2, 2, 2, A, K, K, J, J, J, 10, 9, 9, 8, 7, 5, 3, 3]

=====================================叫地主阶段=====================================

下家有地主牌♦K,下家先叫地主

===下家叫地主===

1分

===上家叫地主===

不叫

===玩家叫地主===

输入0,不叫 / 输入2,2分 / 输入3,3分 -----> 2

2分

======玩家是地主======

===================================================================================

底分为:2

底牌为[7, 小王, Q],并且牌型为单王,翻2倍

现在分数为:4

==================================出牌阶段==================================

=======================玩家[地主]主动出牌=======================

您当前的扑克牌:[小王, 2, 2, 2, A, K, K, Q, J, J, J, 10, 9, 9, 8, 7, 7, 5, 3, 3]

请您出牌:(输入?提示 输入,偷看电脑的牌)

5

出牌成功:CardProduct{list=[5], type=单牌, maxCard=5, len=1, group=[(num=2, sum=1)]}

=============下家[农民]出牌=================

下家出牌:[7]

=============上家[地主]出牌=================

上家出牌:[2]

=============玩家[地主]出牌=================

上一次出牌:CardProduct{list=[2], type=单牌, maxCard=2, len=1, group=[(num=12, sum=1)]}

您当前的扑克牌:[小王, 2, 2, 2, A, K, K, Q, J, J, J, 10, 9, 9, 8, 7, 7, 3, 3]

请您出牌:(输入.不出 输入?提示 输入,偷看电脑的牌)

c

出牌成功:CardProduct{list=[小王], type=单牌, maxCard=小王, len=1, group=[(num=13, sum=1)]}

=============下家[农民]出牌=================

下家出牌:[大王]

=============上家[地主]出牌=================

上家不要

=============玩家[地主]出牌=================

上一次出牌:CardProduct{list=[大王], type=单牌, maxCard=大王, len=1, group=[(num=13, sum=1)]}

您当前的扑克牌:[2, 2, 2, A, K, K, Q, J, J, J, 10, 9, 9, 8, 7, 7, 3, 3]

请您出牌:(输入.不出 输入?提示 输入,偷看电脑的牌)

.

=======================下家[农民]主动出牌=======================

下家主动出牌:[6, 6, 5, 5, 4, 4, 3, 3]

下家出牌:[6, 6, 5, 5, 4, 4, 3, 3]

=============上家[地主]出牌=================

上家不要

=============玩家[地主]出牌=================

上一次出牌:CardProduct{list=[6, 6, 5, 5, 4, 4, 3, 3], type=连对, maxCard=6, len=8, group=[(num=3, sum=2), (num=2, sum=2), (num=1, sum=2), (num=0, sum=2)]}

您当前的扑克牌:[2, 2, 2, A, K, K, Q, J, J, J, 10, 9, 9, 8, 7, 7, 3, 3]

请您出牌:(输入.不出 输入?提示 输入,偷看电脑的牌)

.

=======================下家[农民]主动出牌=======================

下家主动出牌:[Q, Q, Q, K, K]

下家出牌:[Q, Q, Q, K, K]

下家就剩2牌啦!!!

=============上家[地主]出牌=================

上家不要

=============玩家[地主]出牌=================

上一次出牌:CardProduct{list=[Q, Q, Q, K, K], type=三带一对, maxCard=Q, len=5, group=[(num=9, sum=3), (num=10, sum=2)]}

您当前的扑克牌:[2, 2, 2, A, K, K, Q, J, J, J, 10, 9, 9, 8, 7, 7, 3, 3]

请您出牌:(输入.不出 输入?提示 输入,偷看电脑的牌)

22233

出牌成功:CardProduct{list=[2, 2, 2, 3, 3], type=三带一对, maxCard=2, len=5, group=[(num=12, sum=3), (num=0, sum=2)]}

=============下家[农民]出牌=================

下家不要

=============上家[地主]出牌=================

上家不要

=======================玩家[地主]主动出牌=======================

您当前的扑克牌:[A, K, K, Q, J, J, J, 10, 9, 9, 8, 7, 7]

请您出牌:(输入?提示 输入,偷看电脑的牌)

77

出牌成功:CardProduct{list=[7, 7], type=对子, maxCard=7, len=2, group=[(num=4, sum=2)]}

=============下家[农民]出牌=================

下家不要

=============上家[地主]出牌=================

上家出牌:[9, 9]

=============玩家[地主]出牌=================

上一次出牌:CardProduct{list=[9, 9], type=对子, maxCard=9, len=2, group=[(num=6, sum=2)]}

您当前的扑克牌:[A, K, K, Q, J, J, J, 10, 9, 9, 8]

请您出牌:(输入.不出 输入?提示 输入,偷看电脑的牌)

jj

出牌成功:CardProduct{list=[J, J], type=对子, maxCard=J, len=2, group=[(num=8, sum=2)]}

=============下家[农民]出牌=================

下家不要

=============上家[地主]出牌=================

上家出牌:[A, A]

=============玩家[地主]出牌=================

上一次出牌:CardProduct{list=[A, A], type=对子, maxCard=A, len=2, group=[(num=11, sum=2)]}

您当前的扑克牌:[A, K, K, Q, J, 10, 9, 9, 8]

请您出牌:(输入.不出 输入?提示 输入,偷看电脑的牌)

.

=============下家[农民]出牌=================

下家不要

=======================上家[地主]主动出牌=======================

上家主动出牌:[8, 7, 6, 5, 4]

=============玩家[地主]出牌=================

上一次出牌:CardProduct{list=[8, 7, 6, 5, 4], type=顺子, maxCard=8, len=5, group=[(num=5, sum=1), (num=4, sum=1), (num=3, sum=1), (num=2, sum=1), (num=1, sum=1)]}

您当前的扑克牌:[A, K, K, Q, J, 10, 9, 9, 8]

请您出牌:(输入.不出 输入?提示 输入,偷看电脑的牌)

890jq

出牌成功:CardProduct{list=[Q, J, 10, 9, 8], type=顺子, maxCard=Q, len=5, group=[(num=9, sum=1), (num=8, sum=1), (num=7, sum=1), (num=6, sum=1), (num=5, sum=1)]}

=============下家[农民]出牌=================

下家不要

=============上家[地主]出牌=================

上家不要

=======================玩家[地主]主动出牌=======================

您当前的扑克牌:[A, K, K, 9]

请您出牌:(输入?提示 输入,偷看电脑的牌)

kk

出牌成功:CardProduct{list=[K, K], type=对子, maxCard=K, len=2, group=[(num=10, sum=2)]}

玩家就剩2牌啦!!!

=============下家[农民]出牌=================

下家不要

=============上家[地主]出牌=================

上家不要

=======================玩家[地主]主动出牌=======================

您当前的扑克牌:[A, 9]

请您出牌:(输入?提示 输入,偷看电脑的牌)

9

出牌成功:CardProduct{list=[9], type=单牌, maxCard=9, len=1, group=[(num=6, sum=1)]}

玩家就剩1牌啦!!!

=============下家[农民]出牌=================

下家出牌:[J]

上家就剩1牌啦!!!

=============上家[地主]出牌=================

上家不要

=============玩家[地主]出牌=================

上一次出牌:CardProduct{list=[J], type=单牌, maxCard=J, len=1, group=[(num=8, sum=1)]}

您当前的扑克牌:[A]

请您出牌:(输入.不出 输入?提示 输入,偷看电脑的牌)

1

出牌成功:CardProduct{list=[A], type=单牌, maxCard=A, len=1, group=[(num=11, sum=1)]}

===================================================================================

你赢啦!

胜利者为mePlayer[地主]分数4

=============================================================================

===============================================结算===============================================

---------------------------------------------------------------------------------------------------

| 局次 | 获胜者 | 上家积分结算 | 玩家积分结算 | 下家积分结算 | 分数 |

| 2 | mePlayer[地主] | -2 (2-4) | 22 (14+8) | 10 (14-4) | 4 |

==================================================================================================

最终的获胜者为mePlayer,所拥有积分:22

其他人leftPlayer,所拥有积分:-2,rightPlayer,所拥有积分:10

是否要展示战绩(Y/N)

y

=================================================展示战绩===================================================

---------------------------------------------------------------------------------------------------

| 局次 | 获胜者 | 上家积分结算 | 玩家积分结算 | 下家积分结算 | 分数 |

| 1 | mePlayer[农民] | 2 (10-8) | 14 (10+4) | 14 (10+4) | 4 |

---------------------------------------------------------------------------------------------------

| 局次 | 获胜者 | 上家积分结算 | 玩家积分结算 | 下家积分结算 | 分数 |

| 2 | mePlayer[地主] | -2 (2-4) | 22 (14+8) | 10 (14-4) | 4 |

===========================================================================================================

Process finished with exit code 0

四、代码

代码框架

其余代码

斗地主+三人+叫地主

Player

package com.ddz;

public class Player {

public String name;

public int type=GameConstants.TYPE_Farmer;//类型

public int bonusPoint =10;//积分

public Player() {

}

public Player(String name,int integral) {

this.name=name;

this.bonusPoint = integral;

}

public String showType(){

String s;

if (type==GameConstants.TYPE_Landlord){

s="地主";

}else {

s="农民";

}

return s;

}

public String toStringNameAndBP(){return ""+name+",所拥有积分:"+bonusPoint;}

@Override

public String toString() {

return "" + name + "["+showType()+"]" ;

}

@Override

public boolean equals(Object o) {

if (this == o) return true;

if (o == null || getClass() != o.getClass()) return false;

Player player = (Player) o;

return name.equals( player.name);

}

}

PlayWithLandlord_CallPoints_NoTip_HasBP_V1

package com.ddz;

import org.junit.Test;

import java.util.ArrayList;

import java.util.List;

import java.util.Scanner;

/*

* Cc代表大小王,0代表10

* 大小写jqk都可以代表JQK

* Aa1都代表A

*

* 多少副牌sum、是否包含345contains345可以在main方法中更改

*

* 四炸<双王炸<五炸<六炸<三王炸<七炸<八炸<四王炸

* 并且[大王, 大王]是可以打赢[大王, 小王]和[小王, 小王]的

*/

/**

* 斗地主+三人+叫地主+设置无作弊+积分属性+V1

*/

public class PlayWithLandlord_CallPoints_NoTip_HasBP_V1 {

static int initPoints = 10;//初始积分

private static final Player mePlayer = new Player("mePlayer", initPoints);//参赛人员玩家

private static final Player leftPlayer = new Player("leftPlayer", initPoints);//参赛人员上家

private static final Player rightPlayer = new Player("rightPlayer", initPoints);//参赛人员下家

private static String grate="";//计分板

/**

* 所出的牌手中是否存在

* @param list 手中的牌

* @param card 所出的牌

* @return 返回所出的牌在手中的索引

*/

public static List searchIndexByNum(List list, List card) {

if (card.size() > list.size()) return null;

int[] cardNum = new int[list.size()];

for (int i = 0; i < list.size(); i++) {

cardNum[i] = list.get(i).num;

}

List indexes = new ArrayList<>();

for (Card value : card) {

if (value.num > GameConstants.NUM_2) {

final int id = value.id;

for (int j = 0; j < list.size(); j++) {

if (value.id == list.get(j).id && !indexes.contains(j)) {

indexes.add(j);

break;

}

}

} else {

for (int j = 0; j < cardNum.length; j++) {

if (value.num == cardNum[j] && !indexes.contains(j)) {

indexes.add(j);

break;

}

}

}

}

if (indexes.size() != card.size()) return null;

return indexes;

}

/**

* 发牌 地主牌 和 底牌

* @param sum 多少副牌

* @param contains345 是否包含345

* @return List> 012三位玩家的牌,3地主牌 和 4底牌

*

*/

public static List> licensing(int sum, boolean contains345) {

List> listList = new ArrayList<>();

List playerList = new ArrayList<>();

List leftList = new ArrayList<>();

List rightList = new ArrayList<>();

List specialCardToList = new ArrayList<>();

List holeCards = new ArrayList<>();

Card specialCard;

//牌堆

ArrayList list = new ArrayList<>();//牌堆

for (int i = 0; i < sum; i++) {

for (int j = contains345 ? GameConstants.ID_3_1 : GameConstants.ID_6_1; j < 54; j++) {

list.add(j);

}

}

//地主牌

int specialId;

while (true) {

specialId = (int) (Math.random() * list.size());

if (!contains345) {

if (specialId >= GameConstants.ID_3_1 && specialId < GameConstants.ID_6_1) {

continue;

}

}

specialCard = new Card(specialId);

break;

}

specialCardToList.add(specialCard);

//底牌

while (holeCards.size() < 3) {

int cardId = (int) (Math.random() * list.size());

if (specialId != cardId) {

Card card = new Card(list.remove(cardId));

holeCards.add(card);

}

}

//随机发牌

while (list.size() > 0) {

playerList.add(new Card(list.remove((int) (Math.random() * list.size()))));

leftList.add(new Card(list.remove((int) (Math.random() * list.size()))));

rightList.add(new Card(list.remove((int) (Math.random() * list.size()))));

}

//排序

playerList.sort((o1, o2) -> o2.id - o1.id);

leftList.sort((o1, o2) -> o2.id - o1.id);

rightList.sort((o1, o2) -> o2.id - o1.id);

listList.add(playerList);

listList.add(leftList);

listList.add(rightList);

listList.add(specialCardToList);

listList.add(holeCards);

return listList;

}

/**

* 地主牌 判断花色

* @param card 地主牌

* @return 花色

*/

public static String Suit(Card card) {

if (card.id==GameConstants.ID_JOKER_1||card.id==GameConstants.ID_JOKER_2){

return "";

}

int suitId = card.id % 4;

return switch (suitId) {

case 0 -> "♥";

case 1 -> "♦";

case 2 -> "♣";

case 3 -> "♠";

default -> null;

};

}

/**

* 返回底牌所翻倍数

* 双王 4倍

* 同花/顺子/三条 3倍

* 单王 2倍

* @param holeCards 底牌

* @return [0]底牌的牌型和[1]底牌所翻倍数

*/

public static Object[] returnHoleCardPoint(List holeCards){

Object[] objects=new Object[2];

String holeCardsType="杂牌";

int HoleCardPoint=1;

List groups = CardUtils.createGroup(holeCards);//按num小到大

if (groups.size()==1){//三条

HoleCardPoint*=3;

holeCardsType="三条";

} else if (groups.size()==2){

if (groups.get(1).num== GameConstants.NUM_JOKER&&groups.get(1).sum==2) {//双王 一个单

HoleCardPoint*=4;

holeCardsType="双王";

}else if(groups.get(1).num== GameConstants.NUM_JOKER&&groups.get(1).sum==1){//单王 一个对

HoleCardPoint*=2;

holeCardsType="单王";

}

}else if (groups.size()==3){

if (groups.get(2).num== GameConstants.NUM_JOKER) {//单王

HoleCardPoint*=2;

holeCardsType="单王";

}else if (groups.get(1).num==groups.get(0).num+1&&groups.get(2).num==groups.get(0).num+2) {//顺子

HoleCardPoint*=3;

holeCardsType="顺子";

} else if ( Suit(holeCards.get(0)).equals(Suit(holeCards.get(1)))&&Suit(holeCards.get(0)).equals(Suit(holeCards.get(2))) ){//同花

HoleCardPoint*=3;

holeCardsType="同花";

}

}

objects[0]=holeCardsType;

objects[1]=HoleCardPoint;

return objects;

}

//测试 returnHoleCardPoint

@Test

public void testReturnHoleCardPoint(){

List cards=new ArrayList<>();

// cards.add(new Card(GameConstants.ID_JOKER_1));

// cards.add(new Card(GameConstants.ID_JOKER_2));

// cards.add(new Card(GameConstants.ID_A_1));

// cards.add(new Card(GameConstants.ID_A_3));

// cards.add(new Card(GameConstants.ID_A_2));

// cards.add(new Card(GameConstants.ID_A_1));

// cards.add(new Card(GameConstants.ID_A_1));

// cards.add(new Card(GameConstants.ID_Q_1));

cards.add(new Card(GameConstants.ID_K_1));

cards.add(new Card(GameConstants.ID_Q_1));

cards.add(new Card(GameConstants.ID_10_1));

Object[] objects = returnHoleCardPoint(cards);

System.out.println(objects[0]);

System.out.println(objects[1]);

}

/**

* 预估玩家的初始手牌的牌力

* 5--一分 7--两分 10--三分

* 炸弹分为5点

* 对于7890j炸弹为4(因为容易被拆)

* 对于王炸为8分

* // * 10点--一分 16---两分 20--三分

* // * 对于3456QKA2C的炸弹分依次+1(3炸为5分...C炸为13分)

* 三条2是3分

* 三条是1点

* 对2是2点

* C是4分

* c是3分

*

* @param list 玩家的初始手牌

* @return 玩家的初始手牌的牌力

*/

public static int CardsPower(List list) {

int power = 0;

boolean hasCc = false;

List groups = CardUtils.createGroup(list);

groups.sort((o1, o2) -> {

//order by sum desc,num desc

final int o = o2.sum - o1.sum;

if (o != 0) return o;

return o2.num - o1.num;

});

for (CardGroup cardGroup : groups) {

if (cardGroup.sum == 4) {

//大分

// int p = 5;

// switch (cardGroup.num) {

// case GameConstants.NUM_3:

// p += 0;

// case GameConstants.NUM_4:

// p += 1;

// case GameConstants.NUM_5:

// p += 1;

// case GameConstants.NUM_6:

// p += 1;

// break;

// case GameConstants.NUM_7:

// case GameConstants.NUM_8:

// case GameConstants.NUM_9:

// case GameConstants.NUM_10:

// case GameConstants.NUM_J:

// p=-1;

// break;

// case GameConstants.NUM_Q:

// p += 4;

// case GameConstants.NUM_K:

// p += 1;

// case GameConstants.NUM_A:

// p += 1;

// case GameConstants.NUM_2:

// p += 1;

// break;

//

// }

// power+=p;

switch (cardGroup.num) {

case GameConstants.NUM_7, GameConstants.NUM_8, GameConstants.NUM_9, GameConstants.NUM_10, GameConstants.NUM_J -> power += 4;

default -> power += 5;

}

} else if (cardGroup.sum == 3) {

if (cardGroup.num == GameConstants.NUM_2) {

power += 3;

} else {

power += 1;

}

} else if (cardGroup.sum == 2) {

if (cardGroup.num == GameConstants.NUM_2) {

power += 2;

} else if (cardGroup.num == GameConstants.NUM_JOKER) {

hasCc = true;

power += 8;

}

}

}

if (hasCc) {

} else if (list.contains(new Card(GameConstants.ID_JOKER_1))) {

power += 3;

} else if (list.contains(new Card(GameConstants.ID_JOKER_2))) {

power += 4;

}

return power;

}

/**

* 手牌变为牌力变为叫分

* @param list 手牌

* @return 叫分

*/

public static int point(List list) {

int power = CardsPower(list);

if (power < 5) {

return 0;

} else if (power < 7) {

return 1;

} else if (power < 10) {

return 2;

} else {

return 3;

}

}

/**

* 叫地主进行中

* @param leftList 上家的牌

* @param playerList 玩家的牌

* @param rightList 下家的牌

* @param specialCard 地主牌

* @return result 返回012上家、玩家、下家是否成为地主以及3所叫的分数的List

*/

public static List CallLandlord(List leftList, List playerList, List rightList, Card specialCard) {

int point;

boolean lc = leftList.contains(specialCard);//上家是否拿地主牌,先叫

boolean mc = playerList.contains(specialCard);//玩家是否拿地主牌,先叫

boolean rc = rightList.contains(specialCard);//下家是否拿地主牌,先叫

System.out.println("=====================================叫地主阶段=====================================");

String ss;

if (lc) {

ss = "上家";

} else if (mc) {

ss = "玩家";

} else {

ss = "下家";

}

System.out.println(ss + "有地主牌" + Suit(specialCard) + specialCard + "," + ss + "先叫地主");

List result = new ArrayList<>();

boolean calling = true;

boolean lFirstCall = false;

boolean mFirstCall = false;

boolean rFirstCall = false;

boolean lCall0 = false;

boolean mCall0 = false;

boolean rCall0 = false;

boolean lHasCalled = false;

boolean mHasCalled = false;

boolean rHasCalled = false;

int lPoint = 0;

int mPoint = 0;

int rPoint = 0;

int lastPoint = -1;

while (calling) {

if (lc) {

if (!mFirstCall && !rFirstCall) {

lFirstCall = true;

}

System.out.println("===上家叫地主===");

lPoint = point(leftList);

if (lPoint > lastPoint) {

lHasCalled = true;

switch (lPoint) {

case 0 -> {

System.out.println("不叫");

lastPoint = 0;

lCall0 = true;

lc = false;

mc = true;

}

case 1 -> {

System.out.println("1分");

lastPoint = 1;

lc = false;

mc = true;

}

case 2 -> {

System.out.println("2分");

lastPoint = 2;

lc = false;

mc = true;

}

case 3 -> {

System.out.println("3分");

lastPoint = 3;

lc = false;

}

}

} else {

System.out.println("不叫");

lPoint = 0;

lCall0 = true;

lc = false;

lHasCalled = true;

mc = true;

}

}

if (lastPoint == 3 || (lCall0 && mCall0 && rCall0)) {

break;

} else if (lHasCalled && mHasCalled && rHasCalled) {

break;

}

while (mc) {

if (!lFirstCall && !rFirstCall) {

mFirstCall = true;

}

System.out.println("===玩家叫地主===");

Scanner scanner = new Scanner(System.in);

String tip = "输入0,不叫 / ";

switch (lastPoint) {

case -1:

tip = "输入0,不叫 / ";

case 0:

tip = tip + "输入1,1分 / ";

case 1:

tip = tip + "输入2,2分 / ";

case 2:

tip = tip + "输入3,3分 ";

}

System.out.print(tip + " -----> ");

String s = scanner.nextLine();

if (!s.equals("0") && !s.equals("1") && !s.equals("2") && !s.equals("3")) {

continue;

}

mPoint = Integer.parseInt(s);

if (mPoint <= lastPoint) {

if (mPoint != 0) {

continue;

}

}

switch (mPoint) {

case 0 -> {

System.out.println("不叫");

if (lastPoint == 0 || lastPoint == -1) {//此条件为上一次叫或玩家首次不叫,否则玩家不叫不会改变上一次的叫分

lastPoint = 0;

}

mCall0 = true;

mc = false;

mHasCalled = true;

rc = true;

}

case 1 -> {

System.out.println("1分");

lastPoint = 1;

mc = false;

mHasCalled = true;

rc = true;

}

case 2 -> {

System.out.println("2分");

lastPoint = 2;

mc = false;

mHasCalled = true;

rc = true;

}

case 3 -> {

System.out.println("3分");

lastPoint = 3;

mc = false;

mHasCalled = true;

}

}

}

if (lastPoint == 3 || (lCall0 && mCall0 && rCall0)) {

break;

} else if (lHasCalled && mHasCalled && rHasCalled) {

break;

}

if (rc) {

if (!mFirstCall && !lFirstCall) {

rFirstCall = true;

}

System.out.println("===下家叫地主===");

rPoint = point(rightList);

if (rPoint > lastPoint) {

rHasCalled = true;

switch (rPoint) {

case 0 -> {

System.out.println("不叫");

lastPoint = 0;

rCall0 = true;

rc = false;

lc = true;

}

case 1 -> {

System.out.println("1分");

lastPoint = 1;

rc = false;

lc = true;

}

case 2 -> {

System.out.println("2分");

lastPoint = 2;

rc = false;

lc = true;

}

case 3 -> {

System.out.println("3分");

rc = false;

lc = true;

lastPoint = 3;

}

}

} else {

System.out.println("不叫");

rPoint = 0;

rCall0 = true;

lc = true;

rc = false;

rHasCalled = true;

}

}

if (lastPoint == 3 || (lCall0 && mCall0 && rCall0)) {

calling = false;

} else if (lHasCalled && mHasCalled && rHasCalled) {

break;

}

}

if (lCall0 && mCall0 && rCall0) {

if (lFirstCall) {

lPoint = 1;

} else if (mFirstCall) {

mPoint = 1;

} else if (rFirstCall) {

rPoint = 1;

}

}

boolean LandlordIsL = lPoint > mPoint && lPoint > rPoint;

boolean LandlordIsM = lPoint < mPoint && mPoint > rPoint;

boolean LandlordIsR = rPoint > mPoint && lPoint < rPoint;

if (LandlordIsL) {

System.out.println("======上家是地主======");

leftPlayer.type = GameConstants.TYPE_Landlord;

point = lPoint;

} else if (LandlordIsM) {

System.out.println("======玩家是地主======");

mePlayer.type = GameConstants.TYPE_Landlord;

point = mPoint;

} else {

System.out.println("======下家是地主======");

rightPlayer.type = GameConstants.TYPE_Landlord;

point = rPoint;

}

result.add(LandlordIsL);

result.add(LandlordIsM);

result.add(LandlordIsR);

result.add(point);

System.out.println("===================================================================================");

return result;

}

/**

* main 方法

* @param args 参数

*/

public static void main(String[] args) {

Tip tip = new Tip(true, true, true, false, false);

int sum = 1;//多少副牌

boolean contains345 = true;//是否包含345

int count = 1;//局次

Scanner scanner=new Scanner(System.in);

while (mePlayer.bonusPoint > 0 && leftPlayer.bonusPoint > 0 && rightPlayer.bonusPoint > 0) {

//洗牌,发牌

List> listList = licensing(sum, contains345);

List playerList = listList.get(0);//玩家

List leftList = listList.get(1);//上家

List rightList = listList.get(2);//下家

Card specialCard = listList.get(3).get(0);//地主牌,最开始叫地主

List holeCards = listList.get(4);//底牌

//看牌

System.out.println("地主牌为" + Suit(specialCard) + specialCard);

if (!tip.NoShowsHoleCards) {

System.out.println("底牌为" + holeCards);

}

System.out.println("您的扑克牌:" + playerList);

if (!tip.NoShowsCards) {

System.out.println("上家扑克牌:" + leftList);

System.out.println("下家扑克牌:" + rightList);

}

//叫地主

List objectList = CallLL(leftList, playerList, rightList, specialCard,holeCards);

//打牌

List objects = playingCards(leftList, playerList, rightList,holeCards, tip,objectList);

//结算

System.out.println("===============================================结算===============================================");

Player winner = (Player) objects.get(0);

int point = (int) objects.get(1);

String re = settlePoints(count, winner, point);

System.out.println(re);

addGrate(re);

System.out.println("==================================================================================================");

if (mePlayer.bonusPoint > 0 && leftPlayer.bonusPoint > 0 && rightPlayer.bonusPoint > 0) {

//提前结束结束

System.out.println("是否要提前结束(Y/N)");

String over = scanner.nextLine();

boolean overs = false;

if (over.equalsIgnoreCase("Y")) {

overs = true;

}

if (overs) {

break;

}

}

count++;//局次加加

}

//最终获胜者

if(mePlayer.bonusPoint>= leftPlayer.bonusPoint&&mePlayer.bonusPoint>= rightPlayer.bonusPoint){

System.out.println("最终的获胜者为"+mePlayer.toStringNameAndBP());

System.out.println("其他人"+leftPlayer.toStringNameAndBP()+","+rightPlayer.toStringNameAndBP());

} else if(mePlayer.bonusPoint< leftPlayer.bonusPoint&&leftPlayer.bonusPoint>= rightPlayer.bonusPoint){

System.out.println("最终的获胜者为"+leftPlayer.toStringNameAndBP());

System.out.println("其他人"+mePlayer.toStringNameAndBP()+","+rightPlayer.toStringNameAndBP());

} else {

System.out.println("最终的获胜者为"+rightPlayer.toStringNameAndBP());

System.out.println("其他人"+leftPlayer.toStringNameAndBP()+","+mePlayer.toStringNameAndBP());

}

//战绩展示

System.out.println("是否要展示战绩(Y/N)");

String show = scanner.nextLine();

if (show.equalsIgnoreCase("N")){

}else {

//展示战绩

System.out.println("=================================================展示战绩===================================================");

System.out.println(grate);

System.out.println("===========================================================================================================");

}

}

/**

* 叫地主

* @param leftList 上家手牌

* @param playerList 玩家手牌

* @param rightList 下家手牌

* @param specialCard 地主牌

* @param holeCards 底牌

* @return 012上家玩家下家是否成为地主 4分数

*/

public static List CallLL(List leftList, List playerList, List rightList,Card specialCard,List holeCards){

List objects=new ArrayList<>();

//进行叫地主

List result = CallLandlord(leftList, playerList, rightList,specialCard);

boolean l = (boolean) result.get(0);//是否成为地主

boolean m = (boolean) result.get(1);

boolean r = (boolean) result.get(2);

int point = (int) result.get(3);//分数

System.out.println("底分为:"+point);

objects.add(l);

objects.add(m);

objects.add(r);

Object[] objects1 = returnHoleCardPoint(holeCards);

int holeCardPoint = (int) objects1[1];

System.out.println("底牌为"+holeCards+",并且牌型为"+objects1[0]+",翻"+objects1[1]+"倍");

point*=holeCardPoint;

System.out.println("现在分数为:"+point);

objects.add(point);

return objects;

}

/**

* 打牌

* @param leftList 上家手牌

* @param playerList 玩家手牌

* @param rightList 下家手牌

* @param holeCards 底牌

* @param tip 提示

* @param objects 叫地主返回的参数 012上家玩家下家是否成为地主 4分数

* @return winnerAndPoint 获胜者和分数

*/

public static List playingCards(List leftList, List playerList, List rightList, List holeCards, Tip tip,List objects) {

List winnerAndPoint = new ArrayList<>();

CardProduct last = CardProduct.createNullType();//上一次出牌

boolean playing = true;

boolean toLeft = false;//出牌

boolean toMe = false;//我出

boolean toRight = false;

boolean l = (boolean) objects.get(0);//成为地主并且主动出牌

boolean m = (boolean) objects.get(1);

boolean r = (boolean) objects.get(2);

int point = (int) objects.get(3);

if (l) {

leftList.addAll(holeCards);

leftList.sort((o1, o2) -> o2.id - o1.id);

} else if (m) {

playerList.addAll(holeCards);

playerList.sort((o1, o2) -> o2.id - o1.id);

} else {

rightList.addAll(holeCards);

rightList.sort((o1, o2) -> o2.id - o1.id);

}

boolean isMe = false;//me获胜

System.out.println("==================================出牌阶段==================================");

Scanner scanner = new Scanner(System.in);

while (playing) {

if (l) {

System.out.println("=======================上家["+leftPlayer.showType()+"]主动出牌=======================");

if (!tip.NoShowsCards) {

System.out.println("上家当前扑克牌:" + leftList);

}

last = CardProduct.createNullType();

Prompt prompt = new Prompt(leftList, last);

if (prompt.prompt.size() > 0) {

CardProducts cardProducts = CardsFactory.builder(prompt.prompt.get(0));

int index = cardProducts.isGreaterThan(last);

if (index >= 0) {

last = cardProducts.list.get(index);

leftList.removeAll(last.list);

System.out.println("上家主动出牌:" + last.list);

if (last.type==GameConstants.TYPE_BOOM){

System.out.println("所出为炸弹翻2倍,现在分数为:"+point*2+"("+point+"*2)");

point*=2;

}

if (!tip.NoShowsCardsNum) {

System.out.println("上家剩余牌数:" + leftList.size());

}

if (leftList.size() == 2) {

System.out.println("上家就剩2牌啦!!!");

} else if (leftList.size() == 1) {

System.out.println("上家就剩1牌啦!!!");

} else if (leftList.size() == 0) {

System.out.println("=======================================================================");

System.out.println("上家赢了!");

System.out.println("你输啦!");

break;

}

toLeft = false;

toMe = true;

}

}

}

if (toLeft) {

System.out.println("=============上家["+leftPlayer.showType()+"]出牌=================");

if (!tip.NoShowsCards) {

System.out.println("上家当前扑克牌:" + leftList);

}

Prompt prompt = new Prompt(leftList, last);

if (prompt.prompt.size() > 0) {

CardProducts cardProducts = CardsFactory.builder(prompt.prompt.get(0));

int index = cardProducts.isGreaterThan(last);

if (index >= 0) {

last = cardProducts.list.get(index);

leftList.removeAll(last.list);

System.out.println("上家出牌:" + last.list);

if (last.type==GameConstants.TYPE_BOOM){

System.out.println("所出为炸弹翻2倍,现在分数为:"+point*2+"("+point+"*2)");

point*=2;

}

if (!tip.NoShowsCardsNum) {

System.out.println("上家剩余牌数:" + leftList.size());

}

if (leftList.size() == 2) {

System.out.println("上家就剩2牌啦!!!");

} else if (leftList.size() == 1) {

System.out.println("上家就剩1牌啦!!!");

} else if (leftList.size() == 0) {

System.out.println("=======================================================================");

System.out.println("上家赢了!");

System.out.println("你输啦!");

break;

}

m = false;

r = false;

l = true;

toLeft = false;

toMe = true;

}

} else {

System.out.println("上家不要");

toLeft = false;

toMe = true;

}

}

while (m) {

System.out.println("=======================玩家["+mePlayer.showType()+"]主动出牌=======================");

last = CardProduct.createNullType();

System.out.println("您当前的扑克牌:" + playerList);

System.out.println("请您出牌:(输入?提示 输入,偷看电脑的牌)");

String line = scanner.nextLine();

if (line == null || line.length() == 0) {

continue;

} else if (".".equals(line)) {

System.out.println("主动出牌,不能不出");

continue;

} else if ("?".equals(line)) {

System.out.println("提示:" + new Prompt(playerList, last).prompt);

continue;

} else if (",".equals(line)) {

if (tip.ShowsCardsInTip) {

System.out.println("上家当前扑克牌:" + leftList);

System.out.println("下家当前扑克牌:" + rightList);

}

if (tip.ShowsCardsNumInTip) {

System.out.println("上家剩余牌数:" + leftList.size());

System.out.println("下家剩余牌数:" + rightList.size());

}

if (!tip.ShowsCardsInTip || !tip.ShowsCardsNumInTip) {

System.out.println("尚未开启此功能");

}

continue;

}

List indexes = searchIndexByNum(playerList, CardUtils.CreateCards(line));

if (indexes == null) {

System.out.println("您输入的扑克牌无效请重新输入");

continue;

}

CardProducts cardProducts = CardsFactory.builder(CardUtils.getCardsByIndexes(playerList, indexes));

int index = cardProducts.isGreaterThan(last);

// if (index >= 0) {

CardProduct newCardProduct = cardProducts.list.get(index);

last = newCardProduct;

playerList.removeAll(last.list);

System.out.println("出牌成功:" + last);

if (last.type==GameConstants.TYPE_BOOM){

System.out.println("所出为炸弹翻2倍,现在分数为:"+point*2+"("+point+"*2)");

point*=2;

}

if (playerList.size() == 2) {

System.out.println("玩家就剩2牌啦!!!");

} else if (playerList.size() == 1) {

System.out.println("玩家就剩1牌啦!!!");

} else if (playerList.size() == 0) {

System.out.println("=======================================================================");

System.out.println("你赢啦!");

isMe = true;

break;

}

toMe = false;

toRight = !toRight;

break;

// } else {

// System.out.println("不符合游戏规则:" + cardProducts);

//

// continue;

// }

}

if (isMe) {

break;

}

while (toMe) {

System.out.println("=============玩家["+mePlayer.showType()+"]出牌=================");

System.out.println("上一次出牌:" + last);

System.out.println("您当前的扑克牌:" + playerList);

System.out.println("请您出牌:(输入.不出 输入?提示 输入,偷看电脑的牌)");

String line = scanner.nextLine();

if (line == null || line.length() == 0) {

continue;

} else if (".".equals(line)) {

toMe = false;

toRight = true;

break;

} else if ("?".equals(line)) {

System.out.println("提示:" + new Prompt(playerList, last).prompt);

continue;

} else if (",".equals(line)) {

if (tip.ShowsCardsInTip) {

System.out.println("上家当前扑克牌:" + leftList);

System.out.println("下家当前扑克牌:" + rightList);

}

if (tip.ShowsCardsNumInTip) {

System.out.println("上家剩余牌数:" + leftList.size());

System.out.println("下家剩余牌数:" + rightList.size());

}

if (!tip.ShowsCardsInTip || !tip.ShowsCardsNumInTip) {

System.out.println("尚未开启此功能");

}

continue;

} else {

List indexes = searchIndexByNum(playerList, CardUtils.CreateCards(line));

if (indexes == null) {

System.out.println("您输入的扑克牌无效请重新输入");

continue;

}

CardProducts cardProducts = CardsFactory.builder(CardUtils.getCardsByIndexes(playerList, indexes));

int index = cardProducts.isGreaterThan(last);

if (index >= 0) {

CardProduct newCardProduct = cardProducts.list.get(index);

last = newCardProduct;

playerList.removeAll(last.list);

System.out.println("出牌成功:" + last);

if (last.type==GameConstants.TYPE_BOOM){

System.out.println("所出为炸弹翻2倍,现在分数为:"+point*2+"("+point+"*2)");

point*=2;

}

if (playerList.size() == 2) {

System.out.println("玩家就剩2牌啦!!!");

} else if (playerList.size() == 1) {

System.out.println("玩家就剩1牌啦!!!");

} else if (playerList.size() == 0) {

System.out.println("===================================================================================");

System.out.println("你赢啦!");

isMe = true;

break;

}

l = false;

r = false;

m = true;

toMe = false;

toRight = true;

} else {

System.out.println("不符合游戏规则:" + cardProducts);

continue;

}

}

}

if (isMe) {

break;

}

if (r) {

System.out.println("=======================下家["+rightPlayer.showType()+"]主动出牌=======================");

if (!tip.NoShowsCards) {

System.out.println("下家当前扑克牌:" + rightList);

}

last = CardProduct.createNullType();

Prompt prompt = new Prompt(rightList, last);

if (prompt.prompt.size() > 0) {

CardProducts cardProducts = CardsFactory.builder(prompt.prompt.get(0));

int index = cardProducts.isGreaterThan(last);

if (index >= 0) {

last = cardProducts.list.get(index);

rightList.removeAll(last.list);

System.out.println("下家主动出牌:" + last.list);

System.out.println("下家出牌:" + last.list);

if (last.type==GameConstants.TYPE_BOOM){

System.out.println("所出为炸弹翻2倍,现在分数为:"+point*2+"("+point+"*2)");

point*=2;

}

if (!tip.NoShowsCardsNum) {

System.out.println("下家剩余牌数:" + rightList.size());

}

if (rightList.size() == 2) {

System.out.println("下家就剩2牌啦!!!");

} else if (rightList.size() == 1) {

System.out.println("上家就剩1牌啦!!!");

} else if (rightList.size() == 0) {

System.out.println("===================================================================================");

System.out.println("下家赢了!");

System.out.println("你输啦!");

break;

}

toRight = false;

toLeft = true;

}

}

}

if (toRight) {

System.out.println("=============下家["+rightPlayer.showType()+"]出牌=================");

if (!tip.NoShowsCards) {

System.out.println("下家当前扑克牌:" + rightList);

}

Prompt prompt = new Prompt(rightList, last);

if (prompt.prompt.size() > 0) {

CardProducts cardProducts = CardsFactory.builder(prompt.prompt.get(0));

int index = cardProducts.isGreaterThan(last);

if (index >= 0) {

last = cardProducts.list.get(index);

rightList.removeAll(last.list);

System.out.println("下家出牌:" + last.list);

if (last.type==GameConstants.TYPE_BOOM){

System.out.println("所出为炸弹翻2倍,现在分数为:"+point*2+"("+point+"*2)");

point*=2;

}

if (!tip.NoShowsCardsNum) {

System.out.println("下家剩余牌数:" + rightList.size());

}

if (rightList.size() == 2) {

System.out.println("上家就剩2牌啦!!!");

} else if (rightList.size() == 1) {

System.out.println("上家就剩1牌啦!!!");

} else if (rightList.size() == 0) {

System.out.println("===================================================================================");

System.out.println("下家赢了!");

System.out.println("你输啦!");

break;

}

l = false;

m = false;

r = true;

toRight = false;

toLeft = true;

}

} else {

System.out.println("下家不要");

toRight = false;

toLeft = true;

}

}

}

//每局的获胜者

Player winnerOneTime;

if (playerList.size() == 0) {

winnerOneTime = mePlayer;

} else if (leftList.size() == 0) {

winnerOneTime = leftPlayer;

} else {

winnerOneTime = rightPlayer;

}

winnerAndPoint.add(winnerOneTime);

winnerAndPoint.add(point);

System.out.println("胜利者为"+ winnerOneTime +"分数"+point);

System.out.println("=============================================================================");

return winnerAndPoint;

}

/**

* 结算

* @param count 局次

* @param winner 获胜者

* @param point 分数

* @return result 结算

*/

public static String settlePoints(int count, Player winner, int point) {

int lastLBP = leftPlayer.bonusPoint;

int lastMBP = mePlayer.bonusPoint;

int lastRBP = rightPlayer.bonusPoint;

String leftSettle = "";

String meSettle = "";

String rightSettle = "";

if (winner.type == GameConstants.TYPE_Landlord) {

if (winner.equals(leftPlayer)) {

leftPlayer.bonusPoint += point * 2;

leftSettle = "" + leftPlayer.bonusPoint + " (" + lastLBP + "+" + point*2 + ")";

mePlayer.bonusPoint -= point;

meSettle = "" + mePlayer.bonusPoint + " (" + lastMBP + "-" + point + ")";

rightPlayer.bonusPoint -= point;

rightSettle = "" + rightPlayer.bonusPoint + " (" + lastRBP + "-" + point + ")";

} else if (winner.equals(mePlayer)) {

leftPlayer.bonusPoint -= point;

leftSettle = "" + leftPlayer.bonusPoint + " (" + lastLBP + "-" + point + ")";

mePlayer.bonusPoint += point * 2;

meSettle = "" + mePlayer.bonusPoint + " (" + lastMBP + "+" + point*2 + ")";

rightPlayer.bonusPoint -= point;

rightSettle = "" + rightPlayer.bonusPoint + " (" + lastRBP + "-" + point + ")";

} else if (winner.equals(rightPlayer)) {

leftPlayer.bonusPoint -= point;

leftSettle = "" + leftPlayer.bonusPoint + " (" + lastLBP + "-" + point + ")";

mePlayer.bonusPoint -= point;

meSettle = "" + mePlayer.bonusPoint + " (" + lastMBP + "-" + point + ")";

rightPlayer.bonusPoint += point * 2;

rightSettle = "" + rightPlayer.bonusPoint + " (" + lastRBP + "+" + point*2 + ")";

}

} else if (winner.type == GameConstants.TYPE_Farmer) {

if (leftPlayer.type==GameConstants.TYPE_Landlord){

leftPlayer.bonusPoint -= point * 2;

leftSettle = "" + leftPlayer.bonusPoint + " (" + lastLBP + "-" + point*2 + ")";

mePlayer.bonusPoint += point;

meSettle = "" + mePlayer.bonusPoint + " (" + lastMBP + "+" + point + ")";

rightPlayer.bonusPoint += point;

rightSettle = "" + rightPlayer.bonusPoint + " (" + lastRBP + "+" + point + ")";

}else if (mePlayer.type==GameConstants.TYPE_Landlord) {

leftPlayer.bonusPoint += point;

leftSettle = "" + leftPlayer.bonusPoint + " (" + lastLBP + "+" + point + ")";

mePlayer.bonusPoint -= point * 2;

meSettle = "" + mePlayer.bonusPoint + " (" + lastMBP + "-" + point*2 + ")";

rightPlayer.bonusPoint += point;

rightSettle = "" + rightPlayer.bonusPoint + " (" + lastRBP + "+" + point + ")";

}else{

leftPlayer.bonusPoint += point;

leftSettle = "" + leftPlayer.bonusPoint + " (" + lastLBP + "+" + point + ")";

mePlayer.bonusPoint += point;

meSettle = "" + mePlayer.bonusPoint + " (" + lastMBP + "+" + point + ")";

rightPlayer.bonusPoint -= point * 2;

rightSettle = "" + rightPlayer.bonusPoint + " (" + lastRBP + "-" + point*2 + ")";

}

}

String result;

String bolder = "---------------------------------------------------------------------------------------------------\n";

String header = "| "+"局次\t|" + " 获胜者\t\t\t\t\t|" + " 上家积分结算\t\t|" + " 玩家积分结算\t\t|" + " 下家积分结算\t\t|"+" 分数"+" |\n";

String settle = "| "+count + " \t| " + winner + "\t\t| " + leftSettle+ "\t\t\t| " + meSettle +"\t\t\t| " + rightSettle+"\t\t\t| "+point+" |\n";

result = bolder + header+settle;

return result;

}

/**

* 添加战绩

* @param s 结算

*/

public static void addGrate(String s){

grate=grate+s;

}

//测试settlePoints和addGrate

@Test

public void testSettlePoints() {

System.out.println("=====================结算===================");

mePlayer.type=GameConstants.TYPE_Landlord;

String s = settlePoints(2, mePlayer, 1);

System.out.println(s);

addGrate(s);

System.out.println("===========================================");

System.out.println("=====================结算===================");

mePlayer.type=GameConstants.TYPE_Landlord;

String s1 = settlePoints(3, mePlayer, 1);

System.out.println(s1);

addGrate(s1);

System.out.println("===========================================");

System.out.println("================展示战绩====================");

System.out.println(grate);

System.out.println("===========================================");

}

}

版权声明

相关推荐