String Lua中两个字符串的比较
我试图比较两个字符串,其中第一个字符串是数组的单个元素,第二个数组只是一个常规字符串。出于某种原因,这种比较并不真实。希望有人能给我指出正确的方向String Lua中两个字符串的比较,string,lua,comparison,lua-table,String,Lua,Comparison,Lua Table,我试图比较两个字符串,其中第一个字符串是数组的单个元素,第二个数组只是一个常规字符串。出于某种原因,这种比较并不真实。希望有人能给我指出正确的方向 empty = " " pawn = " Pawn " rook = " Rook " knight = " Knight " bishop = " Bishop " queen = " Queen " king = " King " emptyspot = {} for i = 1, 8
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都是字符串
input = io.read("*line")
loc1 = string.sub(input, 1, 1)
loc2 = string.sub(input, 2, 2)
您正在以字符串形式读取中的输入,但您的emptyspot表使用数字索引作为键。尝试用以下方法修复它:
loc2 = tonumber(string.sub(input, 2, 2))
你的答案肯定是你眼前问题的根源
这并不是因为Lua不能比较字符串,而是因为您实际上查找了索引的2D数组中不存在的元素,并且总是将nil与pawn进行比较
也就是说,我对代码的其余部分以及您不久将遇到的问题有一些评论
首先,如果您发现自己正在复制和粘贴代码以构建一个大型的规则结构,请寻找机会使用循环和函数来抽象出公共元素。怪物功能棋盘就是一个很好的例子。从根本上说,它所做的是打印出电路板,这是一个由64个正方形组成的阵列,其中每个正方形都打印有一定数量的ASCII艺术。正如您所写的,索引每个方块当前部分的代码与绘制方块其余部分的代码纠缠在一起。例如,当你发现你更愿意为这些片段使用不同的符号来区分白色和黑色,而你现在还没有这样做,那么你在编辑由精心构造的字符串组成的完整io.write集合时就会手忙脚乱
第二,考虑将模型与视图进一步分离。本例中的模型是一个棋盘,它是一个正方形阵列,可能是空的,也可能包含两种颜色中的一种。视图是您如何绘制电路板以将其呈现给用户。这里的代码混合了模型和视图,因为片段本身在模型中由用于在视图中向用户显示它们的实际字符串表示。认识到这种抽象的存在对于实现比仅仅显示电路板和移动部件更复杂的算法非常重要
第三,使用不同常量重复相同测试的长if语句链几乎总是很容易转化为更紧凑、更高效的表达式 如果loc1==C或loc1==C,则为A到H中的每一个写loc1=3 end。这可以通过两种方式简化。首先,折叠输入大小写,以便测试单个字符大小写,然后使用string.find立即将字母转换为整数。所以整个8 if-then语句可以写成loc1 = ("abcdefgh"):find(loc1:lower())
这将使loc1成为1到8之间的整数,如果该字符不在A到H的范围内,则为nil
第四,io.write可以接受多个参数,这些参数将连续输出,没有任何分隔符,这与print不同,print在参数之间插入制表符,并在末尾添加换行符。因此,棋盘中的长表达式可以用简单的逗号替换所有字符串连接。这不仅更快,而且可以防止垃圾收集器最终处理大量垃圾,这些垃圾来自于完成表达式所需的所有临时字符串。您能举一个您试图比较的字符串的示例吗?我试图将emptyspot[][]引用为emptyspot[2][1]这等于典当,典当等于典当。它们都是一样的。请提供一个。变量中的值可能没有您认为的值。您可能没有注意到,但的第一条规则很短,该示例太长。试着从中找出问题所在。您可以测试的第一件事是打印这两个字符串。您是否考虑过正确格式化代码?