Lua中两个字符串的比较

Dea*_*ver 0 string comparison lua lua-table

我试图比较两个字符串,其中第一个字符串是数组的单个元素,第二个数组只是一个常规字符串.出于某种原因,这种比较并非如此.希望有人可以指出我正确的方向!

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
Run Code Online (Sandbox Code Playgroud)

有问题的代码是最底层的.这两个emptyspot[][]pawn都是字符串.

RBe*_*eig 6

的回答肯定是你眼前问题的根源.

这并不是说Lua中无法比拟的字符串,但你实际上已经抬头你索引的二维数组的一个不存在的元素,总是比较nilpawn结果.

也就是说,我对其余代码以及即将遇到的问题有一些评论.

首先,如果您发现自己复制并粘贴代码以构建大型常规结构,请寻找机会使用循环和函数来抽象出常见元素.怪物功能chessBoard就是一个很好的例子.从根本上说,它的作用是打印出一块64个正方形的数据板,每个正方形都印有一定数量的ASCII艺术.正如你所写的那样,索引每个方块当前片段的代码与绘制其余方块的代码深深地纠缠在一起.当你发现你宁愿为这些碎片使用不同的符号时(例如,将白色与黑色区分开来,你现在没有这样做),你手上就会弄得一团糟用来io.write仔细编辑这个整体的构建集合构造字符串.

其次,考虑将模型与视图进一步分离.在这种情况下,模型是棋盘,棋盘是一个方形阵列,可以是空的,或者包含几种两种颜色中的一种.视图是如何绘制板以将其呈现给用户.这里的代码混合了模型和视图,因为片段本身在模型中由用于在视图中向用户呈现它们的实际字符串表示.认识到这种抽象存在是很重要的,因为你继续实现比仅仅显示电路板和移动部件更复杂的算法.

第三,if使用不同常量重复相同测试的长链语句几乎总是易于转换为更紧凑(和更高效)的表达式.

if ((loc1 == "C") or (loc1 == "c")) then loc1=3 end为A到H中的每一个写.这可以通过两种方式简化.首先,折叠输入大小写,以便测试单个字符大小写,然后使用string.find一次性从字母转换为整数.所以8个if-then语句的整个块可以写成

loc1 = ("abcdefgh"):find(loc1:lower())
Run Code Online (Sandbox Code Playgroud)

这将使loc1成为1到8之间的整数,或者nil如果该字符不在A到H的范围内.

第四,io.write可以采用多个参数,这些参数将连续输出而没有任何分隔符(不像print在参数之间插入选项卡和最后的换行符).所以那些长表达式chessBoard()可以用简单的逗号替换所有的字符串连接.这不仅更快,而且还可以防止为垃圾收集器创建大量垃圾,最终处理来自完成表达式所需的所有临时字符串的垃圾.


gre*_*olf 5

input = io.read("*line") 
loc1 = string.sub(input, 1, 1) 
loc2 = string.sub(input, 2, 2)
Run Code Online (Sandbox Code Playgroud)

您正在以字符串形式读取输入,但您的emptyspot表使用数字索引作为键.尝试修复它:

loc2 = tonumber(string.sub(input, 2, 2))
Run Code Online (Sandbox Code Playgroud)