这段时间刚学习完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)