簡單麻將功能實現

麻將遊戲實現:
實現功能點: 實現麻將的準備牌,洗牌,發牌,看牌 (集合知識) 麻將功能需求分析 a:具體規則:
1.組裝136張麻將,條,筒,萬加在一起的數目是108張 東,南,西,北風,紅中,發財,白板是28張,總共136張
2.將136張牌順序打亂
3.四個玩家參與遊戲,四個人交替摸牌,每次4張,先摸3次,之後莊家摸2張(2張之間索引差4),其他人再摸一張,莊家14張,其餘人13張牌,剩下的留作底牌。
4.查看四人手中的牌(按照牌的大小排序),底牌

代碼的實現:

 public class Mahjong {
    public static void main(String[] args) {
        //定義三個數組,用來組合麻將牌
        int[] num = new int[]{1,2,3,4,5,6,7,8,9};
        String[] name = new String[]{"條","筒","萬"};
        String[] tablet = new String[]{"東","南","西","北","中","白板","發財"};
        //記錄牌的編號
        int k = 0;
        //用來存放牌
        HashMap<Integer,String> hashMap = new HashMap<>();
        //用來記錄麻將存放個數,和次序
        List<Integer> number = new ArrayList<>();
        //定義四個存放玩家牌的數組
        List<Integer> player1 = new ArrayList<>();
        List<Integer> player2 = new ArrayList<>();
        List<Integer> player3 = new ArrayList<>();
        List<Integer> player4 = new ArrayList<>();
        //用來存放底牌
        List<Integer> base = new ArrayList<>();
        //準備牌,for循環添加條,筒,萬
        for(int i =0;i<num.length;i++) {
            for(int j=0;j < name.length ;j++) {
                String s = num[i] + name[j];
                for(int l=0;l<4;l++) {
                    hashMap.put(k++, s);
                    //將牌的編號加入number中
                    number.add(k);
                }
            }
        }
        //for循環添加東南西北中白板發財
        for(int i=0;i<tablet.length;i++) {
            for(int j=1;j <= 4;j++) {
                hashMap.put(k++,tablet[i]);
                number.add(k);
            }
        }
        System.out.println(hashMap.size());

        System.out.println("看牌: ");
        //用迭代器來遍歷
        Iterator<Map.Entry<Integer, String>> iterator = hashMap.entrySet().iterator();
        while(iterator.hasNext()) {
            System.out.print("(" + iterator.next() + ")" + " ");
        }
        System.out.println();
        System.out.println("將牌打亂順序: ");
        //集合提供方法,將一個整形數組打亂
        Collections.shuffle(number);
        for(int i =0;i< number.size(); i++) {
            System.out.print("(" + i + ":" + hashMap.get(number.get(i)) + ")" + " ");
        }
        System.out.println();
        //發牌
        //定義屬性n,記錄摸牌的位置
        Integer n = 0;

        //總共發三次,每一次每人摸四張牌,
        for(int i=0;i<3;i++) {
            for(int j=0;j<4;j++) {
                player1.add(number.get(n++));
                player2.add(number.get(n++));
                player3.add(number.get(n++));
                player4.add(number.get(n++));
            }
        }
        //莊家摸兩次牌,其他人摸一張(玩家1是莊家)
        player1.add(number.get(n));
        //需要跳牌(莊家第一次和第二次摸的位置索引值差4)
        n = n + 4;
        player1.add(number.get(n));
        //回到莊家第一次摸牌的位置的下一個
        n = n - 3;
        player2.add(number.get(n));
        player3.add(number.get(n));
        player4.add(number.get(n));
        //剩下的底牌
        for(int i=n;i<number.size();i++) {
            base.add(number.get(i));
        }
        System.out.println();

        //對玩家手裏的牌進行排序,集合提供排序方法
        Collections.sort(player1);
        Collections.sort(player2);
        Collections.sort(player3);
        Collections.sort(player4);

        //看牌 ,  4個for循環遍歷
        System.out.println("看牌 :");
        System.out.print("player1 : ");
        for(int i=0;i<player1.size();i++) {
            System.out.print(hashMap.get(player1.get(i)) + " ");
        }
        System.out.println();
        System.out.print("player2 : ");
        for(int i=0;i<player2.size();i++) {
            System.out.print(hashMap.get(player2.get(i)) + " ");
        }
        System.out.println();
        System.out.print("player3 : ");
        for(int i=0;i<player3.size();i++) {
            System.out.print(hashMap.get(player3.get(i)) + " ");
        }
        System.out.println();
        System.out.print("player4 : ");
        for(int i=0;i<player4.size();i++) {
            System.out.print(hashMap.get(player4.get(i)) + " ");
        }
        System.out.println();
        System.out.print("底牌 : ");
        for(int i=0;i<base.size();i++) {
            System.out.print(hashMap.get(base.get(i)) + " ");
        }
        System.out.println();
}

看牌的代碼塊可以封裝起來,會顯得簡潔明瞭;

 //封裝後的函數
        looking("1號",player1,hashMap);
        looking("2號",player2,hashMap);
        looking("3號",player3,hashMap);
        looking("4號",player4,hashMap);
        looking("底牌",base,hashMap);
    }
     /**
     * 輸入想看的玩家的名字,傳入該玩家的List數組,傳入存放麻將牌的集合
     * @param name
     * @param player
     * @param hashMap
     */
    private static void looking(String name,List<Integer> player, HashMap<Integer,String> hashMap) {
        System.out.print(name + ": ");
        for(int i=0;i<player.size();i++) {
            System.out.print(hashMap.get(player.get(i)) + " ");
        }
        System.out.println();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章