斗地主小游戏之洗牌发牌

首页 » 技术栈 » 斗地主小游戏之洗牌发牌

任务描述

编写一个斗地主洗牌发牌的程序,要求按照斗地主游戏的规则完成发牌洗牌的过程。总共有54张牌,牌面由花色和数字(包括J、Q、K、A字母)组成,花色有♠♣♥♦四种,分别代表黑桃、梅花、红桃和方块,小☻表示小王,大☻表示大王。将这54张牌打乱顺序,共有三位玩家参与游戏,每人轮流一次摸一张牌,剩余3张留为底牌。程序结束打印每人手中的纸牌和底牌。

实现思路

1)完成纸牌的组装,牌面是由花色和数字两部分组成的,可以创建两个ArrayList集合作为花色集合和数字集合,存储时需要注意,比10大的牌用J、Q、K表示,1用A来表示;

2)将花色集合和数字集合这两个集合进行循环,将花色与数字组合,形成52张牌,并赋予其编号。将组合后的牌放到一个HashMap集合中,集合的Key值是编号,value值是组装完成的纸牌。还有两个是大小王,由于组装规则不一致,需要单独使用add()方法将这两张牌放入到HashMap集合中;

3)创建一个数字集合,用这个数字集合来替代纸牌完成洗牌和发牌的操作。由于纸牌的数量是54张,所以创建的集合范围是0-53;

4)可以使用Collections类的shuffle()方法完成打乱数字集合的操作,实现洗牌的效果。由于只有3个人,所以可以使用for循环,通过将数字与3取余的方法,将代表不同纸牌的数字分配给不同的人和底牌,实现发牌效果;

5)洗牌和发票完成之后,可通过Collections类的sort()完成排序,之后通过foreach循环HashMap集合,根据数字查找对应的纸牌字符串,并存入新创建的字符串集合中,最后展示字符串集合。

 将 54 张不同花色的扑克牌打乱( );

 三个玩家参与游戏,三人交替摸牌,每人 17 张牌,最后三张留作底牌;

 查看三人各自手中的牌(按照牌的大小排序)、底牌;

 手中扑克牌从大到小的摆放顺序,如:大王、小王、2、A、K、Q、J、10、9、8、7、6、5、4、3。

实现代码

package club.miuu.pro.day16.PokerShuffleCards;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;

/*

  • 斗地主
  • */
    public class PokerShuffleCards {
    public static void main (String[] args) {
      //准备花色  花色♠♣♥♦
      ArrayList<String> color = new ArrayList<String>();
      color.add("♠");
      color.add("♣");
      color.add("♥");
      color.add("♦");
      //准备数字,用ArrayList将纸牌由小到大排序
      ArrayList<String> number = new ArrayList<String>();
      for (int i = 3; i <= 10; i++) {
          number.add(i + "");
      }
      number.add("J");
      number.add("Q");
      number.add("K");
      number.add("A");
      number.add("2");
      System.out.println(number);
      //定义一个map集合,用来将数字与每一张牌进行对应
      HashMap<Integer, String> map = new HashMap<Integer, String>();
      int index = 0;  //纸牌编号
      for (String thisNumber : number) {  //循环纸牌数字
          for (String thisColor : color) {  //循环纸牌花色
              // 将花色与数字组合,形成52张牌,并赋予其编号
              map.put(index++, thisColor + thisNumber);
          }
      }
      System.out.println(map);
      //加入大小王
      map.put(index++, "小☻");
      map.put(index++, "大☻");
      System.out.println(map);
      //创建内容为0-53的数字集合,代表54张牌
      ArrayList<Integer> cards = new ArrayList<>();
      for (int i = 0; i <= 53; i++) {
          cards.add(i); //此时的cards 顺序为0-53
      }
      System.out.println(cards);
      //洗牌,使用Collections工具类中的shuffle()方法
      Collections.shuffle(cards);
      System.out.println("===========================================");
      System.out.println(cards);
      //创建三个玩家和底牌
      ArrayList<Integer> iPlayer = new ArrayList<>();
      ArrayList<Integer> iPlayer2 = new ArrayList<>();
      ArrayList<Integer> iPlayer3 = new ArrayList();
      ArrayList<Integer> iSecretCards = new ArrayList<>();
      //遍历这副洗好的牌,遍历过程中,将牌发到3个玩家和底牌中
      for (int i = 0; i < cards.size(); i++) {
          if (i < 51) {
              if (i % 3 == 0) {
                  iPlayer.add(cards.get(i));  //与3取余为0的牌发给玩家1
              } else if (i % 3 == 1) {
                  iPlayer2.add(cards.get(i));  //与3取余为1的牌发给玩家2
              } else {
                  iPlayer3.add(cards.get(i));  //与3取余为2的牌发给玩家3
              }
          } else {
              iSecretCards.add(cards.get(i));  //留取三张底牌
          }
      }
      //对每个人手中的牌排序,使用Collections工具类中的sort()方法
      Collections.sort(iPlayer);
      Collections.sort(iPlayer2);
      Collections.sort(iPlayer3);
      //对应数字形式的每个人手中的牌,定义字符串形式的牌
      ArrayList<String> sPlay = new ArrayList<>();
      ArrayList<String> sPlay1 = new ArrayList<>();
      ArrayList<String> sPlay2 = new ArrayList<>();
      ArrayList<String> sSecretCards = new ArrayList<>();
      //循环主键,从map中获取纸牌
      for (Integer key : iPlayer) {
          sPlay.add(map.get(key));
      }
      for (Integer key : iPlayer2) {
          sPlay1.add(map.get(key));
      }
      for (Integer key : iPlayer3) {
          sPlay2.add(map.get(key));
      }
      for (Integer key : iSecretCards) {
          sSecretCards.add(map.get(key));
      }
      //看牌
      System.out.println("玩家1" + sPlay);
      System.out.println("玩家2" + sPlay1);
      System.out.println("玩家3" + sPlay2);
      System.out.println("底牌" + sSecretCards);
    
    }
    }
打赏 赞(3)
微信
支付宝
微信二维码图片

微信扫描二维码打赏

支付宝二维码图片

支付宝扫描二维码打赏

大家好!欢迎光临我的博客,在下就是闭月羞花沉鱼落雁才高八斗貌似天仙玉树凌风赛潘安一枝梨花压海棠人送外号上天下地无所不能美貌与智慧并存、古典与活泼的化身~~
觅·You小栈» 斗地主小游戏之洗牌发牌

版权声明: 本站原创文章,于2018年02月14日由觅·You发布,转载请注明出处

亭边总有花影,与我消遣一段旖旎的小时光

立即查看 联系作者
正在获取,请稍候...
00:00/00:00