麻將遊戲實現:
實現功能點: 實現麻將的準備牌,洗牌,發牌,看牌 (集合知識) 麻將功能需求分析 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();
}