2013-11-16 3 views
0

Я пытаюсь сравнить две строки, где первая строка - это один элемент массива, а второй массив - просто регулярная строка. По какой-то причине сравнение не проходит, как истина. Надеюсь, кто-то может указать мне в правильном направлении!Сравнение двух строк в Lua

empty = "  " 
pawn = " Pawn " 
rook = " Rook " 
knight = " Knight " 
bishop = " Bishop " 
queen = " Queen " 
king = " King " 

emptyspot = {} 
for i = 1, 8 do 
    emptyspot[i] = {} 
    for j = 1, 8 do 
     emptyspot[i][j] = " / " 
    end 
end 

function chessBoard() 
    io.write("\n\nWelcome to LuaChess!\n\n") 
    io.write("   1  2  3  4  5  6  7  8 \n") 
    io.write("  *************************************************************************\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write(" A *".. emptyspot[1][1] .. 
    "*"..emptyspot[1][2].."*"..emptyspot[1][3].."*"..emptyspot[1][4]..  
    "*"..emptyspot[1][5].."*"..emptyspot[1][6].."*"..emptyspot[1][7].."*"..emptyspot[1][8].."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *************************************************************************\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write(" B *".. emptyspot[2][1] .. 
    "*"..emptyspot[2][2].."*"..emptyspot[2][3].."*"..emptyspot[2][4]..  
    "*"..emptyspot[2][5].."*"..emptyspot[2][6].."*"..emptyspot[2][7].."*"..emptyspot[2][8].."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *************************************************************************\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write(" C *".. emptyspot[3][1] .. 
    "*"..emptyspot[3][2].."*"..emptyspot[3][3].."*"..emptyspot[3][4]..  
    "*"..emptyspot[3][5].."*"..emptyspot[3][6].."*"..emptyspot[3][7].."*"..emptyspot[3][8].."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *************************************************************************\n") io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write(" D *".. emptyspot[4][1] .. 
    "*"..emptyspot[4][2].."*"..emptyspot[4][3].."*"..emptyspot[4][4]..  
    "*"..emptyspot[4][5].."*"..emptyspot[4][6].."*"..emptyspot[4][7].."*"..emptyspot[4][8].."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *************************************************************************\n") io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write(" E *".. emptyspot[5][1] .. 
    "*"..emptyspot[5][2].."*"..emptyspot[5][3].."*"..emptyspot[5][4]..  
    "*"..emptyspot[5][5].."*"..emptyspot[5][6].."*"..emptyspot[5][7].."*"..emptyspot[5][8].."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *************************************************************************\n") io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write(" F *".. emptyspot[6][1] .. 
    "*"..emptyspot[6][2].."*"..emptyspot[6][3].."*"..emptyspot[6][4]..  
    "*"..emptyspot[6][5].."*"..emptyspot[6][6].."*"..emptyspot[6][7].."*"..emptyspot[6][8].."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *************************************************************************\n") io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write(" G *".. emptyspot[7][1] .. 
    "*"..emptyspot[7][2].."*"..emptyspot[7][3].."*"..emptyspot[7][4]..  
    "*"..emptyspot[7][5].."*"..emptyspot[7][6].."*"..emptyspot[7][7].."*"..emptyspot[7][8].."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *************************************************************************\n") io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write(" H *".. emptyspot[8][1] .. 
    "*"..emptyspot[8][2].."*"..emptyspot[8][3].."*"..emptyspot[8][4]..  
    "*"..emptyspot[8][5].."*"..emptyspot[8][6].."*"..emptyspot[8][7].."*"..emptyspot[8][8].."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *".. empty .. 
    "*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*"..empty.."*\n") 
    io.write("  *************************************************************************\n\n") 

    io.write("  Choose a piece to move and the location\n  for it to be moved to separated by a space:\n") 
end 

function initBoard()  
    emptyspot[1][1] = rook 
    emptyspot[1][2] = knight 
    emptyspot[1][3] = bishop  
    emptyspot[1][4] = queen  
    emptyspot[1][5] = king 
    emptyspot[1][6] = bishop  
    emptyspot[1][7] = knight 
    emptyspot[1][8] = rook 
    emptyspot[8][1] = rook 
    emptyspot[8][2] = knight  
    emptyspot[8][3] = bishop  
    emptyspot[8][4] = queen 
    emptyspot[8][5] = king 
    emptyspot[8][6] = bishop  
    emptyspot[8][7] = knight  
    emptyspot[8][8] = rook 
    for i = 1, 8 do   
     emptyspot[2][i] = pawn 
    end  
    for i = 1, 8 do   
     emptyspot[7][i] = pawn 
    end 
end 

function swapPieces(piece1, piece2)  
    temp = piece1 
    piece1 = piece2 
    piece2 = temp 
end 

