Data structures 紧凑的方式表示所有有效的“;“行”;在tic-tac-toe网格中

Data structures 紧凑的方式表示所有有效的“;“行”;在tic-tac-toe网格中,data-structures,mapreduce,tic-tac-toe,Data Structures,Mapreduce,Tic Tac Toe,作为练习,我一直在用多种语言编写tic-tac-toe,其中一种模式是,我为定义有效的获胜行而提出的每一种表示都是令人失望的硬编码。它们一般分为两类: 首先,电路板表示为一维或二维数组,行由位置的三元组显式定义(数字为空格): 这具有非魔法清晰的优点,但似乎冗长 另一种方法是使用数组数组并映射+减少行。稍微好一点,但并不能让我完全理解: board = [[nil, 1, nil], [nil, -1, nil], [nil, nil, 1]] def diag(x,y,z) [board

作为练习,我一直在用多种语言编写tic-tac-toe,其中一种模式是,我为定义有效的获胜行而提出的每一种表示都是令人失望的硬编码。它们一般分为两类:

首先,电路板表示为一维或二维数组,行由位置的三元组显式定义(数字为空格):

这具有非魔法清晰的优点,但似乎冗长

另一种方法是使用数组数组并映射+减少行。稍微好一点,但并不能让我完全理解:

board = [[nil, 1, nil], [nil, -1, nil], [nil, nil, 1]]

def diag(x,y,z)
  [board[x/3,x%3], board[y/3,y%3], board[z/3,z%3]]
end

def winner
  rows = board + board.transpose << diag(0,4,8) << diag(2,4,6)
  rows.map { |r| r.reduce(:&) }.reduce { |m,c| m || c }
end
board=[[nil,1,nil],[nil,-1,nil],[nil,nil,1]]
def诊断(x、y、z)
[板[x/3,x%3],板[y/3,y%3],板[z/3,z%3]]
结束
def赢家

rows=board+board.transpose更快、更紧凑的系统是每平方使用一位。当前位置可以保留在两个变量中:X保留所有“X”标记,O保留所有“O”标记。例如,可以对9个正方形进行编码

 1   2   4
 8  16  32
64 128 256
使用这种编码,第一行是
1+2+4=7
,上/左->下/右对角线是
1+16+256=273

如果((X&7)==7)
,则检查第一行的X是否为赢,其他检查类似,但数字不同,而不是7。完整的胜利检查程序变成

def winner(p):
    for m in (7, 56, 448, 73, 146, 292, 273, 84):
        if p & m == m: return True
    return False

一个更快更紧凑的系统是每平方使用一位。当前位置可以保留在两个变量中:X保留所有“X”标记,O保留所有“O”标记。例如,可以对9个正方形进行编码

 1   2   4
 8  16  32
64 128 256
使用这种编码,第一行是
1+2+4=7
,上/左->下/右对角线是
1+16+256=273

如果((X&7)==7),则检查第一行的X是否为赢,其他检查类似,但数字不同,而不是7。完整的胜利检查程序变成

def winner(p):
    for m in (7, 56, 448, 73, 146, 292, 273, 84):
        if p & m == m: return True
    return False

嗯,很有趣。在该方案中放置移动时,我也可以使用
board |=2**space
。检查占用的空间将变为
xboard&oboard&2**space
。不确定我会称之为非模糊:)但它确实很紧凑。嗯,很有趣。在该方案中放置移动时,我也可以使用
board |=2**space
。检查占用的空间将变为
xboard&oboard&2**space
。我不确定我会称之为非模糊:)但它确实很紧凑。