我一直试图在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
值。
答案 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