function movePawnPlayerOne(spot1, spot2)  
    spot1 = spot1 + 1 
    emptyspot[spot1][spot2] = pawn 
    print(emptyspot[spot1][spot2]) 
end 


initBoard() 
while true do 
    chessBoard() 
    --Take first input for movement  
    input = io.read("*line")  
    loc1 = string.sub(input,1,1) 
    loc2 = string.sub(input,2,2) 

    if((loc1 == "A") or (loc1 == "a")) then   
     loc1 = 1   
    end  
    if ((loc1 == "B") or (loc1 == "b")) then   
     loc1 = 2   
    end  
    if ((loc1 == "C") or (loc1 == "c")) then   
     ioc1 = 3 
    end  
    if ((loc1 == "D") or (loc1 == "d")) then   
     loc1 = 4   
    end  
    if ((loc1 == "E") or (loc1 == "e")) then 
     loc1 = 5 
    end  
    if ((loc1 == "F") or (loc1 == "f")) then   
     loc1 = 6 
    end  
    if ((loc1 == "G") or (loc1 == "g")) then  
     loc1 = 7 
    end  
    if ((loc1 == "H") or (loc1 == "h")) then   
     loc1 = 8 
    end 

    if (emptyspot[loc1][loc2] == pawn) then   
     movePawnPlayerOne(loc1, loc2) 
    end 

    print(emptyspot[3][1]) 

    if string.find(input, "restart") then 
     initBoard()  
    end  
    if string.find (input, "exit") then 
     os.exit() 
    end 
end 

Кусок кода, о котором идет речь, находится в нижней части. Оба emptyspot[][] и pawn являются обеими строками.

+1

Не могли бы вы привести пример строк, которые вы пытаетесь сравнить? – jrd1

+0

Я пытаюсь ссылаться на emptyspot [] [] как emptyspot [2] [1], который равен «Pawn», а пешка равна «Pawn». Они оба - одно и то же. – Deafsilver

+2

Предоставьте [Короткое, самосохраненное, правильное (компилятивное), пример] (http://sscce.org/). Значения в переменных могут не иметь того значения, которое вы так думаете. –

ответ

4
input = io.read("*line") 
loc1 = string.sub(input, 1, 1) 
loc2 = string.sub(input, 2, 2) 

Вы читаете ввод в виде строки, но ваш emptyspot таблица использует числовые индексы в качестве ключей. Попробуйте установить его с помощью:

loc2 = tonumber(string.sub(input, 2, 2)) 
4

Ответ от greatwolf, безусловно, является источником вашей непосредственной проблемы.

Это не то, что Lua не может сравнивать строки, но вы фактически просмотрели несуществующий элемент двумерного массива, который вы указали, и всегда сравнивали nil с pawn.

У меня есть несколько комментариев о остальной части кода и о проблемах, с которыми вы скоро столкнетесь.

Во-первых, если вы копируете и вставляете код для создания большой регулярной структуры, ищите возможности использовать циклы и функции для абстрагирования общих элементов. Хорошим примером является функция монстра chessBoard. По сути, это то, что он печатает на доске, которая представляет собой массив из 64 квадратов, где каждый квадрат печатается с определенным количеством ASCII-art. Как вы его написали, код, который индексирует текущую часть каждого квадрата, глубоко запутан с кодом, который рисует остальную часть квадрата. Когда вы обнаружите, что предпочитаете использовать разные обозначения для фигур (например, чтобы отличить White from Black, который вы не делаете сейчас), у вас будет беспорядок на ваших руках, чтобы отредактировать эту монолитную коллекцию io.write, созданную с помощью тщательно построенные строки.

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

В-третьих, длинные цепочки if заявления, повторяющие один и тот же тест с разными константами, почти всегда легко превращаются в более компактные (и более эффективные) выражения.

Вы пишете if ((loc1 == "C") or (loc1 == "c")) then loc1=3 end для каждого из А по Н. Это можно упростить двумя способами. Сначала сверните входной регистр, чтобы вы тестировали один случай символа, а затем используйте string.find для преобразования из буквы в целое число одновременно. Таким образом, весь блок из 8 if-then заявлений может быть записана в виде

loc1 = ("abcdefgh"):find(loc1:lower()) 

, которые будут либо сделать LOC1 быть целым числом от 1 до 8, или nil если этот символ не находится в диапазоне от А до Н.

В-четвертых, io.write может принимать несколько аргументов, которые будут выводиться последовательно без каких-либо разделителей (в отличие от print, который вставляет вкладки между аргументами и новой строкой в ​​конце). Таким образом, эти длинные выражения в chessBoard() могут содержать всю конкатенацию строк, замененную простыми запятыми. Это происходит не только быстрее, но и предотвращает создание большого количества мусора для сборщика мусора, чтобы в конечном итоге обработать его, исходя из всех временных строк, необходимых для завершения выражения.

Смежные вопросы