当前位置: 首页 > article >正文

【详解】斗地主随机发牌项目

目录

前言:

1.初始化牌

 2.洗牌

3.揭牌

总代码:

Card类:

CardGame类:

Main类:

结语:


前言:

斗地主是全国范围内的一种桌面游戏,本节我们来实现一下斗地主中的简单初始化牌、发牌和看牌功能。按照斗地主的规则,完成洗牌发牌的动作。具体规则为使用 52 张牌(不含大小王)打乱顺序,3 个玩家参与游戏,3 人交替摸牌,每人 5(可以自己修改) 张牌。

实现思路步骤:

1.初始化牌

2.洗牌

3.揭牌

4.剩余牌

效果展示:

实现如下:

1.初始化牌

牌有数字和花色,故我们要自己创建一个类来进行操作。toString方法要记得重写不然后面println不能直接输出。

public class Card{
    public String suit;//花色
    public int num;
    public Card(String suit,int num){
        this.suit = suit;
        this.num = num;
    }
    @Override
    public String toString(){
        return suit+" "+num;
    }
}

用suits来存储花色。List<Card>可以看成是一个存储Card的一维数组。利用java自带的ArrayLIst的add函数实现尾插。 

public static final String[] suits = {"♥","♣","♦","♠"};
    //初始化牌
    public List<Card> buyCard(){
        List<Card> cardList = new ArrayList<>();
        for(int i = 0;i < 4;i++){
            for(int j = 1;j <= 13;j++){
                String suit = suits[i];
                Card card = new Card(suit,j);
                cardList.add(card);
            }
        }
        return cardList;
    }

 效果如下:

 2.洗牌

利用random来生成随机数,这里有个小细节i是从最后一个数来进行遍历的利用rand来生成i之前的随机数进行交换这样就能保证每个牌都有被洗到。

//洗牌
    public void shuffle(List<Card> cardList){
        Random random = new Random();
        for(int i = cardList.size()-1;i > 0;i--){
            swap(cardList,i,random.nextInt(i));
        }
    }
    public void swap(List<Card> cardList,int i,int j){
        Card temp = cardList.get(i);
        cardList.set(i,cardList.get(j));
        cardList.set(j,temp);
    }

效果如下:

3.揭牌

这里解释一下List<List<Card>>,可以看成一个二维数组如图,List<Card>是一个泛型,最外面的List里面存储了一个List<Card>。

//揭牌
    public List<List<Card>> getCard(List<Card> cardList){
        List<Card> hand1 = new ArrayList<>();
        List<Card> hand2 = new ArrayList<>();
        List<Card> hand3 = new ArrayList<>();
        List<List<Card>> hand = new ArrayList<>();
        hand.add(hand1);
        hand.add(hand2);
        hand.add(hand3);
        for(int i = 0;i < 5;i++){
            for(int j = 0;j < 3;j++){
                Card card = cardList.remove(0);
                hand.get(j).add(card);
            }
        }
        return hand;
    }

总代码:

Card类:

public class Card{
    public String suit;//花色
    public int num;
    public Card(String suit,int num){
        this.suit = suit;
        this.num = num;
    }
    @Override
    public String toString(){
        return suit+" "+num;
    }
}

CardGame类:

