[lua] 用lua实现扑克游戏发牌的逻辑代码

14 篇文章 3 订阅
6 篇文章 0 订阅

lua语言发牌逻辑

这段时间刚学习完lua语言的语法逻辑,所以手头一热乎就像做点什么东西,所以想到了又好写又简单的大家玩的扑克发牌思路。我们在生活中都打牌,然后打牌的时候都洗过牌。洗牌的步骤就是先整理牌,然后打乱牌顺序,然后就摸牌,最后剩下三张就是抢到地主的人拿的牌。

首先我们先整理下扑克牌中正常发牌的思路:
 1. 先将54张牌整理在一起
 2. 然后将这些牌随机打乱顺序
 3. 然后摸牌,留下最后三张是地主的牌

整理思路后,我们就可以开始搭建数据结构:

第一步:做一个专门放所有卡的信息table,代码如下:
card = {
        'f_2','h_2','m_2','r_2','f_3','h_3','m_3','r_3','f_4','h_4','m_4','r_4','f_5','h_5','m_5','r_5',
        'f_6','h_6','m_6','r_6','f_7','h_7','m_7','r_7','f_8','h_8','m_8','r_8','f_9','h_9','m_9','r_9',
        'f_10','h_10','m_10','r_10','f_J','h_J','m_J','r_J','f_Q','h_Q','m_Q','r_Q','f_K',
        'h_K','m_K','r_K','f_A','h_A','m_A','r_A','XIAO','DA'}

注意:f_为方块,h_为黑桃,m_为梅花,r_为红桃。XIAO为小王,DA为大王

第二部:做一个专门放玩家牌的table,代码如下:
player1 = {}
player2 = {}
player3 = {}

还没有发牌和得到手牌,所以为空

第三步:做一个是地主的那三张牌,代码如下:
showCard = {}
在定义一个杂项,用来记录玩家卡牌和三张牌的数组下标
pid1 = 1
pid2 = 1
pid3 = 1
show = 1

注意:因为lua里的下标是从1开始的,和其他语言有点区别。

然后在发牌中,我是要在控制台打印的,所以这里先把打印卡牌的逻辑写好。

第四步:打印卡牌的逻辑
function printCard(...)
    local s = [[]]
    for k,v in pairs(...) do
        s = s..v
        s = s..' '
    end
    print(s)
end

这一段会遍历 … 带过来的数据然后打印到控制台

第五步:将随机种子设置好
function rSeed()
    math.randomseed( os.time() )
    math.random()
    math.random()
    math.random()
    math.random()
end

这里将随机种子设置好,randomseed(os.time())这里取系统时间作为种子参数设置

注意:最重要的是后面几个,因为lua这里的随机很坑爹,会出现随机出来的第一个值是固定的,所以我查了很多资料之后根本解决方案就是,在种子函数后面多使用几次math.random()方法即可。

第六步:随机打乱卡牌的顺序,即洗牌
function randCard( ... )
    local card = ...
    local len = #card
    local times = len * 5
    while times > 0 do
        local rSub = math.random(len)
        card[1],card[rSub] = card[rSub],card[1]
        times=times-1
    end
end

这里我使用了一个很特别的打乱方法,首先我随机获得一个卡牌的下标,然后将这个下标指定的值和第一个元素的值进行交换,然后随机打乱个len*5次,即已经能够全部打乱了。这里就是模拟洗牌的过程。

第七步:发牌的过程
function faCard( ... )
    local card = ...
    local len = #card

    for i=1,len do
        if i <= 51 then
            if i%3 == 1 then
                player1[pid1] = card[i]
                pid1 = pid1 + 1    
            elseif i%3 == 2 then
                player2[pid2] = card[i]
                pid2 = pid2 + 1
            elseif i%3 == 0 then
                player3[pid3] = card[i]
                pid3 = pid3 + 1
            end
        else
            showCard[show] = card[i]
            show = show + 1
        end
    end
end

这里将三个玩家按顺序来发牌,第一个玩家就是当前牌下表与3求余为1,即给他,第二个是与3求余为2,第三个就是求余为0。与3求余就是只有三个玩家,所以与3求余了。

第八步:最后就是按顺序调用这些流程,然后打印各个玩家的卡牌了。
rSeed()	--设置随机种子
print('In card group random before:')
printCard(card)	--打印前的卡牌
randCard(card)	--将卡牌打乱,洗牌的过程
print('In card group random after:')
printCard(card)	--洗牌后的卡牌
faCard(card)	--发牌给玩家

print('\n')
print('-------')
print('show Card:')
printCard(showCard)
print('-------')
print('player1:')
printCard(player1)
print('-------')
print('player2:')
printCard(player2)
print('-------')
print('player3:')
printCard(player3)

最终看看运行流程:
在这里插入图片描述这里就完美设计完成了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值