Lua--棋牌游戏开发(概念性设计一)
程序员文章站
2022-04-28 22:50:49
...
Lua–棋牌游戏开发(概念性设计一)
回顾上节课的提问:上节课的博客链接
1.lua的八大数据类型:
- nil
- number
- boolean
- string
- funcion
- table
- userdata
- thread
2.ipairs和pairs的区别:
- 1.ipairs遇到元素值为nil则停止循环,pairs遇到nil继续循环;
- 2.ipairs只能遍历table的数组部分,pairs可以遍历数组和键值对部分(顺序不一定与 书写的顺序一致);
3.table的引用类型:
4.点与冒号的区别:冒号的第一个参数默认为self,指向调用该函数的表
local tb = {x = 1,y = 2}
local tb1 = {}
tb1 = tb
tb1.x = 20
print(tb.x) -- 20
1:牌概念性设计
描述一张牌:使用十六进制(十位表示花色,个位表示点数)
花色:红黑梅方王(0 - 4)
点数:A - K(1 - 13)
牌值:对应的大小顺序排列(3 - K:3 - 13 A:14 2:16 小王:18 大王:19)
红桃: K:0x0D
黑桃:A:0x11
2:创建一副牌
local CardUtils = {} – 牌的工具类
-- 1.创建一副牌
function CardUtils:newCards()
-- 返回54张牌
return
{
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,
0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,
0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,
0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,
0x41,0x42
}
end
3:求牌的花色
-- 2.求牌的花色
function CardUtils:getCardColor(card)
return math.floor(card / 0x10)
end
4:求牌的点数
function CardUtils:getCardPoint(card)
return card % 0x10
end
5:判断是否是王牌
function CardUtils:isJoker(card)
return 4 == self:getCardColor(card)
end
6:求牌的牌值
function CardUtils:getCardValue(card)
local point = self:getCardPoint(card) -- 获得点数
if self:isJoker(card) then -- 如果是王牌
if 1 == point then-- 0x41小王
return 18
else
return 19
end
end
if 1 == point then -- A
return 14
elseif 2 == point then -- 2
return 16
else
return point -- 3 - K
end
end
7:洗牌
function CardUtils:shuffle(allCards)
for i = 1,#allCards do
local j = math.random(1,#allCards)
allCards[i],allCards[j] = allCards[j],allCards[i]
end
end
8:发牌
function CardUtils:sendCards(allCards)
local handCards = {}
for i = 1,3 do
handCards[i] = {}
for j = 1,17 do
local card = table.remove(allCards)
table.insert(handCards[i],card)
end
end
return handCards
end
9:副牌排序
function CardUtils:sort(handCards)
table.sort(handCards,function(card1,card2)
local value1 = self:getCardValue(card1)
local value2 = self:getCardValue(card2)
local color1 = self:getCardColor(card1)
local color2 = self:getCardColor(card2)
-- 先比较牌值
if value1 ~= value2 then
return value1 > value2
else
-- 再比较花色
return color1 > color2
end
end)
end
10:打印整副牌
function CardUtils:print(handCards)
local s = ""
for i = 1,#handCards do
-- local color = self:getCardColor(handCards[i])
-- local point = self:getCardPoint(handCards[i])
s = s .. string.format("0x%02x",handCards[i]) .. " "
end
print(s)
end
11:测试函数
math.randomseed(os.time())
-- 测试
-- 1.创建一副新牌
local allCards = CardUtils:newCards()
-- 2.洗牌
CardUtils:shuffle(allCards)
-- 3.发牌
local handCards = CardUtils:sendCards(allCards)
-- -- 4.对第一个玩家的牌排序
CardUtils:sort(handCards[1])
-- -- 5.打印第一个玩家的牌
CardUtils:print(handCards[1])
return CardUtils --y用于其他类调用返回
上一篇: JeeTemp 模板系统 1.1 版发布
下一篇: MyBatis常见的概念性面试题