import java.util.List;
import java.util.ArrayList;
import java.util.Random;
public class CardGame{
    public static final String[] suits = {"♥","♣","♦","♠"};
    //初始化牌
    public List<Card> buyCard(){
        List<Card> cardList = new ArrayList<>();
        for(int i = 0;i < 4;i++){
            for(int j = 1;j <= 13;j++){
                String suit = suits[i];
                Card card = new Card(suit,j);
                cardList.add(card);
            }
        }
        return cardList;
    }
    //洗牌
    public void shuffle(List<Card> cardList){
        Random random = new Random();
        for(int i = cardList.size()-1;i > 0;i--){
            swap(cardList,i,random.nextInt(i));
        }
    }
    public void swap(List<Card> cardList,int i,int j){
        Card temp = cardList.get(i);
        cardList.set(i,cardList.get(j));
        cardList.set(j,temp);
    }
    //揭牌
    public List<List<Card>> getCard(List<Card> cardList){
        List<Card> hand1 = new ArrayList<>();
        List<Card> hand2 = new ArrayList<>();
        List<Card> hand3 = new ArrayList<>();
        List<List<Card>> hand = new ArrayList<>();
        hand.add(hand1);
        hand.add(hand2);
        hand.add(hand3);
        for(int i = 0;i < 5;i++){
            for(int j = 0;j < 3;j++){
                Card card = cardList.remove(0);
                hand.get(j).add(card);
            }
        }
        return hand;
    }
}

Main类:

import java.util.List;
public class Main {
    public static void main(String[] args){
        CardGame cardgame = new CardGame();
        List<Card> ret = cardgame.buyCard();
        System.out.println("初始化牌");
        System.out.println(ret.subList(0,13));
        System.out.println(ret.subList(13,26));
        System.out.println(ret.subList(26,39));
        System.out.println(ret.subList(39,52));
        System.out.println("洗牌");
        cardgame.shuffle(ret);
        System.out.println(ret.subList(0,13));
        System.out.println(ret.subList(13,26));
        System.out.println(ret.subList(26,39));
        System.out.println(ret.subList(39,52));
        System.out.println("揭牌");
        List<List<Card>> hand = cardgame.getCard(ret);
        for(int i = 0;i < 3;i++){
            System.out.println("第 "+(i+1)+"个人的牌:"+hand.get(i));
        }
        System.out.println("剩下的牌:");
        System.out.println(ret);
    }
}

结语:

其实写博客不仅仅是为了教大家,同时这也有利于我巩固自己的知识点,和一个学习的总结,由于作者水平有限,对文章有任何问题的还请指出,接受大家的批评,让我改进,如果大家有所收获的话还请不要吝啬你们的点赞收藏和关注,这可以激励我写出更加优秀的文章。


http://www.kler.cn/news/233148.html

相关文章:

  • GeoServer 2.11.1升级解决Eclipse Jetty 的一系列安全漏洞问题
  • 突破编程_C++_基础教程(类的基础知识)
  • 解密输入输出迷局:蓝桥杯与ACM中C++/C语言常见问题揭秘
  • 【Java八股面试系列】JVM-常见参数设置
  • 【网工】华为设备命令学习(Telnet)
  • 【51单片机】外部中断和定时器中断
  • 【C/C++】整数及乘积的溢出问题
  • CSS综合案例4
  • Vue ElementUI中el-table表格嵌套样式问题
  • github和gitee
  • Excel+VBA处理高斯光束
  • 全网最快2024刘谦春晚魔术揭秘
  • ssh和sftp服务分离
  • 关于LLaMA Tokenizer的一些坑...
  • 【征稿已开启】第五大数据、人工智能与软件工程国际研讨会(ICBASE 2024)
  • Elasticsearch中的动态DSL解决方案
  • Android 自定义BaseActivity
  • ES实战-book笔记1
  • OCP使用web console创建和构建应用
  • .gitlab-ci.yml文件参数
  • 极狐GitLab 与钉钉的集成实践
  • C++的学习记录
  • [office] excel求乘积的公式和方法 #媒体#笔记#经验分享
  • H12-821_74
  • 贵金属交易包括哪些?香港有哪些贵金属交易平台?
  • 力扣热题100_双指针_11_盛最多水的容器
  • 2022美国大学生数学建模(优秀获奖论文)-A题:Power Planning Model: Magic Weapon for Cyclists
  • Linux time命令教程:如何测量命令的执行时间(附案例详解和注意事项)
  • 【PyQt】08 - 编辑Tab顺序
  • 编译器选择:VSCode安装MarkDown插件