Creating and using an Object-style module in Lua

I am trying to take a module in Lua and use it to simulate an object. those. i made a deck of cards:

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)

      

I set first = firstCard()

and second = secondCard()

, but when I print two variables second

sometimes it comes out like nil

. I'm honestly lost. Here's the actual module itself.

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

      

I have limited knowledge of Lua when it comes to object oriented programming, and to be honest, I usually only use it for computations or small games to keep me busy. I'm cool, I'm only 16. I'm mostly used for Java, although I started using Lua long before I took Java. I just want to know how and how I can make this work. For the most part it works, only those random values nil

.

+3


source to share


2 answers


The problem is that you have specified the index

local variable at the top level of your module. This means that the random value index

that you calculated in the first drawCard()

is reused in the second call newDeck()

. You can add print(index)

at the beginning newDeck()

to see what I mean.



There are several ways to solve the problem. Could add index = 0

at the top newDeck()

. Better would be to declare your variables with less coverage, i.e. Make it index

local to every function used.

+2


source


Try using this instead, it seems to work fine, it should print "ERROR NO VALUE" if there is any problem with the index, if it does (it shouldn't) just print the index (in the generateCard () file).

This is a test

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)

      



This is a module

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

      

0


source







All Articles