java實戰(一)之Java模仿斗地主洗牌發牌小游戲


斗地主是全國范圍內的一種桌面游戲,盡管全國各種類型,但大同小異。本節我們先來實現一下斗地主中的簡單洗牌、發牌和看牌功能。

按照斗地主的規則,完成洗牌發牌的動作。具體規則為使用 54 張牌打亂順序,3 個玩家參與游戲,3 人交替摸牌,每人 17 張牌,后 3 張留作底牌。 

實現思路步驟如下:

  1. 准備牌:Arrylist 集合儲存,for 循環遍歷實現
  2. 洗牌:使用 Collections 的shuffle(arryBox);方法刷新集合中的順序
  3. 發牌:使用 for 循環遍歷 Arrylist 中的 51 張牌,然后用索引值對 3 取余,余數為 0,1,2 然后來隨機分配牌。
  4. 看牌:直接輸出集合


實現代碼如下:

public class Main {
public static void main(String[] args) {
// 1. 准備牌
String[] arr1 = { "黑桃", "紅桃", "方片", "梅花" };
String[] arr2 = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
List<String> arryBox = new ArrayList<>();
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr2.length; j++) {
arryBox.add(arr1[i] + arr2[j]);
}
}
arryBox.add("大王");
arryBox.add("小王");
// 3個人斗地主,分別為 zhangsan、lisi、wangwu
List<String> zhangsan = new ArrayList<>();
List<String> lisi = new ArrayList<>();
List<String> wangwu = new ArrayList<>();
// 2. 洗牌
Collections.shuffle(arryBox);
// 3. 發牌
for (int i = 0; i < arryBox.size() - 3; i++) {
if (i % 3 == 0) {
zhangsan.add(arryBox.get(i));
} else if (i % 3 == 1) {
lisi.add(arryBox.get(i));
} else if (i % 3 == 2) {
wangwu.add(arryBox.get(i));
}
}
// 4. 看牌
pushBoss();
System.out.println("張三:" + zhangsan);
System.out.println("李四:" + lisi);
System.out.println("王五:" + wangwu);
System.out.print("底牌:[");
for (int i = 1; i < 4; i++) {
System.out.print(arryBox.get(arryBox.size() - i));
if (i < 3) {
System.out.print(",");
}
}
System.out.print("]");
}
/** 隨機地主 */
public static void pushBoss() {
List<String> players = new ArrayList<String>();
players.add("張三");
players.add("李四");
players.add("王五");
Random r = new Random();
int bossIndex = r.nextInt(3);
String boss = players.get(bossIndex);
System.out.println("此局地主是:" + boss);
}
}

 

運行上面程序,輸出結果為:

此局地主是:李四
張三: [梅花10, 方片2, 方片K, 方片J, 方片5, 黑桃6, 黑桃10, 紅桃3, 梅花3, 黑桃2, 梅花8, 黑桃A, 紅桃J, 梅花9, 紅桃K, 方片9, 梅花Q]
李四: [紅桃4, 黑桃8, 方片8, 方片3, 紅桃2, 紅桃6, 紅桃5, 黑桃3, 黑桃4, 梅花7, 方片Q, 小王, 紅桃8, 黑桃K, 方片6, 梅花A, 黑桃7]
王五: [方片4, 梅花4, 方片7, 黑桃5, 黑桃9, 紅桃10, 梅花K, 方片A, 紅桃Q, 黑桃J, 梅花2, 大王, 方片10, 紅桃A, 梅花J, 梅花5, 紅桃7]
底牌:[梅花6,紅桃9,黑桃Q]

 

可通過 Map 集合將三名玩家的牌按大小排序,實現代碼如下:

public class Main2 {
public static void main(String[] args) {
// 1.准備牌
String[] arr1 = { "黑桃", "紅桃", "方片", "梅花" };
String[] arr2 = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
// 定義Map集合用來存放索引和牌
HashMap<Integer, String> pokerMap = new HashMap<>();
// 定義List集合存儲索引(索引為0-53)
List<Integer> indexList = new ArrayList<>();
// 定義索引值變量
int index = 0;
// 將撲克牌與索引建立對應關系放入Map和List集合中
for (String num : arr2) {
for (String color : arr1) {
pokerMap.put(index, color + num);
indexList.add(index);
index++;
}
}
pokerMap.put(index, "小王");
indexList.add(index++);
pokerMap.put(index, "大王");
indexList.add(index);
// 定義玩家
TreeSet<Integer> zhangsan = new TreeSet<>();
TreeSet<Integer> lisi = new TreeSet<>();
TreeSet<Integer> wangwu = new TreeSet<>();
TreeSet<Integer> buttoms = new TreeSet<>();
// 2. 洗牌
Collections.shuffle(indexList);
// 3. 發牌
for (int i = 0; i < indexList.size(); i++) {
if (i >= indexList.size() - 3) {
buttoms.add(indexList.get(i));
} else if (i % 3 == 0) {
zhangsan.add(indexList.get(i));
} else if (i % 3 == 1) {
lisi.add(indexList.get(i));
} else {
wangwu.add(indexList.get(i));
}
}
// 4. 看牌
pushBoss();
check(pokerMap, zhangsan, "張三");
check(pokerMap, lisi, "李四");
check(pokerMap, wangwu, "王五");
check(pokerMap, buttoms, "底牌");
}
/**
* 看牌
*
* @param pokerMap
* @param player 玩家撲克牌對應索引集合
* @param name 玩家昵稱
*/
public static void check(HashMap<Integer, String> pokerMap, TreeSet<Integer> player, String name) {
// 查看手中的牌
System.out.print(name + ":[");
for (Integer i : player) {
System.out.print(pokerMap.get(i) + " ");
}
System.out.println("]");
}
/** 隨機地主 */
public static void pushBoss() {
List<String> players = new ArrayList<String>();
players.add("張三");
players.add("李四");
players.add("王五");
Random r = new Random();
int bossIndex = r.nextInt(3);
String boss = players.get(bossIndex);
System.out.println("此局地主是:" + boss);
}
}

 

運行上面程序,輸出結果為:

此局地主是:張三
張三:[方片A 紅桃2 方片2 黑桃4 紅桃4 梅花4 紅桃6 方片6 梅花6 黑桃7 紅桃8 黑桃9 黑桃10 方片J 方片Q 黑桃K 紅桃K ]
李四:[梅花2 黑桃3 紅桃3 方片3 梅花3 紅桃5 方片5 紅桃7 梅花8 紅桃9 梅花9 紅桃10 梅花10 黑桃Q 梅花Q 梅花K 小王 ]
王五:[黑桃A 紅桃A 黑桃2 方片4 黑桃5 黑桃6 方片7 黑桃8 方片8 方片9 方片10 黑桃J 紅桃J 梅花J 紅桃Q 方片K 大王 ]
底牌:[梅花A 梅花5 梅花7 ]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM