java之斗地主部分功能的实现

今天我们要实现斗地主中发牌和洗牌这两个功能,该如何去实现呢?

1.创建牌类:52张牌每一张牌包含两个属性:牌的大小和牌的花色。

故我们优先创建一个牌的类(Card):包含大小和花色。

java 复制代码
public class Card {   //单张牌的大小及类型
    //牌的花色,数量及返回值
   private String suit; //花色
    private int rank; //大小

    public Card(String suit, int rank){   //牌的构造方法
       this.suit = suit;
       this.rank = rank;
    }
    @Override
    public String toString(){ //返回这张牌的属性
        return "{" + suit+rank+ "}";
    }
}

2.牌类创建好之后,我们就可以再创建一个CardDemo类来着重实现它的功能。

2.1:扑克牌的创建:

实现功能之前我们要有一个容纳52张牌的数组(列表 ),其中这52张卡牌有四种花色,并且有1~13的大小(暂定),我们就要创建一个字符数组来存储其花色类型,再创建一个可以存储Card类型的泛型列表cardList来存放52张扑克牌,之后,通过两个for循环,一个通过花色(suit),一个通过牌的大小(rank),将每次循环的成员属性(suit、rank)放到新创建的卡牌类card中,最后通过add方法将这个新牌添加到cardList列表中,具体代码如下:

java 复制代码
 public List<Card> buyCard(){    
        List<Card> cardList = new ArrayList<>();  //创建牌的列表
        //大小为i的牌的四张j类型的花色
        for (int i = 1; i <=13 ; i++) {
            for(int j =0;j<4;j++)
            {
                int rank = i; //第i张牌
                String suit = suits[j] ; // j类型的花色
                Card card = new Card(suit,rank); //获取新的牌
                cardList.add(card);//将这个牌添加到列表中
            }
        }
     return cardList;
    }

2.2 洗牌功能的实现:

如何进行随机洗牌呢?

想到随机二字,你是否联想到了Random函数?我们不妨用下面的思路来解决这个问题:

从最后一张牌(索引为51)开始,for循环,通过random函数随机获取前i-1(i是最后一张牌的索引)张牌的索引,通过索引与最后张牌进行交换。这样一套循环下来可以实现随机洗牌的功能。

具体代码如下:

java 复制代码
    //洗牌功能的实现:
    public void shuffle(List<Card> cardList){
        Random random = new Random();
        for (int i = cardList.size()-1; i >0 ; i--) {
            //将第i位置的元素与索引为0~i-1的元素进行交换位置
            int index = random.nextInt(i); //随机获取索引为0~i-1的位置
            swap(cardList,i,index); //将位置index的元素和i像交换
        }
    }

那么这里问题又来了,如何实现交换两个牌的方法swap呢?通过ArrayList中的get、set方法获取、设置元素,通过类似于创建第三变量的方式将两个元素实现交换,不同的是作为媒介的第三方元素类型必须是Card。

java 复制代码
 private void swap(List<Card> cardList,int i,int j)
    {
        Card tmp = cardList.get(i); //将i位置的元素赋值给tmp
        cardList.set(i,cardList.get(j)); //将j位置的元素赋值到i位置
        cardList.set(j,tmp);  //tmp与j位置的元素互换
    }

2.3:发牌功能的实现:

假设一共有三个人 假设每个人分到的手牌为5张,则先分别创建3个泛型为Card的列表用来存储这三个人分到的手牌,之后再创建一个二维列表hand来存储三个人的手牌,便于管理和访问不同玩家或不同伦次的手牌。

发牌过程中,两个for循环一次给每个人发牌,发牌时需要注意,第一张牌被人抽走之后,第二张牌便排在了第一位,这里我们每次发牌前移除第一个元素,并将这个移除元素分给对应 的人。

java 复制代码
public List<List<Card>> play(List<Card> cardList) {
        List<Card> hand0 = new ArrayList<>();
        List<Card> hand1 = new ArrayList<>();
        List<Card> hand2 = new ArrayList<>();
        List<List<Card>> hand = new ArrayList<>();
         hand.add(hand0);
         hand.add(hand1);
         hand.add(hand2);

         for(int i=0;i<5;i++) //5张牌
         {
             for (int j = 0; j < 3; j++) { //3个人
                  Card card = cardList.remove(0); //移除第一张牌,并将这张移除的牌赋给card,同时下一次card的第二个元素变为第一个
                  //把对应的牌放到对应的人手中
                 hand.get(j).add(card);
             }
         }
         return hand;
     }

}

3.在main方法里进行测试:

java 复制代码
public class Test {
    public static void main(String[] args) {
        CardDemo cardDemo = new CardDemo();
        //1.创建52张牌
        List<Card> cardList = cardDemo.buyCard();
        System.out.println(cardList);
          //2.洗牌:
        cardDemo.shuffle(cardList);
        System.out.println(cardList);
        //3每个人拿五张牌
        List<List<Card>> ret = cardDemo.play(cardList);
        for (int i = 0; i < ret.size(); i++) {
            System.out.println("第"+(i+1)+"个人的牌:"+ret.get(i));
        }
        System.out.println("剩下的人的牌");
        System.out.println(cardList);

    }
}

实现后:

相关推荐
鱼跃鹰飞1 小时前
设计模式系列:工厂模式
java·设计模式·系统架构
a努力。1 小时前
国家电网Java面试被问:混沌工程在分布式系统中的应用
java·开发语言·数据库·git·mysql·面试·职场和发展
Yvonne爱编码1 小时前
Java 四大内部类全解析:从设计本质到实战应用
java·开发语言·python
tobias.b1 小时前
408真题解析-2010-6-数据结构-哈夫曼树
数据结构·计算机考研·408真题解析
J2虾虾1 小时前
SpringBoot和mybatis Plus不兼容报错的问题
java·spring boot·mybatis
毕设源码-郭学长2 小时前
【开题答辩全过程】以 基于springboot 的豪华婚车租赁系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
tobias.b2 小时前
408真题解析-2010-7-数据结构-无向连通图
数据结构·算法·图论·计算机考研·408真题解析
漫随流水3 小时前
leetcode回溯算法(93.复原IP地址)
数据结构·算法·leetcode·回溯算法
艾莉丝努力练剑3 小时前
【优选算法必刷100题】第021~22题(二分查找算法):山脉数组的峰顶索引、寻找峰值
数据结构·c++·算法·leetcode·stl
Tao____4 小时前
通用性物联网平台
java·物联网·mqtt·低代码·开源