我正在Ruby中实现gomoku游戏,这是在15x15板上玩的井字游戏的变体,并且第一个在水平,垂直或对角线上放置5个O或X的玩家获胜 .
首先,我将Matrix分配给一个变量并用0到224之间的数字填充它,所以没有重复,我可以在以后计算它们
gomoku = Matrix.zero(15)
num = 0
15.times do |i|
15.times do |j|
gomoku[i, j] = num
num += 1
end
end
然后球员轮流,每转一圈,我用方法 win?
检查胜利
def win? matrix
15.times do |i|
return true if matrix.row_vectors[i].chunk{|e| e}.map{|_, v| v.length}.max > 4 # thanks to sawa for this way of counting adjacent duplicates
return true if matrix.column_vectors[i].chunk{|e| e}.map{|_, v| v.length}.max > 4
end
return false
end
我知道,我可能做错了,但我的问题不是那样,尽管建议值得欢迎 . 问题在于对角行 . 我不知道如何计算对角行中的重复项
1 回答
有了这个,你可以应用sawa给你的相同测试 .
编辑:这是做什么的
在观察对角线的时候,'s two kinds: going down-left, and going down-right. Let'目前专注于右下角 . 在15x15矩阵中,有29个右下对角线:一个从第一行的每个元素开始,一个从第一列的每个元素开始,但注意不要计算从
[0, 0]
开始两次的那个 . 但是一些对角线太短,所以我们只想从前11行和列开始(因为其他的将比5个元素短) . 这就是前三行的作用:[i, j]
将是[10, 0]
,[9, 0]
...[0, 0]
,[0, 1]
,...[0, 10]
.d
是从该位置开始的对角线的长度 . 然后,d.times.map { |k| gomoku[i + k, j + k] }
收集该对角线中的所有元素 . 假设我们正在[10, 0]
上工作:d
是5
,所以我们有[10, 0]
,[11, 1]
,[12, 2]
,[13, 3]
,[14, 4]
;我们在列表中的那些坐标处收集值 . 同时,我们'll also work on a down-left diagonal; that'是另一个map
的工作,它翻转了一个坐标 . 因此,内部块将返回两个元素阵列,即两个对角线,一个左下,一个右下 .flat_map
将负责迭代,同时压缩双元素数组,以便我们得到一个大的对角线数组,而不是对角线的两元素数组 .