Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 连接4个对角Win Check_Arrays_Ruby_Multidimensional Array - Fatal编程技术网

Arrays 连接4个对角Win Check

Arrays 连接4个对角Win Check,arrays,ruby,multidimensional-array,Arrays,Ruby,Multidimensional Array,我正在测试Ruby Connect 4游戏中的对角胜利。我一直在使用硬编码2D阵列进行测试: grid_array = [ ["B", ".", ".", ".", ".", ".", ".", "."], [".", "B", ".", ".", ".", ".", ".", "."], [".", ".", "B", ".", ".", ".", ".", "."], [".", ".", ".", "B", ".", ".", ".", "."], [".", ".", ".", "X",

我正在测试Ruby Connect 4游戏中的对角胜利。我一直在使用硬编码2D阵列进行测试:

grid_array = [
["B", ".", ".", ".", ".", ".", ".", "."],
[".", "B", ".", ".", ".", ".", ".", "."],
[".", ".", "B", ".", ".", ".", ".", "."],
[".", ".", ".", "B", ".", ".", ".", "."],
[".", ".", ".", "X", "M", ".", ".", "."],
[".", ".", ".", ".", "X", "M", ".", "."],
[".", ".", ".", ".", ".", "X", "M", "."],
[".", ".", ".", ".", ".", ".", "X", "M"]
]
该方法的这个内循环正确地识别出“M”或“B”分别是赢家,但是当我试图通过列或行移动对角线检查时,我被卡住了,例如,外循环选择“X”作为赢家值

def nw_diagonal_win (playing_board)
  row = 7
  while row < playing_board.size && row >= 0

    row = 7
    column = 7
    piece_count = 0

    while (row < playing_board.size && column < playing_board[row].size && column >= 0)

      if playing_board[row][column] == 'M'
        piece_count += 1

        if piece_count == 4
          puts "Player is the winner in a diagonal!"
        end

        puts piece_count.inspect

      else
        piece_count = 0
        puts "No winner."
      end

      row += 1
      column += 1
    end

    row -= 1
  end
end

我在玩一个类似的网格,为了填字游戏,我想出了一个得到对角线的方法。我做了一些改动以适应connect 4。 这不是一个完整的答案,但我希望它能有所帮助

首先,我想将网格映射为坐标:

grid_map = grid_array.map.with_index{ |line, y| line.map.map.with_index { |e, x| [e, x, y] } }
然后用两种方法来恢复矩阵的所有对角线,无论如何,应该有一个更好的解决方案

第一个方向仅取对角线的一半:

def half_diagonals(matrix)
  max_y = matrix[0].size
  max_x = matrix.size
  diagonals = []
  (0...max_x).each do |x_start|
    x = x_start
    y = 0
    diagonal = [matrix[x][y]]
    while  x < max_x - 1 and y < max_y - 1 do
      x += 1
      y += 1
      diagonal << matrix[x][y]
    end
    diagonals << diagonal
  end
  # only in diagonals with at least four spots
  return diagonals.select{ |d| d.size >= 4 }
end
现在,需要检查每个对角线是否有赢家,因此请定义一种方法:

def check_diagonal(diagonal, empty_spot = ".")
  check = diagonal.chunk_while { |s1, s2| s1[0] == s2[0] }.map { |e| [e.count, e[0][0], e.map{ |ee| ee[1..-1]}] }
  return detected = check.detect { |e| e[0] == 4 and e[1] != empty_spot }
  # it returns the first four detected
end
现在调用grid_map上的方法,以获得连接的四个的计数、颜色和坐标:

diagonals(grid_map).map { |diagonal| check_diagonal(diagonal) }.compact
#=> [[4, "B", [[0, 0], [1, 1], [2, 2], [3, 3]]], [4, "X", [[3, 4], [4, 5], [5, 6], [6, 7]]]]

由于check.detect,四个M没有返回。

我在玩一个类似的网格,用于填字游戏,并想出了一种获得对角线的方法。我做了一些改动以适应connect 4。 这不是一个完整的答案,但我希望它能有所帮助

首先,我想将网格映射为坐标:

grid_map = grid_array.map.with_index{ |line, y| line.map.map.with_index { |e, x| [e, x, y] } }
然后用两种方法来恢复矩阵的所有对角线,无论如何,应该有一个更好的解决方案

第一个方向仅取对角线的一半:

def half_diagonals(matrix)
  max_y = matrix[0].size
  max_x = matrix.size
  diagonals = []
  (0...max_x).each do |x_start|
    x = x_start
    y = 0
    diagonal = [matrix[x][y]]
    while  x < max_x - 1 and y < max_y - 1 do
      x += 1
      y += 1
      diagonal << matrix[x][y]
    end
    diagonals << diagonal
  end
  # only in diagonals with at least four spots
  return diagonals.select{ |d| d.size >= 4 }
end
现在,需要检查每个对角线是否有赢家,因此请定义一种方法:

def check_diagonal(diagonal, empty_spot = ".")
  check = diagonal.chunk_while { |s1, s2| s1[0] == s2[0] }.map { |e| [e.count, e[0][0], e.map{ |ee| ee[1..-1]}] }
  return detected = check.detect { |e| e[0] == 4 and e[1] != empty_spot }
  # it returns the first four detected
end
现在调用grid_map上的方法,以获得连接的四个的计数、颜色和坐标:

diagonals(grid_map).map { |diagonal| check_diagonal(diagonal) }.compact
#=> [[4, "B", [[0, 0], [1, 1], [2, 2], [3, 3]]], [4, "X", [[3, 4], [4, 5], [5, 6], [6, 7]]]]

由于check.detect的原因,四个M没有返回。

如果存在获胜对角线,则起始位置必须在第[0-3]行和第[0-3]列的范围内。任何从左上角方框外开始的对角线都没有足够的右下位置,无法连续四个

因此,实际上需要一个while行<4和while列<4的嵌套循环

对于每个行-列组合,假设该值不是。然后,您可以将您的计件计数设置为1,然后执行计数器1到3,并检查playing_board[行+计数器][列+计数器]是否等于playing_board[行][列]的值,如果是,则增加您的计件计数


在计数器1到3循环之外,如果计件数为4,则有一个赢家。

如果有赢家对角线,则起始位置必须在第[0-3]行和第[0-3]列的范围内。任何从左上角方框外开始的对角线都没有足够的右下位置,无法连续四个

因此,实际上需要一个while行<4和while列<4的嵌套循环

对于每个行-列组合,假设该值不是。然后,您可以将您的计件计数设置为1,然后执行计数器1到3,并检查playing_board[行+计数器][列+计数器]是否等于playing_board[行][列]的值,如果是,则增加您的计件计数

在计数器1到3的循环外,如果计件数为4,则您有一个赢家。

假设我们有

grid = [
  %w| . . . . . . |,
  %w| . . . w w . |,
  %w| . . . w b . |,
  %w| b . w . b . |,
  %w| w w . w b b |,
  %w| b w b b w b |
]
  #=> [[".", ".", ".", ".", ".", "."], 
  #    [".", ".", ".", "w", "w", "."],
  #    [".", ".", ".", "w", "b", "."],
  #    ["b", ".", "w", ".", "b", "."],
  #    ["w", "w", ".", "w", "b", "b"],
  #    ["b", "w", "b", "b", "w", "b"]]
没错,这只是6x6,但解决方案也一样

首先,由于数组很小,我们不必担心计算效率,所以我们可以专注于代码效率

让我们首先检查每行中是否有四个

检查行

如果一行中有四个w,则此方法返回w;如果一行中有四个b,则返回b;否则返回nil

对于arr=grid,我们发现没有一行在一行中包含四个“b”或“w”

four_in_a_row_by_row(grid)
  #=> nil
four_in_a_row_by_row(arr)
  #=> nil
four_in_a_row_by_row(arr1)
  #=> "w"
请注意,此方法不要求arr.size==grid.size,也不要求arr的所有元素大小相同。它只是检查一行中是否有任何元素有四个“ws”或四个“bs”。这将在以后具有重要意义

例如,传递给块的arr的最后一个元素如下所示

row =  ["b", "w", "b", "b", "w", "b"]
然后我们计算

enum0 = row.each_cons(4)
  #=> #<Enumerator: ["b", "w", "b", "b", "w", "b"]:each_cons(4)>
将第一个元素传递给块,并进行以下计算

    a = enum1.next
    u = a.uniq
    u.size == 1
因此,我们不需要先计算a。enum1的其余两个元素被传递到块,并为每个元素计算nil,这表示在最后一行的“ws”或“bs”行中没有四个元素

我们快完成了

等等,你说,我们只检查了行!还有柱子和所有的对角线!请继续关注

检查列

这个很简单

four_in_a_row_by_row(grid.transpose)
  #=> nil
这里

检查从左上到右下的对角线

这里我们需要做的就是构造一个包含对角线的数组arr,然后在数组arr中应用四个。首先确定包含第一列中长度为4或更大的元素的对角线。这包括以下对角线

[grid[0][0], grid[1][1], grid[2][2], grid[3][3], grid[4][4],grid[5][5]] 
[grid[1][0], grid[2][1], grid[3][2], grid[4][3], grid[5][4]] 
[grid[2][0], grid[3][1], grid[4][2], grid[5][3]] 
[grid[0][1], grid[1][2], grid[2][3], grid[3][4], grid[4][5]] 
[grid[0][2], grid[1][3], grid[2][4], grid[3][5]] 

不必考虑在第一列中包含元素的其余对角线,因为它们包含少于4个元素:

[grid[3][0], grid[4][1], grid[5][2]] 
[grid[4][0], grid[5][1]] 
[grid[5][0]] 
我们可以得到前三条对角线,如下所示

(0..grid.size-4).map { |i| (0..grid.size-1-i).map { |j| grid[i+j][j] } }
  #=> [[".", ".", ".", ".", "b", "b"],
  #    [".", ".", "w", "w", "w"],
  #    [".", ".", ".", "b"]]
(1..grid.first.size-4).map do |j|
  (0..grid.size-j-1).map { |i| grid[i][j+i] }
end
  #=> [[".", ".", "w", "b", "b"],
  #    [".", "w", "b", "."]]
def diagonals(grid)
  (0..grid.size-4).map do |i|
    (0..grid.size-1-i).map { |j| grid[i+j][j] }
  end.concat((1..grid.first.size-4).map do |j|
    (0..grid.size-j-1).map { |i| grid[i][j+i] }
  end)
end
def four_in_a_row_by_row(arr)
  row = arr.find { |row| four_in_a_row(row) }
  row.nil? ? nil : four_in_a_row(row)
end
类似地,标识包含第一行中元素的对角线(网格[0][0]除外),其长度为4或更大。那些是对角线

[grid[0][0], grid[1][1], grid[2][2], grid[3][3], grid[4][4],grid[5][5]] 
[grid[1][0], grid[2][1], grid[3][2], grid[4][3], grid[5][4]] 
[grid[2][0], grid[3][1], grid[4][2], grid[5][3]] 
[grid[0][1], grid[1][2], grid[2][3], grid[3][4], grid[4][5]] 
[grid[0][2], grid[1][3], grid[2][4], grid[3][5]] 
除网格[0][0]之外,第一行中包含元素的其余对角线包含的元素少于4个。我们得到的对角线如下

(0..grid.size-4).map { |i| (0..grid.size-1-i).map { |j| grid[i+j][j] } }
  #=> [[".", ".", ".", ".", "b", "b"],
  #    [".", ".", "w", "w", "w"],
  #    [".", ".", ".", "b"]]
(1..grid.first.size-4).map do |j|
  (0..grid.size-j-1).map { |i| grid[i][j+i] }
end
  #=> [[".", ".", "w", "b", "b"],
  #    [".", "w", "b", "."]]
def diagonals(grid)
  (0..grid.size-4).map do |i|
    (0..grid.size-1-i).map { |j| grid[i+j][j] }
  end.concat((1..grid.first.size-4).map do |j|
    (0..grid.size-j-1).map { |i| grid[i][j+i] }
  end)
end
def four_in_a_row_by_row(arr)
  row = arr.find { |row| four_in_a_row(row) }
  row.nil? ? nil : four_in_a_row(row)
end
因此,我们可以得到所有对角线的数组,如下所示

(0..grid.size-4).map { |i| (0..grid.size-1-i).map { |j| grid[i+j][j] } }
  #=> [[".", ".", ".", ".", "b", "b"],
  #    [".", ".", "w", "w", "w"],
  #    [".", ".", ".", "b"]]
(1..grid.first.size-4).map do |j|
  (0..grid.size-j-1).map { |i| grid[i][j+i] }
end
  #=> [[".", ".", "w", "b", "b"],
  #    [".", "w", "b", "."]]
def diagonals(grid)
  (0..grid.size-4).map do |i|
    (0..grid.size-1-i).map { |j| grid[i+j][j] }
  end.concat((1..grid.first.size-4).map do |j|
    (0..grid.size-j-1).map { |i| grid[i][j+i] }
  end)
end
def four_in_a_row_by_row(arr)
  row = arr.find { |row| four_in_a_row(row) }
  row.nil? ? nil : four_in_a_row(row)
end
我们看到没有一条对角线包含四条直线

four_in_a_row_by_row(grid)
  #=> nil
four_in_a_row_by_row(arr)
  #=> nil
four_in_a_row_by_row(arr1)
  #=> "w"
检查从左到右上方的前对角线

我们可以进行与计算对角线相同的推理,但由于计算效率在这里并不重要,有一种更简单的方法:计算网格旋转90度获得的阵列对角线

def rotate90(grid)
  ncols = grid.first.size
  grid.each_index.with_object([]) do |i,a|
    a << ncols.times.map { |j| grid[j][ncols-1-i] }
  end
end
我们看到,没有一条前对角线包含四个连续的元素

four_in_a_row_by_row(grid)
  #=> nil
four_in_a_row_by_row(arr)
  #=> nil
four_in_a_row_by_row(arr1)
  #=> "w"
把它们放在一起

四行中四行的交替计算

一行一行地写四个字母,如下所示

(0..grid.size-4).map { |i| (0..grid.size-1-i).map { |j| grid[i+j][j] } }
  #=> [[".", ".", ".", ".", "b", "b"],
  #    [".", ".", "w", "w", "w"],
  #    [".", ".", ".", "b"]]
(1..grid.first.size-4).map do |j|
  (0..grid.size-j-1).map { |i| grid[i][j+i] }
end
  #=> [[".", ".", "w", "b", "b"],
  #    [".", "w", "b", "."]]
def diagonals(grid)
  (0..grid.size-4).map do |i|
    (0..grid.size-1-i).map { |j| grid[i+j][j] }
  end.concat((1..grid.first.size-4).map do |j|
    (0..grid.size-j-1).map { |i| grid[i][j+i] }
  end)
end
def four_in_a_row_by_row(arr)
  row = arr.find { |row| four_in_a_row(row) }
  row.nil? ? nil : four_in_a_row(row)
end
如果首选,第0行?无:行中的四个可以替换为

four_in_a_row(row) unless row.nil?
假设我们有

grid = [
  %w| . . . . . . |,
  %w| . . . w w . |,
  %w| . . . w b . |,
  %w| b . w . b . |,
  %w| w w . w b b |,
  %w| b w b b w b |
]
  #=> [[".", ".", ".", ".", ".", "."], 
  #    [".", ".", ".", "w", "w", "."],
  #    [".", ".", ".", "w", "b", "."],
  #    ["b", ".", "w", ".", "b", "."],
  #    ["w", "w", ".", "w", "b", "b"],
  #    ["b", "w", "b", "b", "w", "b"]]
没错,这只是6x6,但解决方案也一样

首先,由于数组很小,我们不必担心计算效率,所以我们可以专注于代码效率

让我们首先检查每行中是否有四个

检查行

如果一行中有四个w,则此方法返回w;如果一行中有四个b,则返回b;否则返回nil

对于arr=grid,我们发现没有一行在一行中包含四个“b”或“w”

four_in_a_row_by_row(grid)
  #=> nil
four_in_a_row_by_row(arr)
  #=> nil
four_in_a_row_by_row(arr1)
  #=> "w"
请注意,此方法不要求arr.size==grid.size,也不要求arr的所有元素大小相同。它只是检查一行中是否有任何元素有四个“ws”或四个“bs”。这将在以后具有重要意义

例如,传递给块的arr的最后一个元素如下所示

row =  ["b", "w", "b", "b", "w", "b"]
然后我们计算

enum0 = row.each_cons(4)
  #=> #<Enumerator: ["b", "w", "b", "b", "w", "b"]:each_cons(4)>
将第一个元素传递给块,并进行以下计算

    a = enum1.next
    u = a.uniq
    u.size == 1
因此,我们不需要先计算a。enum1的其余两个元素被传递到块,并为每个元素计算nil,这表示在最后一行的“ws”或“bs”行中没有四个元素

我们快完成了

等等,你说,我们只检查了行!还有柱子和所有的对角线!请继续关注

检查列

这个很简单

four_in_a_row_by_row(grid.transpose)
  #=> nil
这里

检查从左上到右下的对角线

这里我们需要做的就是构造一个包含对角线的数组arr,然后在数组arr中应用四个。首先确定包含第一列中长度为4或更大的元素的对角线。这包括以下对角线

[grid[0][0], grid[1][1], grid[2][2], grid[3][3], grid[4][4],grid[5][5]] 
[grid[1][0], grid[2][1], grid[3][2], grid[4][3], grid[5][4]] 
[grid[2][0], grid[3][1], grid[4][2], grid[5][3]] 
[grid[0][1], grid[1][2], grid[2][3], grid[3][4], grid[4][5]] 
[grid[0][2], grid[1][3], grid[2][4], grid[3][5]] 

不必考虑在第一列中包含元素的其余对角线,因为它们包含少于4个元素:

[grid[3][0], grid[4][1], grid[5][2]] 
[grid[4][0], grid[5][1]] 
[grid[5][0]] 
我们可以得到前三条对角线,如下所示

(0..grid.size-4).map { |i| (0..grid.size-1-i).map { |j| grid[i+j][j] } }
  #=> [[".", ".", ".", ".", "b", "b"],
  #    [".", ".", "w", "w", "w"],
  #    [".", ".", ".", "b"]]
(1..grid.first.size-4).map do |j|
  (0..grid.size-j-1).map { |i| grid[i][j+i] }
end
  #=> [[".", ".", "w", "b", "b"],
  #    [".", "w", "b", "."]]
def diagonals(grid)
  (0..grid.size-4).map do |i|
    (0..grid.size-1-i).map { |j| grid[i+j][j] }
  end.concat((1..grid.first.size-4).map do |j|
    (0..grid.size-j-1).map { |i| grid[i][j+i] }
  end)
end
def four_in_a_row_by_row(arr)
  row = arr.find { |row| four_in_a_row(row) }
  row.nil? ? nil : four_in_a_row(row)
end
类似地,标识包含第一行中元素的对角线(网格[0][0]除外),其长度为4或更大。那些是对角线

[grid[0][0], grid[1][1], grid[2][2], grid[3][3], grid[4][4],grid[5][5]] 
[grid[1][0], grid[2][1], grid[3][2], grid[4][3], grid[5][4]] 
[grid[2][0], grid[3][1], grid[4][2], grid[5][3]] 
[grid[0][1], grid[1][2], grid[2][3], grid[3][4], grid[4][5]] 
[grid[0][2], grid[1][3], grid[2][4], grid[3][5]] 
除网格[0][0]之外,第一行中包含元素的其余对角线包含的元素少于4个。我们得到的对角线如下

(0..grid.size-4).map { |i| (0..grid.size-1-i).map { |j| grid[i+j][j] } }
  #=> [[".", ".", ".", ".", "b", "b"],
  #    [".", ".", "w", "w", "w"],
  #    [".", ".", ".", "b"]]
(1..grid.first.size-4).map do |j|
  (0..grid.size-j-1).map { |i| grid[i][j+i] }
end
  #=> [[".", ".", "w", "b", "b"],
  #    [".", "w", "b", "."]]
def diagonals(grid)
  (0..grid.size-4).map do |i|
    (0..grid.size-1-i).map { |j| grid[i+j][j] }
  end.concat((1..grid.first.size-4).map do |j|
    (0..grid.size-j-1).map { |i| grid[i][j+i] }
  end)
end
def four_in_a_row_by_row(arr)
  row = arr.find { |row| four_in_a_row(row) }
  row.nil? ? nil : four_in_a_row(row)
end
因此,我们可以得到所有对角线的数组,如下所示

(0..grid.size-4).map { |i| (0..grid.size-1-i).map { |j| grid[i+j][j] } }
  #=> [[".", ".", ".", ".", "b", "b"],
  #    [".", ".", "w", "w", "w"],
  #    [".", ".", ".", "b"]]
(1..grid.first.size-4).map do |j|
  (0..grid.size-j-1).map { |i| grid[i][j+i] }
end
  #=> [[".", ".", "w", "b", "b"],
  #    [".", "w", "b", "."]]
def diagonals(grid)
  (0..grid.size-4).map do |i|
    (0..grid.size-1-i).map { |j| grid[i+j][j] }
  end.concat((1..grid.first.size-4).map do |j|
    (0..grid.size-j-1).map { |i| grid[i][j+i] }
  end)
end
def four_in_a_row_by_row(arr)
  row = arr.find { |row| four_in_a_row(row) }
  row.nil? ? nil : four_in_a_row(row)
end
我们看到没有一条对角线包含四条直线

four_in_a_row_by_row(grid)
  #=> nil
four_in_a_row_by_row(arr)
  #=> nil
four_in_a_row_by_row(arr1)
  #=> "w"
检查从左到右上方的前对角线

我们可以进行与计算对角线相同的推理,但由于计算效率在这里并不重要,有一种更简单的方法:计算网格旋转90度获得的阵列对角线

def rotate90(grid)
  ncols = grid.first.size
  grid.each_index.with_object([]) do |i,a|
    a << ncols.times.map { |j| grid[j][ncols-1-i] }
  end
end
我们看到,没有一条前对角线包含四个连续的元素

four_in_a_row_by_row(grid)
  #=> nil
four_in_a_row_by_row(arr)
  #=> nil
four_in_a_row_by_row(arr1)
  #=> "w"
把它们放在一起

四行中四行的交替计算

一行一行地写四个字母,如下所示

(0..grid.size-4).map { |i| (0..grid.size-1-i).map { |j| grid[i+j][j] } }
  #=> [[".", ".", ".", ".", "b", "b"],
  #    [".", ".", "w", "w", "w"],
  #    [".", ".", ".", "b"]]
(1..grid.first.size-4).map do |j|
  (0..grid.size-j-1).map { |i| grid[i][j+i] }
end
  #=> [[".", ".", "w", "b", "b"],
  #    [".", "w", "b", "."]]
def diagonals(grid)
  (0..grid.size-4).map do |i|
    (0..grid.size-1-i).map { |j| grid[i+j][j] }
  end.concat((1..grid.first.size-4).map do |j|
    (0..grid.size-j-1).map { |i| grid[i][j+i] }
  end)
end
def four_in_a_row_by_row(arr)
  row = arr.find { |row| four_in_a_row(row) }
  row.nil? ? nil : four_in_a_row(row)
end
如果首选,第0行?无:行中的四个可以替换为

four_in_a_row(row) unless row.nil?

我提出了一个在测试中似乎有效的解决方案。它从右下角到左上角,从8x8网格中第7行第7列开始。我还创建了从左下角到右上角的前对角线

我已经测试了一段时间,没有发现任何错误,但是我很想知道是否有人在上面戳洞

我非常感谢你们所有人——你们的解决方案和建议让我走到了这一步

def nw_diagonal_win (playing_board, player_piece)
    row = 7
    column = 7
    piece_count = 0
    while row < playing_board.size && row >= 0 && column < playing_board[row].size && column >= 0
      if playing_board[row][column] == player_piece
        piece_count += 1
        column -= 1
        row -= 1
      else
        piece_count = 0
        column -= 1
        if column < 3
          row -= 1
          column = 7
        end
      end
        if piece_count == 4
          puts "Player #{player_piece} is the winner in a diagonal!"
        end
    end
end

我提出了一个在测试中似乎有效的解决方案。它从右下角到左上角,从8x8网格中第7行第7列开始。我还创建了从左下角到右上角的前对角线

我已经测试了一段时间,没有发现任何错误,但是我很想知道是否有人在上面戳洞

我非常感谢你们所有人——你们的解决方案和建议让我走到了这一步

def nw_diagonal_win (playing_board, player_piece)
    row = 7
    column = 7
    piece_count = 0
    while row < playing_board.size && row >= 0 && column < playing_board[row].size && column >= 0
      if playing_board[row][column] == player_piece
        piece_count += 1
        column -= 1
        row -= 1
      else
        piece_count = 0
        column -= 1
        if column < 3
          row -= 1
          column = 7
        end
      end
        if piece_count == 4
          puts "Player #{player_piece} is the winner in a diagonal!"
        end
    end
end

对于位置i处的元件,j设t=i-j。那么位置p,q处的元素是

在同一主对角线上,当且仅当p-q=t。变化的t产生所有的主对角线。除p+q=t外,每个前对角线上的元素具有类似的属性。请定义什么是“赢家”。很多读者,包括我在内,从来没有听说过这个游戏。你应该写一个函数,计算对角线上的点数,然后为每个对角线调用辅助函数。在n*n板上有2*n+n-1个对角线-两个方向,从第一行和第一行的每个元素开始column@CarySwoveland ... 我希望它到处都知道。。。或者至少是无限制的纸质版本。谢谢你们的帮助。如果我有任何澄清问题,我会回到评论中。@CarySwoveland我理解概念列7-第7行=0,因此对角线上的所有点都等于0 4,4;5,5等等,我只是不明白如何实现它。对于位置I处的元素,j让t=I-j。那么,位置p,q处的元素位于同一主对角线上,当且仅当p-q=t。变化的t产生所有的主对角线。除p+q=t外,每个前对角线上的元素具有类似的属性。请定义什么是“赢家”。很多读者,包括我在内,从来没有听说过这个游戏。你应该写一个函数,计算对角线上的点数,然后为每个对角线调用辅助函数。在n*n板上有2*n+n-1个对角线-两个方向,从第一行和第一行的每个元素开始column@CarySwoveland ... 我希望它到处都知道。。。或者至少是无限制的纸质版本。谢谢你们的帮助。如果我有任何澄清问题,我会回到评论中。@CarySwoveland我理解概念列7-第7行=0,因此对角线上的所有点都等于0 4,4;5,5等等,我只是不明白如何实现。我有点模糊,但我想我明白你的意思,史蒂夫。我写了一些代码,并将其添加到上述问题的末尾。你介意看一下吗?我在下面加了一个我想到的答案。它从r7、c7开始,从右下角移动到左上角。你认为有什么紧迫的问题吗?我已经测试了一段时间,我已经能够解决我遇到的问题。我认为你添加到问题中的代码不会起作用。我认为,如果工件数量增加,该列不需要增加。但是我看到你从卡里那里得到了一个答案,这在银行里通常是值得的。我有点模糊,但我想我理解你的意思,史蒂夫。我写了一些代码,并将其添加到上述问题的末尾。你介意看一下吗?我在下面加了一个我想到的答案。它从r7、c7开始,从右下角移动到左上角。你认为有什么紧迫的问题吗?我已经测试了一段时间,我已经能够解决我遇到的问题。我认为你添加到问题中的代码不会起作用。我认为,如果工件数量增加,该列不需要增加。但是我看到你从卡里那里得到了一个答案,而且在银行里这通常是值得的。谢谢!我真的对这个解决方案感兴趣,并将在这个项目之外更多地使用它!非常感谢。我真的对这个解决方案感兴趣,并将在这个项目之外更多地使用它!谢谢你的详细解释!我只是在学习Ruby,所以其中一些我不太理解,但我所能理解的帮助我想出了一个可行的解决方案。我已经添加了我的解决方案作为对此帖子的回答。如果你能给我任何建议或挖洞的话,我将不胜感激。要了解更多信息,物理玩具Connect4要求您将令牌插入顶部,然后重力将其降至最低位置。所以[4][2]位置的点和[3][2]位置的标记在物理上永远不会发生,除非,我猜,标记在下落时卡住了,这是我从未见过的happen@Christian,我做了编辑以澄清我的答案。如果回答了您的问题,请告诉我。0..2.map返回一个由三个元素组成的数组,映射为0、1和2。例如,考虑1。1被传递到块{| i | 0..grid.size-1-i.map{| j | grid[i+j][j]},并且块变量i被设置为1。因此,i=1的块计算是0..grid.size-1-1.map{j | grid[1+j][j]},它减少到0..4.map{j | grid[1+j][j]},它等于[,,w,w,w],因此i=1被映射到该5元素数组。对i=0和i=2进行了类似的计算。明白了吗?太好了,谢谢你花时间写这封信。在你的回答和评论之间,我只想抓住它:谢谢你的超级详细的解释!我只是在学习Ruby,所以其中一些我不太理解,但我所能理解的帮助我想出了一个可行的解决方案。我已经添加了我的解决方案作为对此帖子的回答。如果你能给我任何建议或挖洞的话,我将不胜感激。要了解更多信息,物理玩具Connect4要求您将代币插入顶部,然后重力将其放置在最低位置
叛乱。所以[4][2]位置的点和[3][2]位置的标记在物理上永远不会发生,除非,我猜,标记在下落时卡住了,这是我从未见过的happen@Christian,我做了编辑以澄清我的答案。如果回答了您的问题,请告诉我。0..2.map返回一个由三个元素组成的数组,映射为0、1和2。例如,考虑1。1被传递到块{| i | 0..grid.size-1-i.map{| j | grid[i+j][j]},并且块变量i被设置为1。因此,i=1的块计算是0..grid.size-1-1.map{j | grid[1+j][j]},它减少到0..4.map{j | grid[1+j][j]},它等于[,,w,w,w],因此i=1被映射到该5元素数组。对i=0和i=2进行了类似的计算。明白了吗?太好了,谢谢你花时间写这封信。在你的回答和评论之间,我只是想抓住它: