欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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用于其他类调用返回
相关标签: Lua