天天看點

鬥地主三人版相關文章一、引入二、三人出牌邏輯三、三人出牌模拟測試代碼四、模拟測試結果五、 三人出牌模拟代碼優化(隻在代碼角度優化,算法一樣)六、實作鬥地主三人出牌七、運作結果八 日後更新九、感謝十、修複bug

鬥地主三人版

  • 相關文章
  • 一、引入
  • 二、三人出牌邏輯
  • 三、三人出牌模拟測試代碼
  • 四、模拟測試結果
    • 測試一
    • 測試二
    • 測試三
    • 測試四
  • 五、 三人出牌模拟代碼優化(隻在代碼角度優化,算法一樣)
    • 代碼優化一
    • 代碼優化二
    • 代碼優化三
  • 六、實作鬥地主三人出牌
  • 七、運作結果
  • 八 日後更新
    • 0 圖像界面,聯機玩
    • 1 單擊可設定幾人遊玩,(幾個真人幾個電腦)
      • 增加Player類(Type屬性設定人/機)
    • 2 可以加入底牌
      • 增加地主牌
      • 給Player對象增加積分屬性
      • 叫分制(1分、2分、3分)
      • 搶地主制
      • 增加底牌的倍數
    • 3開發更多模式
      • 炸彈場
      • 不洗牌模式
      • 癞子(天地)玩法
  • 九、感謝
  • 十、修複bug
    • bug1 上家出牌,我點提示,然後不出,如果下家也不出 就會導緻上家不要,該我出牌,本應該是上家拿到牌權出牌
    • 針對bug1修改代碼如下
    • bug2,對bug1的修改還存在bug當玩家和下家同時不要時,上家出牌,玩家出錯牌,會直接導緻上家獲得主動牌權
    • 修複

相關文章

鬥地主三人版

鬥地主+三人+叫地主

鬥地主+三人+叫地主+作弊(可設定)

鬥地主+三人+叫地主+作弊(可設定)+積分屬性

鬥地主+三人+叫地主+作弊(可設定)+積分屬性+記牌器(可設定)

一、引入

昨天突然想玩鬥地主,然後想去自己寫代碼實作,但是心有餘而力不足。

就去搜一搜部落格。

然後,就找到這樣一篇部落格

java鬥地主遊戲開發 算法思路講解

這是它是雙人玩的(一個人和一個電腦)

就想着把它改成三人的

二、三人出牌邏輯

  1. 出牌分為主動出牌和被動出牌;

    主動出牌:自己拿到牌權;經過一輪或幾輪,其他兩家都不要;

    輪次可以指上一次自己出牌不分主被),又一次該自己出牌(不分主被)

    也可以指上一次有人主動出牌,又一次有人主動出牌,期間出的牌進入廢牌堆。(兩人不一定是同一人)

    被動出牌:自己要壓出下的牌

  2. 首先介紹三人的出牌邏輯:
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;
                }


            }

        }
    }

}