在Lua中制作和使用对象式模块

时间:2014-12-12 19:24:40

标签: object lua

我一直试图在Lua中使用一个模块并用它来模仿一个物体。 我做了一副牌:

local Card = require("Card")

local function firstCard()
    Card.newDeck()
    Card.drawCard()
    return Card.getCard()
end

local function secondCard()
    Card.newDeck()
    Card.drawCard()
    return Card.getCard()
end

first = firstCard()
second = secondCard()

print(first)
print(second)

我设置了first = firstCard()second = secondCard()但是当我打印两个变量时second偶尔会产生nil。老实说,我输了。这是实际的模块本身。

local Card = {}

local deck
local value
local number, suit
local index = 0
local getCard
local getValue

function Card.newDeck()
   deck = {}
   value = {}
   for x = 1, 13 do
      if x == 1 then
         number = "Ace"
      elseif x == 11 then
         number = "Jack"
      elseif x == 12 then
         number = "Queen"
      elseif x == 13 then
         number = "King"
      else
         number = x
      end
      for x1 = 1, 4 do
         if x1 == 1 then
            suit = "Clubs"
         elseif x1 == 2 then
            suit = "Diamonds"
         elseif x1 == 3 then
            suit = "Hearts"
         else
            suit = "Spades"
         end
         index = index + 1
         deck[index] = number.." of "..suit
         value[index] = x
      end
   end
end

function Card.drawCard()
   index = math.random(52)
   getCard = deck[index]
   getValue = value[index]
end

function Card.getCard()
   return getCard
end

function Card.getValue()
   return getValue
end

function Card.getIndex()
   return index
end

return Card

当谈到面向对象的编程时,我对Lua知之甚少,说实话,我通常只将它用于计算或小游戏以让我占用我的课堂 - 我只有16岁我已经习惯了Java,尽管在我拿起Java之前我已经开始使用Lua了。我只想知道是否以及如何使这项工作成功。在大多数情况下,它只是偶然的nil值。

2 个答案:

答案 0 :(得分:2)

问题是您已在模块的顶层声明了index变量local。这意味着您在第一次index中计算的drawCard()随机值会在您对newDeck()的第二次调用中重复使用。您可以在print(index)的开头添加newDeck()以查看我的意思。

有几种方法可以解决这个问题。一种方法是在index = 0的顶部添加newDeck()。更好的方法是使用较小的作用域声明变量,即使用index本地化每个使用它的函数。

答案 1 :(得分:0)

尝试使用它,似乎工作正常,如果索引存在问题,它应该打印“ERROR NO VALUE”,如果发生(不应该),只需打印索引(在generateCard中) ()函数)。

这是测试

local Card = require("Card");
local function firstCard()
    Card.newDeck()
    return Card.generateCard(); -- two parameters, deck and value
end
local function secondCard()
    Card.newDeck()
    return Card.generateCard();
end
first = firstCard()
second = secondCard()
print(first)
print(second)

这是模块

local Card = {deck={};value={};};
function Card.newDeck()
    local self = Card
    local deck = self.deck;
    local value = self.value;
    local cards = {[1]="Ace",[11]="Jack",[12]="Queen",[13]="King"};
    local types = {[1]="Clubs",[2]="Diamonds",[3]="Hearts",[4]="Spades"};
    for x = 1, 13 do
        for i = 1, 4 do
            local _card,_type=(cards[x] or x),types[i];
            deck[#deck+1] = _card.." of ".._type
            value[#deck+1] = x
        end
    end
end
function Card.generateCard()
    local self = Card;
    if(not math.round) then
        math.round = function(value) local mi,ma=math.floor(value),math.ceil(value)return(mi+0.5>value and mi or ma)end;
    end
    local index = math.round(math.random(1000, 52000)/1000);
    return (self.deck[index] or "NO VALUE FOR CARD"),(self.value[index] or "NO DECK FOR CARD");
end
return Card