功能描述
功能比较简单,主要是思路。正常思路都是一人一张牌,轮流发,这样是模拟正常的摸牌样子。但是,我们可以用另一种思路,实现起来比较简单,其实结果都是一样的:先用一个方法生成一副扑克牌,包括四个花色和大小王,然后从中依次拿出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)))
}
具体结果如下: