2015-09-01 2 views
0

У меня проблема с моим кодом, и я не могу найти преступника. Я отлаживал это по-разному, и все они подошли так, как будто проблема не существует.Почему эти значения установлены на неправильные переменные?

Этот код используется для игры в шахматы, которую я делаю в Roblox, которая используется для создания руд.

--[[ 
an ore can have one of these different 'spawn types' that is predefined when the game starts which dictates what 'OreTypes' it can have, 
and if there are multiple OreTypes under one SpawnType, 
then percent values will be given controlling the odds of one OreType being chosen over the other. 
]]-- 
OreSpawnTypes = {} 

-- all the different ore Types 
OreTypes = {} 

--[[ 
creates a new ore type with its name, the ore's base value, 
and variables defining how it looks in game. 
ignore 'chance=0' that's just for defining purposes 
]]-- 
function add_ore_type(n,ov,bc,mat,ref,tran) -- 
    OreTypes[n] = { 
     BrickColor=bc, 
     Material=mat, 
     Reflectance=ref, 
     Transparency=tran, 
     Name=n, 
     ore_value=ov, 
     chance=0 
    } 
end 

--[[ 
when used in 'add_spawn_type' to keep track of the previous ore type, 
that was just created by it, to be used in 'add_ore' 
to add the different ores do the ore type 
--]] 
local name = "" 

--[[ 
creates a new spawn type, and sets the name variable to the key 
of the ore type listed in the OreSpawnTypes table 
--]] 
function add_spawn_type(n) 
    OreSpawnTypes[n] = {} 
    name=n 
end 

--[[ 
adds one of the defined ores from 'OreTypes' and with a number form 1-100, 
adds it to the previously created spawntype 
--]] 
function add_ore(ch,n) 
    local o = OreTypes[n] 
    o.chance = ch 

    OreSpawnTypes[name][#OreSpawnTypes[name]+1] = o 
end 

-- what I use to view the table 
function show_spawn_types() 

print("------------------------------------------------") 

for k,v in pairs(OreSpawnTypes) do 
    print(k.."=") 
    for k2,v2 in pairs(v) do 
     print("    "..k2.."=") 
     for k3,v3 in pairs(v2) do 
      print("      "..k3.."="..v3) 
     end 
    end 
end 
end 

-- this next part is where the ore types are set and the ores are set to each one. 

add_ore_type("grass",2,"Earth green","Plastic",0,0) 
add_ore_type("ground",4,"Earth green","Slate",0,0) 
add_ore_type("rock",8,"Dark stone grey","Slate",0,0) 

add_spawn_type("grass") 
add_ore(100,"grass") --<NOTE ARGUMENT ONE 

add_spawn_type("grass/ground") 
add_ore(50,"grass") --<NOTE ARGUMENT ONE 
add_ore(50,"ground") --<NOTE ARGUMENT ONE 

add_spawn_type("ground") 
add_ore(100,"ground") --<NOTE ARGUMENT ONE 

add_spawn_type("rock") 
add_ore(100,"rock") --<NOTE ARGUMENT ONE 

show_spawn_types() 

Ниже приведен список руд, которые я планирую добавить. некоторые из них используются в приведенном выше коде.

--[[ 
0= all_grass 
1= grass/ground 
2= ground 
3= rock 
4= rock/stone 
5= stone 
6= stone/limestone/slate 
7= gold deposit 
8= silver deposit 
9= nickel deposit 
10= copper deposit 
11= emerald deposit 
12= saphire deposit 
13= ruby deposit 
14= diamond deposit 
15= rare mineral deposit 
16= super rare ores 1 
17= super rare ores 2 
18= radioactive ores 
--]] 

Проблема в том, что в show_spawn_types() выходе, он показывает:

grass= 
      1= 
        Transparency=0 
        BrickColor=Earth green 
        Reflectance=0 
        chance=50 --<NOTE THESE VARIABLES 
        Material=Plastic 
        Name=grass 
        ore_value=2 
rock= 
      1= 
        Transparency=0 
        BrickColor=Dark stone grey 
        Reflectance=0 
        chance=100 --<NOTE THESE VARIABLES 
        Material=Slate 
        Name=rock 
        ore_value=8 
ground= 
      1= 
        Transparency=0 
        BrickColor=Earth green 
        Reflectance=0 
        chance=100 --<NOTE THESE VARIABLES 
        Material=Slate 
        Name=ground 
        ore_value=4 
grass/ground= 
      1= 
        Transparency=0 
        BrickColor=Earth green 
        Reflectance=0 
        chance=50 --<NOTE THESE VARIABLES 
        Material=Plastic 
        Name=grass 
        ore_value=2 
      2= 
        Transparency=0 
        BrickColor=Earth green 
        Reflectance=0 
        chance=100 --<NOTE THESE VARIABLES 
        Material=Slate 
        Name=ground 
        ore_value=4 

Если вы заметили, что первый аргумент в функции add_ore() и сравнить их с их значениями на выходе, на «траву» Единственная связанная руда типа spawn имеет вероятность появления 50%, когда я устанавливаю ее равной 100 в функции. Кроме того, первая связанная руда имеет шанс появления нереста на 100, когда она должна быть равна 50.

Я проверил это по-разному, я положил функцию print() внутри функции добавления руды, в которой установлена ​​вероятностная переменная появления. И в этих отладках это показывает, что переменная задана правильно, но дело в том, что ... Нигде в коде я не устанавливаю случайную переменную после этого, если значения не получат «смешение» каким-то образом, но даже тогда Я проверил, чтобы установить значение в нужный тип.

Есть ли что-либо, что мне не хватает или я нашел ошибку в lua ???

ПРИМЕЧАНИЕ. Я приглашаю вас скопировать и вставить код в командную строку lua, отредактировать код и поместить в print fuctions для отладки частей кода. Он должен работать правильно.

ответ

4

Variables in Lua hold references to tables, поэтому присвоение не создает новую таблицу. Например:

a = {chance=100} 
b = a 
b.chance = 50 
print(a.chance) -- outputs 50 

Проблема возникает в этой функции:

function add_ore(ch,n) 
    local o = OreTypes[n] 
    o.chance = ch 
    OreSpawnTypes[name][#OreSpawnTypes[name]+1] = o 
end 

Последняя строка выталкивает другую ссылки к столу (не копия) и поэтому в следующий раз вы называете add_ore с тем же имя для n изменение o.chance = ch влияет на все ссылки на OreTypes[n].

Прежде чем изменять его, вы можете создать копию таблицы o.

local copy = {} 
for k, v in pairs(OreTypes[n]) do copy[k] = v end 
copy.chance = ch 
OreSpawnTypes[name][#OreSpawnTypes[name]+1] = copy 

Похоже, что у вас есть прототип и вы хотите создать варианты этого прототипа. Копирование является самым простым, но Lua поддерживает prototypes with metatables, который вас может заинтересовать.

+0

Мне это интересно, но какой из них меньше взимает плату за процессор? Я предполагаю, что это metatables. – Andrew900460

+1

Метатемы немного более подвержены налогообложению при вычислении, они применяются после сбоя поиска, поэтому они могут выполнять два поиска, но они могут быть намного эффективнее с точки зрения памяти. Однако с такими крошечными таблицами ни один из них не имеет значения, и чистый поддерживаемый код имеет ** большую ** большую ценность. – ryanpattison