模仿斗地主玩法实现扑克牌的分发

功能描述

功能比较简单,主要是思路。正常思路都是一人一张牌,轮流发,这样是模拟正常的摸牌样子。但是,我们可以用另一种思路,实现起来比较简单,其实结果都是一样的:先用一个方法生成一副扑克牌,包括四个花色和大小王,然后从中依次拿出17张牌给player1,再依次拿出17张给player2,再依次拿出17张给player3,剩下的就是底牌。其中还有一步就是需要给每个玩家拿到的牌进行排序。

数据结构

数据结构主要就是使用ArrayList实现,注:代码是kotlin写的。

代码描述

1. 单张扑克牌

创建一个Poker类,用于表示单张扑克牌的数据,具体如下:

class Poker {

    //type代表花色
    var type: String = ""
    //num代表点数
    var num: Int = 0
    //排序标志,用于排序
    var sortFlag = 0
    //显示点数,这里主要用于区分JQKA等牌,比如K,点数是13,但需要显示K
    var showNum: String = ""

    constructor(type: String, num: Int, sortFlag: Int, showNum: String) {
        this.type = type
        this.num = num
        this.sortFlag = sortFlag
        this.showNum = showNum
    }
}

2. 生成一副牌

有了一张扑克牌的类,就可以生成一副扑克牌了,具体方法如下:

    //创建一个ArrayList,代表整副扑克牌
    private val pokerList: ArrayList<Poker> = arrayListOf()
    private fun init() {
    pokerList.clear()
    var sortFlag: Int
    var showNum: String
    //放入四个花色的1-10,J,Q,K
    for (i in 1..13) {
        //排序标志位
        //点数为2的牌是除了王之外最大的,标志位设为15
        //点数为1的牌是A,是除了2和王之外最大的,标志位设为14
        //其他的点数就按照点数设置标志位就可以了
        sortFlag = when (i) {
            1 -> 14
            2 -> 15
            else -> i
        }
        //显示点数
        //主要将JQKA转换一下
        showNum = when (i) {
            1 -> "A"
            11 -> "J"
            12 -> "Q"
            13 -> "K"
            else -> i.toString()
        }
        //四个花色add到ArrayList中
        val puke1 = Poker("黑桃️", i, sortFlag, showNum)
        pokerList.add(puke1)

        val puke2 = Poker("红桃", i, sortFlag, showNum)
        pokerList.add(puke2)

        val puke3 = Poker("方块", i, sortFlag, showNum)
        pokerList.add(puke3)

        val puke4 = Poker("草花", i, sortFlag, showNum)
        pokerList.add(puke4)
    }
    //大小王,注意排序标志位设为16和17
    pokerList.add(Poker("Joker", 1, 16, "1"))
    pokerList.add(Poker("Joker", 2, 17, "2"))
 }

3. 分发牌方法

使用Random随机发牌,这里注意一下,每次发完一张牌,需要将这个牌在上面生成的pokerList中移除,即说明这张牌发出去了,剩余牌堆里没有了,具体方法如下:

    //新建三个ArrayList,代表三个玩家的牌
    var player1: ArrayList<Poker> = arrayListOf()
    var player2: ArrayList<Poker> = arrayListOf()
    var player3: ArrayList<Poker> = arrayListOf()

    //循环51次(根据斗地主的规则,每个玩家17张牌,剩三张底牌),每次随机出一张牌分给相应的玩家
    for (i in 1..51) {
        val poker = pokerList[Random.nextInt(55 - i)]
        when {
            //玩家1牌数小于17张,就一直给玩家1,直到17张,然后给玩家2,然后玩家3...
            player1.size < 17 -> player1.add(poker)
            player2.size < 17 -> player2.add(poker)
            player3.size < 17 -> player3.add(poker)
        }
        //将分完的这张牌移除pokerList
        pokerList.remove(poker)
    }

4. 排序牌方法

由于已经设置了排序标志位,这个排序就非常简单了,就是简单的冒泡法排序,具体如下:

    private fun sort(pokerList: ArrayList<Poker>): ArrayList<Poker> {
        for (i: Int in 0..pokerList.size) {
            for (j: Int in 0 until pokerList.size - i - 1) {
                if (pokerList[j].sortFlag < pokerList[j + 1].sortFlag) {
                    val temp = pokerList[j]
                    pokerList[j] = pokerList[j + 1]
                    pokerList[j + 1] = temp
                }
            }
        }
        return pokerList
    }

5. 输出方法

将ArrayList中的数据输出的方法,这个就是因人而异了,我就依次输出,中间加了个逗号,具体方法如下:

    private fun listToString(pokerList: ArrayList<Poker>): String {
        var toString = ""
        for (i in pokerList) {
            toString += i.type + i.showNum + ","
        }
        return toString.substring(0, toString.length - 1)
    }

6. 输出结果

整体的main方法如下:

fun main(args: Array<String>) {

        var player1: ArrayList<Poker> = arrayListOf()
        var player2: ArrayList<Poker> = arrayListOf()
        var player3: ArrayList<Poker> = arrayListOf()

        init()
        for (i in 1..51) {
            val poker = pokerList[Random.nextInt(55 - i)]
            when {
                player1.size < 17 -> player1.add(poker)
                player2.size < 17 -> player2.add(poker)
                player3.size < 17 -> player3.add(poker)
            }
            pokerList.remove(poker)
        }

        player1 = sort(player1)
        player2 = sort(player2)
        player3 = sort(player3)

        System.out.println("玩家1:" + listToString(player1))
        System.out.println("玩家2:" + listToString(player2))
        System.out.println("玩家3:" + listToString(player3))

        System.out.println("底牌:" + listToString(sort(pokerList)))

    }

具体结果如下:
分牌结果

おすすめ

転載: blog.csdn.net/nhx900317/article/details/109673164