public class Doudizhu { public static void main(String[] args) { Scanner sc = 
new Scanner(System.in); String[] huashe1 = {"♥", "♠", "♦", "♣"}; int[] daxiao1 =
{3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; String[] pai1 = {"3", "4", "5", 
"6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"}; ArrayList<Pai> list = new 
ArrayList<>(); for (String s : huashe1) { for (int i = 0; i < daxiao1.length; i
++) { list.add(new Pai(s, pai1[i], daxiao1[i])); } } list.add(new Pai("", "大王", 
50)); list.add(new Pai("", "小王", 20)); Collections.shuffle((List<?>) list); 
ArrayList<Pai> player1 = new ArrayList<>(); ArrayList<Pai> player2 = new 
ArrayList<>(); ArrayList<Pai> player3 = new ArrayList<>(); ArrayList<Pai> under 
= new ArrayList<>(); for (int i = 0; i < list.size(); i++) { if (i >= list.size(
) - 3) { under.add(list.get(i)); } else { if (i % 3 == 0) { player1.add(list.get
(i)); } else if (i % 3 == 1) { player2.add(list.get(i)); } else { player3.add(
list.get(i)); } } } System.out.println(under); int r = new Random().nextInt(51);
if (r % 3 == 0) { player1.addAll(under); } else if (r % 3 == 1) { player2.addAll
(under); } else { player3.addAll(under); } Collections.sort(player1); 
Collections.sort(player2); Collections.sort(player3); System.out.println(player1
); System.out.println(player2); System.out.println(player3); ArrayList<Pai> 
paikuplayer1= new ArrayList<>(); ArrayList<Pai> paikuplayer2 = new ArrayList<>()
; ArrayList<Pai> paikuplayer3 = new ArrayList<>(); ArrayList<Pai> paikuunderp1 =
new ArrayList<>(); ArrayList<Pai> paikuunderp2 = new ArrayList<>(); ArrayList<
Pai> paikuunderp3 = new ArrayList<>(); ArrayList<Pai> paikuunder = new ArrayList
<>(); String p1; String p2; String p3; if (player1.size() == 20) { p1 = "地主"; p2
= "玩家一"; p3 = "玩家二"; } else if (player2.size() == 20) { p1 = "玩家二"; p2 = "地主"; 
p3= "玩家一"; } else { p1 = "玩家一"; p2 = "玩家二"; p3 = "地主"; } if (player1.size() != 
20) { } else { System.out.println("=================="); System.out.println(p1 +
"的牌为" + player1); System.out.println("请" + p1 + "出牌"); System.out.println(
"请输入想要出的牌,输入-1停止出牌"); while (true) { if (paikuunderp2.size() == 0 && 
paikuunderp3.size() == 0) { paikuunderp1.clear(); } else { paikuunderp1.clear();
 System.out.println("请选择,1.出牌 2.要不起 3.过"); if (sc.nextLine().equals("2")) { 
System.out.println("要不起"); break; }else if(sc.nextLine().equals("3")){ System.
out.println("过"); break; } } while (true) { System.out.println("请输入要出的牌"); 
String a= sc.nextLine(); if (a.equals("-1")) { break; } else { if (!isTrue(
player1, a)) { System.out.println("您没有这张牌"); } else { Pai pai = throwcard(
player1, a); paikuplayer1.add(pai); player1.remove(pai); } } } System.out.
println("出的牌为" + paikuplayer1); if (chuPai(paikuplayer1)) { System.out.println(
"可以出牌"); if (daNi(paikuplayer1, paikuunderp2) && daNi(paikuplayer1, paikuunderp3
)) { paikuunderp1.addAll(paikuplayer1); paikuunder.addAll(paikuplayer1); 
paikuplayer1.clear(); System.out.println(p1 + "出的牌为" + paikuunderp1); 
paikuunderp3.clear(); break; } } System.out.println("不符合规则,请重新出牌"); player1.
addAll(paikuplayer1); Collections.sort(player1); System.out.println("当前牌库为" + 
player1); paikuplayer1.clear(); } System.out.println("底库中牌为" + paikuunder); } if
(player2.size() != 20 && paikuunderp1.size() == 0) { } else { System.out.println
("=================="); System.out.println(p2 + "的牌为" + player2); System.out.
println("请" + p2 + "出牌"); System.out.println("请输入想要出的牌,输入-1停止出牌"); while (true) 
{ if (paikuunderp1.size() == 0 && paikuunderp3.size() == 0) { paikuunderp2.clear
(); } else { paikuunderp2.clear(); System.out.println("请出入选择,1.出牌 2.要不起 3.过"); 
if (sc.nextLine().equals("2")) { System.out.println("要不起"); break; }else if(sc.
nextLine().equals("3")){ System.out.println("过"); break; } } while (true) { 
System.out.println("请输入要出的牌"); String a = sc.nextLine(); if (a.equals("-1")) { 
break; } else { if (!isTrue(player2, a)) { System.out.println("您没有这张牌"); } else 
{ Pai pai = throwcard(player2, a); paikuplayer2.add(pai); player2.remove(pai); }
} } System.out.println("出的牌为" + paikuplayer2); if (chuPai(paikuplayer2)) { 
System.out.println("可以出牌"); if (daNi(paikuplayer2, paikuunderp1) && daNi(
paikuplayer2, paikuunderp3)) { paikuunderp2.addAll(paikuplayer2); paikuunder.
addAll(paikuplayer2); paikuplayer2.clear(); System.out.println(p2 + "出的牌为" + 
paikuunderp2); paikuunderp1.clear(); break; } } System.out.println("不符合规则,请重新出牌"
); player2.addAll(paikuplayer2); Collections.sort(player2); System.out.println(
"当前牌库为" + player2); paikuplayer2.clear(); } System.out.println("底库中牌为" + 
paikuunder); } System.out.println("=================="); System.out.println(p3 +
"的牌为" + player3); System.out.println("请" + p3 + "出牌"); System.out.println(
"请输入想要出的牌,输入-1停止出牌"); while (true) { if (paikuunderp1.size() == 0 && 
paikuunderp2.size() == 0) { paikuunderp3.clear(); } else { paikuunderp3.clear();
 System.out.println("请出入选择,1.出牌 2.要不起 3.过"); if (sc.nextLine().equals("2")) { 
System.out.println("要不起"); break; }else if(sc.nextLine().equals("3")){ System.
out.println("过"); break; } } while (true) { System.out.println("请输入要出的牌"); 
String a= sc.nextLine(); if (a.equals("-1")) { break; } else { if (!isTrue(
player3, a)) { System.out.println("您没有这张牌"); } else { Pai pai = throwcard(
player3, a); paikuplayer3.add(pai); player3.remove(pai); } } } System.out.
println("出的牌为" + paikuplayer3); if (chuPai(paikuplayer3)) { System.out.println(
"可以出牌"); if (daNi(paikuplayer3, paikuunderp2) && daNi(paikuplayer3, paikuunderp1
)) { paikuunderp3.addAll(paikuplayer3); paikuunder.addAll(paikuplayer3); 
paikuplayer3.clear(); System.out.println(p3 + "出的牌为" + paikuunderp3); 
paikuunderp2.clear(); break; } } System.out.println("不符合规则,请重新出牌"); player3.
addAll(paikuplayer3); Collections.sort(player3); System.out.println("当前牌库为" + 
player3); paikuplayer3.clear(); } while (true) { System.out.println(
"=================="); System.out.println(p1 + "的牌为" + player1); System.out.
println("请" + p1 + "出牌"); System.out.println("请输入想要出的牌,输入-1停止出牌"); while (true) 
{ if (paikuunderp2.size() == 0 && paikuunderp3.size() == 0) { paikuunderp1.clear
(); } else { paikuunderp1.clear(); System.out.println("请出入选择,1.出牌 2.要不起 3.过"); 
if (sc.nextLine().equals("2")) { System.out.println("要不起"); break; }else if(sc.
nextLine().equals("3")){ System.out.println("过"); break; } } while (true) { 
System.out.println("请输入要出的牌"); String a = sc.nextLine(); if (a.equals("-1")) { 
break; } else { if (!isTrue(player1, a)) { System.out.println("您没有这张牌"); } else 
{ Pai pai = throwcard(player1, a); paikuplayer1.add(pai); player1.remove(pai); }
} } System.out.println("出的牌为" + paikuplayer1); if (chuPai(paikuplayer1)) { 
System.out.println("可以出牌"); if (daNi(paikuplayer1, paikuunderp2) && daNi(
paikuplayer1, paikuunderp3)) { paikuunderp1.addAll(paikuplayer1); paikuunder.
addAll(paikuplayer1); paikuplayer1.clear(); System.out.println(p1 + "出的牌为" + 
paikuunderp1); paikuunderp3.clear(); break; } else { System.out.println(
"你的牌太小,管不上"); break; } } System.out.println("不符合规则,请重新出牌"); player1.addAll(
paikuplayer1); Collections.sort(player1); System.out.println("当前牌库为" + player1);
 paikuplayer1.clear(); } System.out.println("底库中牌为" + paikuunder); if (player1.
size() == 0 || player2.size() == 0 || player3.size() == 0) { System.out.println(
"游戏结束"); break; } System.out.println("=================="); System.out.println(
p2+ "的牌为" + player2); System.out.println("请" + p2 + "出牌"); System.out.println(
"请输入想要出的牌,输入-1停止输出"); while (true) { if (paikuunderp1.size() == 0 && 
paikuunderp3.size() == 0) { paikuunderp2.clear(); } else { paikuunderp2.clear();
 System.out.println("请出入选择,1.出牌 2.要不起 3.过"); if (sc.nextLine().equals("2")) { 
System.out.println("要不起"); break; }else if(sc.nextLine().equals("3")){ System.
out.println("过"); break; } } while (true) { System.out.println("请输入要出的牌"); 
String a= sc.nextLine(); if (a.equals("-1")) { break; } else { if (!isTrue(
player2, a)) { System.out.println("您没有这张牌"); } else { Pai pai = throwcard(
player2, a); paikuplayer2.add(pai); player2.remove(pai); } } } System.out.
println("出的牌为" + paikuplayer2); if (chuPai(paikuplayer2)) { System.out.println(
"可以出牌"); if (daNi(paikuplayer2, paikuunderp1) && daNi(paikuplayer2, paikuunderp3
)) { paikuunderp2.addAll(paikuplayer2); paikuunder.addAll(paikuplayer2); 
paikuplayer2.clear(); System.out.println(p2 + "出的牌为" + paikuunderp2); 
paikuunderp1.clear(); break; } } System.out.println("不符合规则,请重新出牌"); player2.
addAll(paikuplayer2); Collections.sort(player2); System.out.println("当前牌库为" + 
player2); paikuplayer2.clear(); } System.out.println("底库中牌为" + paikuunder); if (
player1.size() == 0 || player2.size() == 0 || player3.size() == 0) { System.out.
println("游戏结束"); break; } System.out.println("=================="); System.out.
println(p3 + "的牌为" + player3); System.out.println("请" + p3 + "出牌"); System.out.
println("请输入想要出的牌,输入-1停止出牌"); while (true) { if (paikuunderp1.size() == 0 && 
paikuunderp2.size() == 0) { paikuunderp3.clear(); } else { paikuunderp3.clear();
 System.out.println("请出入选择,1.出牌 2.要不起 3.过"); if (sc.nextLine().equals("2")) { 
System.out.println("要不起"); break; }else if(sc.nextLine().equals("3")){ System.
out.println("过"); break; } } while (true) { System.out.println("请输入要出的牌"); 
String a= sc.nextLine(); if (a.equals("-1")) { break; } else { if (!isTrue(
player3, a)) { System.out.println("您没有这张牌"); } else { Pai pai = throwcard(
player3, a); paikuplayer3.add(pai); player3.remove(pai); } } } System.out.
println("出的牌为" + paikuplayer3); if (chuPai(paikuplayer3)) { System.out.println(
"可以出牌"); if (daNi(paikuplayer3, paikuunderp2) && daNi(paikuplayer3, paikuunderp1
)) { paikuunderp3.addAll(paikuplayer3); paikuunder.addAll(paikuplayer3); 
paikuplayer3.clear(); System.out.println(p3 + "出的牌为" + paikuunderp3); 
paikuunderp2.clear(); break; } } System.out.println("不符合规则,请重新出牌"); player3.
addAll(paikuplayer3); Collections.sort(player3); System.out.println("当前牌库为" + 
player3); paikuplayer3.clear(); } System.out.println("当前的底牌池" + paikuunder); if 
(player1.size() == 0 || player2.size() == 0 || player3.size() == 0) { System.out
.println("游戏结束"); break; } } } public static int sameNum(ArrayList<Pai> list) { 
int max = 0; for (int i = 0; i < list.size(); i++) { int num = 0; for (int j = 0
; j < list.size(); j++) { if (list.get(i).getId() == list.get(j).getId()) { num
++; } } max = max >= num ? max : num; } return max; } public static boolean 
chuPai(ArrayList<Pai> list) { switch (list.size()) { case 1: return true; case 2
: if (list.get(0).getId() == list.get(1).getId()) { return true; } else if (list
.get(0).getId() + list.get(1).getId() == 70) { return true; } else { return 
false; } case 3: if (sameNum(list)==3) { return true; } else return false; case 
4: if (sameNum(list) == 4 || sameNum(list) == 3) { return true; } else return 
false; case 5: if (sameNum(list) == 1 && (max(list) - min(list) == list.size() -
1)) { return true; } else if (sameNum(list) == 3) { for (int i = 0; i < list.
size(); i++) { if (theSameNum(list, list.get(i).getNum()) < 2) { return false; }
} return true; } case 6: if (sameNum(list) == 1 && (max(list) - min(list) == 
list.size() - 1)) { return true; } else if (sameNum(list) == 4) { for (int i = 0
; i < list.size(); i++) { if (theSameNum(list, list.get(i).getNum()) == 2) { 
return false; } } return true; } else if (sameNum(list) == 2 && (max(list) - min
(list)) * 2 + 2 == list.size() && max(list) != 15) { return true; } else return 
false; case 8: if (sameNum(list) == 1 && (max(list) - min(list) == list.size() -
1)) { return true; } else if (sameNum(list) == 4) { for (int i = 0; i < list.
size(); i++) { if (theSameNum(list, list.get(i).getNum()) == 2) { return true; }
} return false; } else if (sameNum(list)==2 && (max(list) - min(list)) * 2 + 2 
== list.size() && max(list) != 15) { return true; } else if (sameNum(list) == 3 
&& noSameNum(list) == 4 && (whichNumSame(list, 3).get(1) - whichNumSame(list, 3)
.get(0) == 1) && max(list) != 15) { for (int i = 0; i < list.size(); i++) { if (
theSameNum(list, list.get(i).getNum()) == 2) { return false; } } return true; } 
else if (sameNum(list) == 3 && noSameNum(list) == 3 && (whichNumSame(list, 3).
get(1) - whichNumSame(list, 3).get(0) == 1) && max(list) != 15) { return true; }
else return false; default: if (sameNum(list) == 1 && (max(list) - min(list) == 
list.size() - 1) && max(list) < 15) { return true; } else if (list.size() % 2 ==
0&&sameNum(list)==2 && (max(list) - min(list)) * 2 + 2 == list.size() && max(
list) != 15) { return true; } else if (list.size() == 10 && sameNum(list) == 3 
&& noSameNum(list) == 4 && (whichNumSame(list, 3).get(1) - whichNumSame(list, 3)
.get(0) == 1) && max(list) != 15) { for (int i = 0; i < list.size(); i++) { if (
theSameNum(list, list.get(i).getNum()) == 1) { return false; } } return true; } 
else if (list.size() == 12 && sameNum(list) == 3 && noSameNum(list) == 6 && (
whichNumSame(list, 3).get(2) - whichNumSame(list, 3).get(0) == 2) && max(list) 
!= 15) { for (int i = 0; i < list.size(); i++) { if (theSameNum(list, list.get(i
).getNum()) == 2) { return false; } } return true; } else if (list.size() == 15 
&& sameNum(list) == 3 && noSameNum(list) == 6 && (whichNumSame(list, 3).get(2) -
whichNumSame(list, 3).get(0) == 2) && max(list) != 15) { for (int i = 0; i < 
list.size(); i++) { if (theSameNum(list, list.get(i).getNum()) == 1) { return 
false; } } return true; } else if (list.size() == 16 && sameNum(list) == 3 && 
noSameNum(list) == 8 && (whichNumSame(list, 3).get(2) - whichNumSame(list, 3).
get(0) == 2) && max(list) != 15) { for (int i = 0; i < list.size(); i++) { if (
theSameNum(list, list.get(i).getNum()) == 1) { return false; } } return true; } 
return false; } } public static int max(ArrayList<Pai> list) { int max = 0; for 
(int i = 0; i < list.size(); i++) { max = max >= list.get(i).getId() ? max : 
list.get(i).getId(); } return max; } public static int min(ArrayList<Pai> list) 
{ int min = list.get(0).getId(); for (int i = 0; i < list.size(); i++) { min = 
min<= list.get(i).getId() ? min : list.get(i).getId(); } return min; } public 
static int theSameNum(ArrayList<Pai> list, String a) { int num = 0; for (int i =
0; i < list.size(); i++) { if (list.get(i).getNum().equals(a)) { num++; } } 
return num; } public static Pai throwcard(ArrayList<Pai> list, String a) { for (
int i = 0; i < list.size(); i++) { if (list.get(i).getNum().equals(a)) { return 
list.get(i); } } System.out.println("您手中没有" + a ); return null; } public static 
boolean daNi(ArrayList<Pai> list, ArrayList<Pai> list1) { if ((list.size() >= 2 
&& list.get(0).getId() + list.get(1).getId() == 70) || list1.size() == 0) return
true; if (list1.size() == 2 && list1.get(0).getId() + list1.get(1).getId() == 70
) return false; if (list.size() == list1.size()) { switch (list1.size()) { case 
1: return max(list) > max(list1); case 2: return max(list) > max(list1); case 3:
return max(list) > max(list1); case 4: if (sameNum(list) == 4 && sameNum(list1) 
== 4 && max(list) > max(list1)) { return true; } else if (sameNum(list) == 4) { 
return true; } else if (sameNum(list) == 3 && sameNum(list1) == 3) { return (
list.get(0).getId() == list.get(1).getId() ? list.get(0).getId() : list.get(2).
getId()) > (list1.get(0).getId() == list1.get(1).getId() ? list1.get(0).getId() 
: list1.get(2).getId()); } return false; case 5: if (sameNum(list) == sameNum(
list1) && sameNum(list) == 1) { return max(list) > max(list1); } else { return (
theSameNum(list, idtoNum(list, max(list))) == 3 ? max(list) : min(list)) > (
theSameNum(list1, idtoNum(list1, max(list1))) == 3 ? max(list1) : min(list1)); }
case 6: if (sameNum(list) == sameNum(list1) && sameNum(list) == 1) { return max(
list) > max(list1); } else if (sameNum(list) == sameNum(list1) && sameNum(list) 
== 2) { return max(list) > max(list1); } else { return (theSameNum(list, idtoNum
(list, max(list))) == 4 ? max(list) : min(list)) > (theSameNum(list1, idtoNum(
list1, max(list1))) == 4 ? max(list1) : min(list1)); } default: if (sameNum(list
) == sameNum(list1) && sameNum(list) == 1) { return max(list) > max(list1); } 
else if (sameNum(list) == sameNum(list1) && sameNum(list) == 2) { return max(
list) > max(list1); } else if (sameNum(list) == sameNum(list1) && sameNum(list) 
== 3) { return whichNumSame(list, 3).get(0) > whichNumSame(list1, 3).get(1); } 
else if (list.size() == 10 && sameNum(list) == 3) { return whichNumSame(list, 3)
.get(0) > whichNumSame(list1, 3).get(1); } else if (list.size() == 12 && sameNum
(list) == 3) { return whichNumSame(list, 3).get(0) > whichNumSame(list1, 3).get(
2); } else if (list.size() == 15 && sameNum(list) == 3) { return whichNumSame(
list, 3).get(0) > whichNumSame(list1, 3).get(3); } else if (list.size() == 16 &&
sameNum(list) == 3) { return whichNumSame(list, 3).get(0) > whichNumSame(list1, 
3).get(3); } else return false; } } else { if (list.size() == 4 && sameNum(list)
== 4) { return true; } else if (list1.size() == 4 && sameNum(list1) == 4) { 
return false; } else return false; } } public static boolean isTrue(ArrayList<
Pai> list, String a) { for (int i = 0; i < list.size(); i++) { if (list.get(i).
getNum().equals(a)) { return true; } } return false; } public static String 
idtoNum(ArrayList<Pai> list, int id) { for (int i = 0; i < list.size(); i++) { 
if (list.get(i).getId() == id) { return list.get(i).getNum(); } } return ""; } 
public static int noSameNum(ArrayList<Pai> list) { HashSet<Integer> set = new 
HashSet<>(); for (int i = 0; i < list.size(); i++) { set.add(list.get(i).getId()
); } return set.size(); } public static ArrayList<Integer> whichNumSame(
ArrayList<Pai> list, int a) { ArrayList<Integer> li = new ArrayList<>(); for (
int i = 0; i < list.size(); i++) { if (theSameNum(list, list.get(i).getNum()) ==
 a&& !li.contains(list.get(i).getId())) { li.add(list.get(i).getId()); } } 
return li; } 
实体类
public class Pai implements Comparable<Pai>{ private String name ; private 
String num; private int id ; public Pai(String name, String num, int id) { this.
name= name; this.num = num; this.id = id; } public Pai() { } public String 
getName() { return name; } public void setName(String name) { this.name = name; 
} public String getNum() { return num; } public void setNum(String num) { this.
num= num; } public int getId() { return id; } public void setId(int id) { this.
id= id; } @Override public String toString() { return name+num; } @Override 
public int compareTo(Pai o) { return this.getId()-o.getId(); } }