鬥地主三人版
- 相關文章
- 一、引入
- 二、三人出牌邏輯
- 三、三人出牌模拟測試代碼
- 四、模拟測試結果
-
- 測試一
- 測試二
- 測試三
- 測試四
- 五、 三人出牌模拟代碼優化(隻在代碼角度優化,算法一樣)
-
- 代碼優化一
- 代碼優化二
- 代碼優化三
- 六、實作鬥地主三人出牌
- 七、運作結果
- 八 日後更新
-
- 0 圖像界面,聯機玩
- 1 單擊可設定幾人遊玩,(幾個真人幾個電腦)
-
- 增加Player類(Type屬性設定人/機)
- 2 可以加入底牌
-
- 增加地主牌
- 給Player對象增加積分屬性
- 叫分制(1分、2分、3分)
- 搶地主制
- 增加底牌的倍數
- 3開發更多模式
-
- 炸彈場
- 不洗牌模式
- 癞子(天地)玩法
- 九、感謝
- 十、修複bug
-
- bug1 上家出牌,我點提示,然後不出,如果下家也不出 就會導緻上家不要,該我出牌,本應該是上家拿到牌權出牌
- 針對bug1修改代碼如下
- bug2,對bug1的修改還存在bug當玩家和下家同時不要時,上家出牌,玩家出錯牌,會直接導緻上家獲得主動牌權
- 修複
相關文章
鬥地主三人版
鬥地主+三人+叫地主
鬥地主+三人+叫地主+作弊(可設定)
鬥地主+三人+叫地主+作弊(可設定)+積分屬性
鬥地主+三人+叫地主+作弊(可設定)+積分屬性+記牌器(可設定)
一、引入
昨天突然想玩鬥地主,然後想去自己寫代碼實作,但是心有餘而力不足。
就去搜一搜部落格。
然後,就找到這樣一篇部落格
java鬥地主遊戲開發 算法思路講解
這是它是雙人玩的(一個人和一個電腦)
就想着把它改成三人的
二、三人出牌邏輯
-
出牌分為主動出牌和被動出牌;
主動出牌:自己拿到牌權;經過一輪或幾輪,其他兩家都不要;
輪次可以指上一次自己出牌不分主被),又一次該自己出牌(不分主被)
也可以指上一次有人主動出牌,又一次有人主動出牌,期間出的牌進入廢牌堆。(兩人不一定是同一人)
被動出牌:自己要壓出下的牌
- 首先介紹三人的出牌邏輯:
t表示出牌,f表示不要;
l=上家;m=自己;r=下家;
預設出牌順序:l-->m-->r-->l-->....
lz表示l主動出牌;mz表示m主動出牌;rz表示r主動出牌
lc表示l出牌;mc表示m主動出牌;rc表示r出牌
首先除lz是t之外,mz,rz,l,mc,rz都是f;即預設lz主動出牌;
每次某人出牌,
會把自己的主動變為t,其他兩家的主動變為f;
自己變成false;自己的下家變為true;
例如:
l出牌,經過一輪,l再次拿到牌權
lz-->t;
m-->f;
r-->f;
=========
lz-->t;
...
l出牌,經過一輪,m拿到牌權
lz-->t;
m-->t;
r-->f;
l-->f;
=======
mz-->t;
...
l出牌,經過一輪,r拿到牌權
lz-->t;
m-->t;
r-->t;
l-->f;
m-->f
=======
rz-->t;
...
三、三人出牌模拟測試代碼
test
import java.util.Scanner;
public class test {
/**
* 三人出牌測試
* <p>
* 輸入t,出,f,不出
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
boolean l = false;//上家
boolean lz = true;//上家z
boolean m = false;//我
boolean mz = false;//我z
boolean r = false;//下家
boolean rz = false;//下家z
for (int i = 0; i <10; i++) {
//主要為了避免同一人同時出兩次
if (lz){
// if (l){
// l=!l;
// }
l=false;
}if (mz){
// if (m){
// m=!m;
// }
m=false;
}
if (rz){
// if (r){
// r=!r;
// }
r=false;
}
if (lz){
System.out.println("=========================");
System.out.println("上家z輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
//為了避免同一人同時出兩次
l=false;
System.out.println("上家z出牌了");
//下家出牌
m=!m;
}
}
if (l) {
System.out.println("上家輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
System.out.println("上家出牌了");
//其他兩家的主動變為f;
if(mz){
mz=!mz;
}
if (rz){
rz=!rz;
}
//自己的主動變為t
lz=true;
//自己變成false;自己的下家變為true;
l = !l;
m = !m;
} else if (s.equals("f")) {
System.out.println("上家不要");
//自己變成false;自己的下家變為true;
l = !l;
m = !m;
}
}
if (mz){
System.out.println("=========================");
System.out.println("我z輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
m=false;
System.out.println("我z出牌了");
r = !r;
}
}
if (m) {
System.out.println("我輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
System.out.println("我出牌了");
if (lz){
lz=!lz;
}
if (rz){
rz=!rz;
}
mz=true;
m = !m;
r = !r;
} else if (s.equals("f")) {
System.out.println("我不要");
m = !m;
r = !r;
}
}
if (rz){
System.out.println("=========================");
System.out.println("下家z輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
r=false;
System.out.println("下家z出牌了");
l = !l;
}
}
if (r) {
System.out.println("下家輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
System.out.println("下家出牌了");
if (lz){
lz=!lz;
}
if(mz){
mz=!mz;
}
rz=true;
r = !r;
l = !l;
} else if (s.equals("f")) {
System.out.println("下家不要了");
r = !r;
l = !l;
}
}
}
}
}
四、模拟測試結果
測試一
=========================
上家z輸入
t
上家z出牌了
我輸入
f
我不要
下家輸入
f
下家不要了
=========================
上家z輸入
測試二
=========================
上家z輸入
t
上家z出牌了
我輸入
t
我出牌了
下家輸入
f
下家不要了
上家輸入
f
上家不要
=========================
我z輸入
測試三
=========================
上家z輸入
t
上家z出牌了
我輸入
t
我出牌了
下家輸入
t
下家出牌了
上家輸入
f
上家不要
我輸入
f
我不要
=========================
下家z輸入
測試四
=========================
上家z輸入
t
上家z出牌了
我輸入
f
我不要
下家輸入
f
下家不要了
=========================
上家z輸入
t
上家z出牌了
我輸入
t
我出牌了
下家輸入
f
下家不要了
上家輸入
f
上家不要
=========================
我z輸入
t
我z出牌了
下家輸入
t
下家出牌了
上家輸入
f
上家不要
我輸入
f
我不要
=========================
下家z輸入
t
下家z出牌了
上家輸入
f
上家不要
我輸入
f
我不要
=========================
下家z輸入
t
下家z出牌了
Process finished with exit code 0
五、 三人出牌模拟代碼優化(隻在代碼角度優化,算法一樣)
代碼優化一
test1
import java.util.Scanner;
public class test1 {
/**
* 三人出牌測試
* <p>
* 輸入t,出,f,不出
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
boolean l = false;//上家
boolean lz = true;//上家z
boolean m = false;//我
boolean mz = false;//我z
boolean r = false;//下家
boolean rz = false;//下家z
for (int i = 0; i < 10; i++) {
if (lz){
l = false;
}
if (mz) {
m = false;
}
if (rz) {
r = false;
}
if (lz) {
System.out.println("=========================");
System.out.println("上家z輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
l = false;
System.out.println("上家z出牌了");
m = !m;
}
}
if (l) {
System.out.println("上家輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
System.out.println("上家出牌了");
mz = false;
rz = false;
lz = true;
} else if (s.equals("f")) {
System.out.println("上家不要");
}
l = !l;
m = !m;
}
if (mz) {
System.out.println("=========================");
System.out.println("我z輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
m = false;
System.out.println("我z出牌了");
r = !r;
}
}
if (m) {
System.out.println("我輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
System.out.println("我出牌了");
lz = false;
rz = false;
mz = true;
} else if (s.equals("f")) {
System.out.println("我不要");
}
m = !m;
r = !r;
}
if (rz) {
System.out.println("=========================");
System.out.println("下家z輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
r = false;
System.out.println("下家z出牌了");
l = !l;
}
}
if (r) {
System.out.println("下家輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
System.out.println("下家出牌了");
lz = false;
mz=false;
rz = true;
} else if (s.equals("f")) {
System.out.println("下家不要了");
}
r = !r;
l = !l;
}
}
}
}
代碼優化二
test2
import java.util.Scanner;
public class test2 {
/**
* 三人出牌測試
* <p>
* 輸入t,出,f,不出
* l=上家;m=自己;r=下家;
* 預設出牌順序:l-->m-->r-->l-->....
* lz表示l主動出牌;mz表示m主動出牌;rz表示r主動出牌,主動出牌隻能輸入t
* lc表示l出牌;mc表示m主動出牌;rc表示r出牌,可輸入t/f
*
* 首先除lz是t之外,mz,rz,l,mc,rz都是f;即預設lz主動出牌;
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
boolean l = false;//上家
boolean lz = true;//上家z
boolean m = false;//我
boolean mz = false;//我z
boolean r = false;//下家
boolean rz = false;//下家z
for (int i = 0; i < 10; i++) {
if (lz) {
l = false;
}
if (mz) {
m = false;
}
if (rz) {
r = false;
}
if (lz) {
System.out.println("=========================");
System.out.println("上家z輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
System.out.println("上家z出牌了");
l = false;
m = true;
}
}
if (l) {
System.out.println("上家輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
System.out.println("上家出牌了");
mz = false;
rz = false;
lz = true;
} else if (s.equals("f")) {
System.out.println("上家不要");
}
l = false;
m = true;
}
if (mz) {
System.out.println("=========================");
System.out.println("我z輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
System.out.println("我z出牌了");
m = false;
r = true;
}
}
if (m) {
System.out.println("我輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
System.out.println("我出牌了");
lz = false;
rz = false;
mz = true;
} else if (s.equals("f")) {
System.out.println("我不要");
}
m = false;
r = true;
}
if (rz) {
System.out.println("=========================");
System.out.println("下家z輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
System.out.println("下家z出牌了");
r = false;
l = true;
}
}
if (r) {
System.out.println("下家輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
System.out.println("下家出牌了");
lz = false;
mz = false;
rz = true;
} else if (s.equals("f")) {
System.out.println("下家不要了");
}
r = false;
l = true;
}
}
}
}
代碼優化三
import java.util.Scanner;
public class test2 {
/**
* 三人出牌測試
* <p>
* 輸入t,出,f,不出
* l=上家;m=自己;r=下家;
* 預設出牌順序:l-->m-->r-->l-->....
* lz表示l主動出牌;mz表示m主動出牌;rz表示r主動出牌,主動出牌隻能輸入t
* lc表示l出牌;mc表示m主動出牌;rc表示r出牌,可輸入t/f
*
* 首先除lz是t之外,mz,rz,l,mc,rz都是f;即預設lz主動出牌;
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
boolean l = false;//上家
boolean lz = true;//上家z
boolean m = false;//我
boolean mz = false;//我z
boolean r = false;//下家
boolean rz = false;//下家z
for (int i = 0; i < 10; i++) {
if (lz) {
System.out.println("=========================");
System.out.println("上家z輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
System.out.println("上家z出牌了");
l = false;
m = true;
}
}
if (l) {
System.out.println("上家輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
System.out.println("上家出牌了");
mz = false;
rz = false;
lz = true;
} else if (s.equals("f")) {
System.out.println("上家不要");
}
l = false;
m = true;
}
if (mz) {
System.out.println("=========================");
System.out.println("我z輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
System.out.println("我z出牌了");
m = false;
r = true;
}
}
if (m) {
System.out.println("我輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
System.out.println("我出牌了");
lz = false;
rz = false;
mz = true;
} else if (s.equals("f")) {
System.out.println("我不要");
}
m = false;
r = true;
}
if (rz) {
System.out.println("=========================");
System.out.println("下家z輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
System.out.println("下家z出牌了");
r = false;
l = true;
}
}
if (r) {
System.out.println("下家輸入");
String s = scanner.nextLine();
if (s.equals("t")) {
System.out.println("下家出牌了");
lz = false;
mz = false;
rz = true;
} else if (s.equals("f")) {
System.out.println("下家不要了");
}
r = false;
l = true;
}
}
}
}
六、實作鬥地主三人出牌
隻需把Play1.java複制在那篇部落格包下,運作Play1就可實作。
基本可以玩耍,有可能會有不知道的bug,歡迎評論留言指出
Play1
package com.ddz;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
*
* Cc代表大小王,0代表10
* 大小寫jqk都可以代表JQK
* Aa1都代表A
*
* 多少副牌sum、是否包含345contains345可以在main方法中更改
*
* 四炸<雙王炸<五炸<六炸<三王炸<七炸<八炸<四王炸
* 并且[大王, 大王]是可以打赢[大王, 小王]和[小王, 小王]的
*
*
*/
public class Play1 {
private static List<Card> player;//玩家
private static List<Card> left;//上家
private static List<Card> right;//下家
private static CardProduct last = CardProduct.createNullType();
//Cc代表大小王,0代表10
/**
* 發牌
*
* @param sum 多少副牌
* @param contains345 是否包含345
*/
public static void licensing(int sum, boolean contains345) {
player = new ArrayList<>();
left = new ArrayList<>();
right = new ArrayList<>();
ArrayList<Integer> 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);
}
}
//發牌
while (list.size() > 0) {
player.add(new Card(list.remove((int) (Math.random() * list.size()))));
left.add(new Card(list.remove((int) (Math.random() * list.size()))));
right.add(new Card(list.remove((int) (Math.random() * list.size()))));
}
player.sort((o1, o2) -> o2.id - o1.id);
left.sort((o1, o2) -> o2.id - o1.id);
right.sort((o1, o2) -> o2.id - o1.id);
}
public static List<Integer> searchIndexByNum(List<Card> list, List<Card> 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<Integer> indexes = new ArrayList<>();
for (int i = 0; i < card.size(); i++) {
if (card.get(i).num > GameConstants.NUM_2) {
final int id = card.get(i).id;
for (int j = 0; j < list.size(); j++) {
if (card.get(i).id == list.get(j).id && !indexes.contains(j)) {
indexes.add(j);
break;
}
}
} else {
for (int j = 0; j < cardNum.length; j++) {
if (card.get(i).num == cardNum[j] && !indexes.contains(j)) {
indexes.add(j);
break;
}
}
}
}
if (indexes.size() != card.size()) return null;
return indexes;
}
public static void main(String[] args) {
int sum=1;//多少副牌
boolean contains345=true;//是否包含345
licensing(sum, contains345);
System.out.println("您的撲克牌:" + player);
System.out.println("上家撲克牌:" + left);
System.out.println("下家撲克牌:" + right);
boolean playing = true;
boolean toLeft=false;//出牌
boolean toMe = false;//Math.random() < 0.5;//我出
boolean toRight=false;
boolean l=true;//主動出牌
boolean m=false;
boolean r=false;
boolean isContinue=false;
boolean isMe=false;
Scanner scanner = new Scanner(System.in);
while (playing) {
if (isMe){//輸入?(提示),或輸入(檢視),或出牌不符合規則--》還該自己出牌
isMe=false;
toLeft=false;
toMe=true;
toRight=false;
l=false;
m=false;
r=false;
}
if (l){
System.out.println("=====================================上家主動出牌==================================");
System.out.println("上家目前撲克牌:" + left);
last = CardProduct.createNullType();
Prompt prompt = new Prompt(left, 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);
left.removeAll(last.list);
System.out.println("上家主動出牌:" + last.list);
if (left.size() == 0) {
System.out.println("=======================================================================");
System.out.println("上家赢了!");
System.out.println("你輸啦!");
break;
}
toLeft=false;
toMe=true;
}
}
}
if(toLeft){
System.out.println("=============上家=================");
System.out.println("上家目前撲克牌:" + left);
Prompt prompt = new Prompt(left, 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);
left.removeAll(last.list);
System.out.println("上家出牌:" + last.list);
if (left.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;
}
}
if (m) {
System.out.println("================================玩家主動出牌======================================");
last = CardProduct.createNullType();
System.out.println("上一次出牌:" + last);
System.out.println("您目前的撲克牌:" + player);
System.out.println("請您出牌:(輸入?提示 輸入,偷看電腦的牌)");
String line = scanner.nextLine();
if (line == null || line.length() == 0) {
isMe=true;
continue;
}
else if ("?".equals(line)) {
System.out.println("提示:" + new Prompt(player, last).prompt);
isMe=true;
continue;
} else if (",".equals(line)) {
System.out.println("上家目前撲克牌:" + left);
System.out.println("下家目前撲克牌:" + right);
isMe=true;
continue;
}
List<Integer> indexes = searchIndexByNum(player, CardUtils.CreateCards(line));
if (indexes == null) {
System.out.println("您輸入的撲克牌無效請重新輸入");
isMe=true;
continue;
}
CardProducts cardProducts = CardsFactory.builder(CardUtils.getCardsByIndexes(player, indexes));
int index = cardProducts.isGreaterThan(last);
if (index >= 0) {
CardProduct newCardProduct = cardProducts.list.get(index);
last = newCardProduct;
player.removeAll(last.list);
System.out.println("出牌成功:" + last);
if (player.size() == 0) {
System.out.println("=======================================================================");
System.out.println("你赢啦!");
break;
}
toMe = false;
toRight=!toRight;
} else {
System.out.println("不符合遊戲規則:" + cardProducts);
isMe=true;
continue;
}
}
if (toMe) {
System.out.println("=============玩家=================");
System.out.println("上一次出牌:" + last);
System.out.println("您目前的撲克牌:" + player);
System.out.println("請您出牌:(輸入.不出 輸入?提示 輸入,偷看電腦的牌)");
String line = scanner.nextLine();
if (line == null || line.length() == 0) {
isMe=true;
continue;
}
else if (".".equals(line)) {
toMe=false;
toRight=true;
} else if ("?".equals(line)) {
System.out.println("提示:" + new Prompt(player, last).prompt);
isMe=true;
continue;
} else if (",".equals(line)) {
System.out.println("上家目前撲克牌:" + left);
System.out.println("下家目前撲克牌:" + right);
isMe=true;
continue;
}else {
List<Integer> indexes = searchIndexByNum(player, CardUtils.CreateCards(line));
if (indexes == null) {
System.out.println("您輸入的撲克牌無效請重新輸入");
isMe = true;
continue;
}
CardProducts cardProducts = CardsFactory.builder(CardUtils.getCardsByIndexes(player, indexes));
int index = cardProducts.isGreaterThan(last);
if (index >= 0) {
CardProduct newCardProduct = cardProducts.list.get(index);
last = newCardProduct;
player.removeAll(last.list);
System.out.println("出牌成功:" + last);
if (player.size() == 0) {
System.out.println("=======================================================================");
System.out.println("你赢啦!");
break;
}
l = false;
r = false;
m = true;
toMe = false;
toRight = true;
} else {
System.out.println("不符合遊戲規則:" + cardProducts);
isMe = true;
continue;
}
}
}
if (r) {
System.out.println("================================下家主動出牌=======================================");
System.out.println("下家目前撲克牌:" + right);
last = CardProduct.createNullType();
Prompt prompt = new Prompt(right, 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);
right.removeAll(last.list);
System.out.println("下家主動出牌:" + last.list);
if (right.size() == 0) {
System.out.println("=======================================================================");
System.out.println("下家赢了!");
System.out.println("你輸啦!");
break;
}
toRight= false;
toLeft = true;
}
}
}
if(toRight){
System.out.println("=============下家=================");
System.out.println("下家目前撲克牌:" + right);
Prompt prompt = new Prompt(right, 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);
right.removeAll(last.list);
System.out.println("下家出牌:" + last.list);
if (right.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;
}
}
}
}
}
七、運作結果
玩了幾盤,終于赢了。
您的撲克牌:[大王, 2, K, K, J, J, 9, 9, 9, 8, 8, 7, 7, 6, 6, 4, 4, 4]
上家撲克牌:[2, A, A, A, K, K, Q, Q, J, J, 10, 10, 10, 7, 5, 5, 4, 3]
下家撲克牌:[小王, 2, 2, A, Q, Q, 10, 9, 8, 8, 7, 6, 6, 5, 5, 3, 3, 3]
=====================================上家主動出牌==================================
上家目前撲克牌:[2, A, A, A, K, K, Q, Q, J, J, 10, 10, 10, 7, 5, 5, 4, 3]
上家主動出牌:[A, A, K, K, Q, Q, J, J, 10, 10]
=============玩家=================
上一次出牌:CardProduct{list=[A, A, K, K, Q, Q, J, J, 10, 10], type=連對, maxCard=A, len=10, group=[(num=11, sum=2), (num=10, sum=2), (num=9, sum=2), (num=8, sum=2), (num=7, sum=2)]}
您目前的撲克牌:[大王, 2, K, K, J, J, 9, 9, 9, 8, 8, 7, 7, 6, 6, 4, 4, 4]
請您出牌:(輸入.不出 輸入?提示 輸入,偷看電腦的牌)
.
=============下家=================
下家目前撲克牌:[小王, 2, 2, A, Q, Q, 10, 9, 8, 8, 7, 6, 6, 5, 5, 3, 3, 3]
下家不要
=====================================上家主動出牌==================================
上家目前撲克牌:[2, A, 10, 7, 5, 5, 4, 3]
上家主動出牌:[3]
=============玩家=================
上一次出牌:CardProduct{list=[3], type=單牌, maxCard=3, len=1, group=[(num=0, sum=1)]}
您目前的撲克牌:[大王, 2, K, K, J, J, 9, 9, 9, 8, 8, 7, 7, 6, 6, 4, 4, 4]
請您出牌:(輸入.不出 輸入?提示 輸入,偷看電腦的牌)
2
出牌成功:CardProduct{list=[2], type=單牌, maxCard=2, len=1, group=[(num=12, sum=1)]}
=============下家=================
下家目前撲克牌:[小王, 2, 2, A, Q, Q, 10, 9, 8, 8, 7, 6, 6, 5, 5, 3, 3, 3]
下家出牌:[小王]
=============上家=================
上家目前撲克牌:[2, A, 10, 7, 5, 5, 4]
上家不要
=============玩家=================
上一次出牌:CardProduct{list=[], type=無, maxCard=null, len=0, group=null}
您目前的撲克牌:[大王, K, K, J, J, 9, 9, 9, 8, 8, 7, 7, 6, 6, 4, 4, 4]
請您出牌:(輸入.不出 輸入?提示 輸入,偷看電腦的牌)
C
出牌成功:CardProduct{list=[大王], type=單牌, maxCard=大王, len=1, group=[(num=13, sum=1)]}
=============下家=================
下家目前撲克牌:[2, 2, A, Q, Q, 10, 9, 8, 8, 7, 6, 6, 5, 5, 3, 3, 3]
下家不要
=============上家=================
上家目前撲克牌:[2, A, 10, 7, 5, 5, 4]
上家不要
================================玩家主動出牌======================================
上一次出牌:CardProduct{list=[], type=無, maxCard=null, len=0, group=null}
您目前的撲克牌:[K, K, J, J, 9, 9, 9, 8, 8, 7, 7, 6, 6, 4, 4, 4]
請您出牌:(輸入?提示 輸入,偷看電腦的牌)
667788
出牌成功:CardProduct{list=[8, 8, 7, 7, 6, 6], type=連對, maxCard=8, len=6, group=[(num=5, sum=2), (num=4, sum=2), (num=3, sum=2)]}
=============下家=================
下家目前撲克牌:[2, 2, A, Q, Q, 10, 9, 8, 8, 7, 6, 6, 5, 5, 3, 3, 3]
下家不要
=============上家=================
上家目前撲克牌:[2, A, 10, 7, 5, 5, 4]
上家不要
================================玩家主動出牌======================================
上一次出牌:CardProduct{list=[], type=無, maxCard=null, len=0, group=null}
您目前的撲克牌:[K, K, J, J, 9, 9, 9, 4, 4, 4]
請您出牌:(輸入?提示 輸入,偷看電腦的牌)
444jj
出牌成功:CardProduct{list=[4, 4, 4, J, J], type=三帶一對, maxCard=4, len=5, group=[(num=1, sum=3), (num=8, sum=2)]}
=============下家=================
下家目前撲克牌:[2, 2, A, Q, Q, 10, 9, 8, 8, 7, 6, 6, 5, 5, 3, 3, 3]
下家不要
=============上家=================
上家目前撲克牌:[2, A, 10, 7, 5, 5, 4]
上家不要
================================玩家主動出牌======================================
上一次出牌:CardProduct{list=[], type=無, maxCard=null, len=0, group=null}
您目前的撲克牌:[K, K, 9, 9, 9]
請您出牌:(輸入?提示 輸入,偷看電腦的牌)
999kk
出牌成功:CardProduct{list=[9, 9, 9, K, K], type=三帶一對, maxCard=9, len=5, group=[(num=6, sum=3), (num=10, sum=2)]}
=======================================================================
你赢啦!
Process finished with exit code 0
八 日後更新
0 圖像界面,聯機玩
1 單擊可設定幾人遊玩,(幾個真人幾個電腦)
增加Player類(Type屬性設定人/機)
2 可以加入底牌
增加地主牌
開始随機選取一張牌,作為地主牌,哪個玩家有這個牌,就開始叫地主
給Player對象增加積分屬性
叫分制(1分、2分、3分)
搶地主制
增加底牌的倍數
3開發更多模式
炸彈場
不洗牌模式
癞子(天地)玩法
九、感謝
感謝這位部落客的部落格【狗頭】
java鬥地主遊戲開發 算法思路講解
十、修複bug
bug1 上家出牌,我點提示,然後不出,如果下家也不出 就會導緻上家不要,該我出牌,本應該是上家拿到牌權出牌
此bug是continue語句所導緻
if (isMe){//輸入?(提示),或輸入(檢視),或出牌不符合規則--》還該自己出牌
isMe=false;
toLeft=false;
toMe=true;
toRight=false;
l=false;
m=false;
r=false;
ifMe=true;
}
使得進入if(isMe)語句,導緻l=false,使得上家l喪失了牌權。
加上下面的判斷使得上家l重新獲得了牌權
//ifMe表示是否進入if(isMe)
//MeGuo表示玩家是否不要
//RGuo表示下家是否不要
if (ifMe&&MeGuo&&RGuo){
l=true;
}
同理,還有相似情況
當下家得到牌權,上家不要,我點提示,然後不要時,會導緻下家出牌,本應該是主動出牌。
加上下面的判斷使得下家重新獲得了牌權
//Luo表示上家是否不要
if (ifMe&&MeGuo&&LGuo){
r=true;
}
針對bug1修改代碼如下
package com.ddz;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
*
* Cc代表大小王,0代表10
* 大小寫jqk都可以代表JQK
* Aa1都代表A
*
* 多少副牌sum、是否包含345contains345可以在main方法中更改
*
* 四炸<雙王炸<五炸<六炸<三王炸<七炸<八炸<四王炸
* 并且[大王, 大王]是可以打赢[大王, 小王]和[小王, 小王]的
*
*
*/
public class Play1 {
private static List<Card> player;//玩家
private static List<Card> left;//上家
private static List<Card> right;//下家
private static CardProduct last = CardProduct.createNullType();
//Cc代表大小王,0代表10
/**
* 發牌
*
* @param sum 多少副牌
* @param contains345 是否包含345
*/
public static void licensing(int sum, boolean contains345) {
player = new ArrayList<>();
left = new ArrayList<>();
right = new ArrayList<>();
ArrayList<Integer> 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);
}
}
//發牌
while (list.size() > 0) {
player.add(new Card(list.remove((int) (Math.random() * list.size()))));
left.add(new Card(list.remove((int) (Math.random() * list.size()))));
right.add(new Card(list.remove((int) (Math.random() * list.size()))));
}
player.sort((o1, o2) -> o2.id - o1.id);
left.sort((o1, o2) -> o2.id - o1.id);
right.sort((o1, o2) -> o2.id - o1.id);
}
public static List<Integer> searchIndexByNum(List<Card> list, List<Card> 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<Integer> indexes = new ArrayList<>();
for (int i = 0; i < card.size(); i++) {
if (card.get(i).num > GameConstants.NUM_2) {
final int id = card.get(i).id;
for (int j = 0; j < list.size(); j++) {
if (card.get(i).id == list.get(j).id && !indexes.contains(j)) {
indexes.add(j);
break;
}
}
} else {
for (int j = 0; j < cardNum.length; j++) {
if (card.get(i).num == cardNum[j] && !indexes.contains(j)) {
indexes.add(j);
break;
}
}
}
}
if (indexes.size() != card.size()) return null;
return indexes;
}
public static void main(String[] args) {
int sum=1;//多少副牌
boolean contains345=true;//是否包含345
licensing(sum, contains345);
System.out.println("您的撲克牌:" + player);
System.out.println("上家撲克牌:" + left);
System.out.println("下家撲克牌:" + right);
boolean playing = true;
boolean toLeft=false;//出牌
boolean toMe = false;//Math.random() < 0.5;//我出
boolean toRight=false;
boolean l=true;//主動出牌
boolean m=false;
boolean r=false;
boolean isMe=false;
boolean ifMe=false;
boolean LGuo=false;
boolean MeGuo=false;
boolean RGuo=false;
Scanner scanner = new Scanner(System.in);
while (playing) {
if (isMe){//輸入?(提示),或輸入(檢視),或出牌不符合規則--》還該自己出牌
isMe=false;
toLeft=false;
toMe=true;
toRight=false;
l=false;
m=false;
r=false;
ifMe=true;
}
if (ifMe&&MeGuo&&RGuo){
l=true;
}
if (ifMe&&MeGuo&&LGuo){
r=true;
}
if (l){
System.out.println("=====================================上家主動出牌==================================");
System.out.println("上家目前撲克牌:" + left);
last = CardProduct.createNullType();
Prompt prompt = new Prompt(left, 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);
left.removeAll(last.list);
System.out.println("上家主動出牌:" + last.list);
if (left.size() == 0) {
System.out.println("=======================================================================");
System.out.println("上家赢了!");
System.out.println("你輸啦!");
break;
}
toLeft=false;
toMe=true;
LGuo=false;
}
}
}
if(toLeft){
System.out.println("=============上家=================");
System.out.println("上家目前撲克牌:" + left);
Prompt prompt = new Prompt(left, 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);
left.removeAll(last.list);
System.out.println("上家出牌:" + last.list);
if (left.size() == 0) {
System.out.println("=======================================================================");
System.out.println("上家赢了!");
System.out.println("你輸啦!");
break;
}
m=false;
r=false;
l=true;
toLeft=false;
toMe = true;
RGuo=false;
}
} else {
System.out.println("上家不要");
toLeft=false;
toMe = true;
LGuo=true;
}
}
if (m) {
System.out.println("================================玩家主動出牌======================================");
last = CardProduct.createNullType();
System.out.println("上一次出牌:" + last);
System.out.println("您目前的撲克牌:" + player);
System.out.println("請您出牌:(輸入?提示 輸入,偷看電腦的牌)");
String line = scanner.nextLine();
if (line == null || line.length() == 0) {
isMe=true;
continue;
}
else if ("?".equals(line)) {
System.out.println("提示:" + new Prompt(player, last).prompt);
isMe=true;
continue;
} else if (",".equals(line)) {
System.out.println("上家目前撲克牌:" + left);
System.out.println("下家目前撲克牌:" + right);
isMe=true;
continue;
}
List<Integer> indexes = searchIndexByNum(player, CardUtils.CreateCards(line));
if (indexes == null) {
System.out.println("您輸入的撲克牌無效請重新輸入");
isMe=true;
continue;
}
CardProducts cardProducts = CardsFactory.builder(CardUtils.getCardsByIndexes(player, indexes));
int index = cardProducts.isGreaterThan(last);
if (index >= 0) {
CardProduct newCardProduct = cardProducts.list.get(index);
last = newCardProduct;
player.removeAll(last.list);
System.out.println("出牌成功:" + last);
if (player.size() == 0) {
System.out.println("=======================================================================");
System.out.println("你赢啦!");
break;
}
toMe = false;
toRight=!toRight;
MeGuo=false;//
} else {
System.out.println("不符合遊戲規則:" + cardProducts);
isMe=true;
continue;
}
}
if (toMe) {
System.out.println("=============玩家=================");
System.out.println("上一次出牌:" + last);
System.out.println("您目前的撲克牌:" + player);
System.out.println("請您出牌:(輸入.不出 輸入?提示 輸入,偷看電腦的牌)");
String line = scanner.nextLine();
if (line == null || line.length() == 0) {
isMe=true;
continue;
}
else if (".".equals(line)) {
toMe=false;
toRight=true;
MeGuo=true;
} else if ("?".equals(line)) {
System.out.println("提示:" + new Prompt(player, last).prompt);
isMe=true;
continue;
} else if (",".equals(line)) {
System.out.println("上家目前撲克牌:" + left);
System.out.println("下家目前撲克牌:" + right);
isMe=true;
continue;
}else {
List<Integer> indexes = searchIndexByNum(player, CardUtils.CreateCards(line));
if (indexes == null) {
System.out.println("您輸入的撲克牌無效請重新輸入");
isMe = true;
continue;
}
CardProducts cardProducts = CardsFactory.builder(CardUtils.getCardsByIndexes(player, indexes));
int index = cardProducts.isGreaterThan(last);
if (index >= 0) {
CardProduct newCardProduct = cardProducts.list.get(index);
last = newCardProduct;
player.removeAll(last.list);
System.out.println("出牌成功:" + last);
if (player.size() == 0) {
System.out.println("=======================================================================");
System.out.println("你赢啦!");
break;
}
l = false;
r = false;
m = true;
toMe = false;
toRight = true;
MeGuo=false;//
} else {
System.out.println("不符合遊戲規則:" + cardProducts);
isMe = true;
continue;
}
}
}
if (r) {
System.out.println("================================下家主動出牌=======================================");
System.out.println("下家目前撲克牌:" + right);
last = CardProduct.createNullType();
Prompt prompt = new Prompt(right, 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);
right.removeAll(last.list);
System.out.println("下家主動出牌:" + last.list);
if (right.size() == 0) {
System.out.println("=======================================================================");
System.out.println("下家赢了!");
System.out.println("你輸啦!");
break;
}
toRight= false;
toLeft = true;
RGuo=false;
}
}
}
if(toRight){
System.out.println("=============下家=================");
System.out.println("下家目前撲克牌:" + right);
Prompt prompt = new Prompt(right, 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);
right.removeAll(last.list);
System.out.println("下家出牌:" + last.list);
if (right.size() == 0) {
System.out.println("=======================================================================");
System.out.println("下家赢了!");
System.out.println("你輸啦!");
break;
}
l = false;
m = false;
r = true;
toRight=false;
toLeft = true;
RGuo=false;
}
} else {
System.out.println("下家不要");
RGuo=true;//
toRight=false;
toLeft = true;
}
}
}
}
}
bug2,對bug1的修改還存在bug當玩家和下家同時不要時,上家出牌,玩家出錯牌,會直接導緻上家獲得主動牌權
bug情況如下:
您的撲克牌:[大王, 2, A, K, K, Q, Q, Q, J, J, 10, 10, 10, 9, 9, 7, 4, 3]
上家撲克牌:[2, K, Q, J, 9, 8, 8, 8, 7, 6, 6, 6, 5, 5, 5, 4, 3, 3]
下家撲克牌:[小王, 2, 2, A, A, A, K, J, 10, 9, 8, 7, 7, 6, 5, 4, 4, 3]
=====================================上家主動出牌==================================
上家目前撲克牌:[2, K, Q, J, 9, 8, 8, 8, 7, 6, 6, 6, 5, 5, 5, 4, 3, 3]
上家主動出牌:[6, 6, 6, 5, 5, 5, 8, 8, 3, 3]
=============玩家=================
上一次出牌:CardProduct{list=[6, 6, 6, 5, 5, 5, 8, 8, 3, 3], type=飛機帶對子, maxCard=6, len=10, group=[(num=3, sum=3), (num=2, sum=3), (num=5, sum=2), (num=0, sum=2)]}
您目前的撲克牌:[大王, 2, A, K, K, Q, Q, Q, J, J, 10, 10, 10, 9, 9, 7, 4, 3]
請您出牌:(輸入.不出 輸入?提示 輸入,偷看電腦的牌)
.
=============下家=================
下家目前撲克牌:[小王, 2, 2, A, A, A, K, J, 10, 9, 8, 7, 7, 6, 5, 4, 4, 3]
下家不要
=====================================上家主動出牌==================================
上家目前撲克牌:[2, K, Q, J, 9, 8, 7, 4]
上家主動出牌:[4]
=============玩家=================
上一次出牌:CardProduct{list=[4], type=單牌, maxCard=4, len=1, group=[(num=1, sum=1)]}
您目前的撲克牌:[大王, 2, A, K, K, Q, Q, Q, J, J, 10, 10, 10, 9, 9, 7, 4, 3]
請您出牌:(輸入.不出 輸入?提示 輸入,偷看電腦的牌)
3
不符合遊戲規則:1 [CardProduct{list=[3], type=單牌, maxCard=3, len=1, group=[(num=0, sum=1)]}]
=====================================上家主動出牌==================================
上家目前撲克牌:[2, K, Q, J, 9, 8, 7]
上家主動出牌:[7]
=============玩家=================
上一次出牌:CardProduct{list=[7], type=單牌, maxCard=7, len=1, group=[(num=4, sum=1)]}
您目前的撲克牌:[大王, 2, A, K, K, Q, Q, Q, J, J, 10, 10, 10, 9, 9, 7, 4, 3]
請您出牌:(輸入.不出 輸入?提示 輸入,偷看電腦的牌)
修複
直接去掉continue對外層循環的影響,讓其内層循環下起作用,并且有break來跳出内層循環,當玩家赢了之後,加入isMe來輔助結束遊戲,不會是下家結束後仍然可以出牌
并且去除了while(m)中的語句“判斷是否出牌成功”
(即打不打得出過的牌,(但因玩家主動出牌,出過的牌指派null,是以判斷無用)
Play2
package com.ddz;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* Cc代表大小王,0代表10
* 大小寫jqk都可以代表JQK
* Aa1都代表A
* <p>
* 多少副牌sum、是否包含345contains345可以在main方法中更改
* <p>
* 四炸<雙王炸<五炸<六炸<三王炸<七炸<八炸<四王炸
* 并且[大王, 大王]是可以打赢[大王, 小王]和[小王, 小王]的
*/
public class Play2 {
private static List<Card> player;//玩家
private static List<Card> left;//上家
private static List<Card> right;//下家
private static CardProduct last = CardProduct.createNullType();
//Cc代表大小王,0代表10
/**
* 發牌
*
* @param sum 多少副牌
* @param contains345 是否包含345
*/
public static void licensing(int sum, boolean contains345) {
player = new ArrayList<>();
left = new ArrayList<>();
right = new ArrayList<>();
ArrayList<Integer> 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);
}
}
//發牌
while (list.size() > 0) {
player.add(new Card(list.remove((int) (Math.random() * list.size()))));
left.add(new Card(list.remove((int) (Math.random() * list.size()))));
right.add(new Card(list.remove((int) (Math.random() * list.size()))));
}
player.sort((o1, o2) -> o2.id - o1.id);
left.sort((o1, o2) -> o2.id - o1.id);
right.sort((o1, o2) -> o2.id - o1.id);
}
public static List<Integer> searchIndexByNum(List<Card> list, List<Card> 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<Integer> indexes = new ArrayList<>();
for (int i = 0; i < card.size(); i++) {
if (card.get(i).num > GameConstants.NUM_2) {
final int id = card.get(i).id;
for (int j = 0; j < list.size(); j++) {
if (card.get(i).id == list.get(j).id && !indexes.contains(j)) {
indexes.add(j);
break;
}
}
} else {
for (int j = 0; j < cardNum.length; j++) {
if (card.get(i).num == cardNum[j] && !indexes.contains(j)) {
indexes.add(j);
break;
}
}
}
}
if (indexes.size() != card.size()) return null;
return indexes;
}
public static void main(String[] args) {
int sum = 1;//多少副牌
boolean contains345 = true;//是否包含345
licensing(sum, contains345);
System.out.println("您的撲克牌:" + player);
System.out.println("上家撲克牌:" + left);
System.out.println("下家撲克牌:" + right);
boolean playing = true;
boolean toLeft = false;//出牌
boolean toMe = false;//Math.random() < 0.5;//我出
boolean toRight = false;
boolean l = true;//主動出牌
boolean m = false;
boolean r = false;
boolean isMe = false;//me獲勝
Scanner scanner = new Scanner(System.in);
while (playing) {
if (l) {
System.out.println("=====================================上家主動出牌==================================");
System.out.println("上家目前撲克牌:" + left);
last = CardProduct.createNullType();
Prompt prompt = new Prompt(left, 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);
left.removeAll(last.list);
System.out.println("上家主動出牌:" + last.list);
if (left.size() == 0) {
System.out.println("=======================================================================");
System.out.println("上家赢了!");
System.out.println("你輸啦!");
break;
}
toLeft = false;
toMe = true;
}
}
}
if (toLeft) {
System.out.println("=============上家=================");
System.out.println("上家目前撲克牌:" + left);
Prompt prompt = new Prompt(left, 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);
left.removeAll(last.list);
System.out.println("上家出牌:" + last.list);
if (left.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("================================玩家主動出牌======================================");
last = CardProduct.createNullType();
System.out.println("上一次出牌:" + last);
System.out.println("您目前的撲克牌:" + player);
System.out.println("請您出牌:(輸入?提示 輸入,偷看電腦的牌)");
String line = scanner.nextLine();
if (line == null || line.length() == 0) {
continue;
} else if ("?".equals(line)) {
System.out.println("提示:" + new Prompt(player, last).prompt);
continue;
} else if (",".equals(line)) {
System.out.println("上家目前撲克牌:" + left);
System.out.println("下家目前撲克牌:" + right);
continue;
}
List<Integer> indexes = searchIndexByNum(player, CardUtils.CreateCards(line));
if (indexes == null) {
System.out.println("您輸入的撲克牌無效請重新輸入");
continue;
}
CardProducts cardProducts = CardsFactory.builder(CardUtils.getCardsByIndexes(player, indexes));
int index = cardProducts.isGreaterThan(last);
// if (index >= 0) {
CardProduct newCardProduct = cardProducts.list.get(index);
last = newCardProduct;
player.removeAll(last.list);
System.out.println("出牌成功:" + last);
if (player.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("=============玩家=================");
System.out.println("上一次出牌:" + last);
System.out.println("您目前的撲克牌:" + player);
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(player, last).prompt);
continue;
} else if (",".equals(line)) {
System.out.println("上家目前撲克牌:" + left);
System.out.println("下家目前撲克牌:" + right);
continue;
} else {
List<Integer> indexes = searchIndexByNum(player, CardUtils.CreateCards(line));
if (indexes == null) {
System.out.println("您輸入的撲克牌無效請重新輸入");
continue;
}
CardProducts cardProducts = CardsFactory.builder(CardUtils.getCardsByIndexes(player, indexes));
int index = cardProducts.isGreaterThan(last);
if (index >= 0) {
CardProduct newCardProduct = cardProducts.list.get(index);
last = newCardProduct;
player.removeAll(last.list);
System.out.println("出牌成功:" + last);
if (player.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("================================下家主動出牌=======================================");
System.out.println("下家目前撲克牌:" + right);
last = CardProduct.createNullType();
Prompt prompt = new Prompt(right, 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);
right.removeAll(last.list);
System.out.println("下家主動出牌:" + last.list);
if (right.size() == 0) {
System.out.println("=======================================================================");
System.out.println("下家赢了!");
System.out.println("你輸啦!");
break;
}
toRight = false;
toLeft = true;
}
}
}
if (toRight) {
System.out.println("=============下家=================");
System.out.println("下家目前撲克牌:" + right);
Prompt prompt = new Prompt(right, 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);
right.removeAll(last.list);
System.out.println("下家出牌:" + last.list);
if (right.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;
}
}
}
}
}