【问题标题】:How to make a general method to check for winners in Tic-Tac-Toe如何制定通用方法来检查井字游戏中的获胜者
【发布时间】:2016-10-03 18:22:38
【问题描述】:

我用 Ruby 制作了一款井字游戏。下面的方法在垂直列中检查获胜者。

我怎样才能使这种方法可以应用于不同尺寸的电路板,如 4x4、6x6?

def vertical_check(array)

  result = nil

  if (array[0][0] == "X" && array[1][0] == "X" && array[2][0] == "X") ||
    (array[0][1] == "X" && array[1][1] == "X" && array[2][1] == "X") ||
    (array[0][2] == "X" && array[1][2] == "X" && array[2][2] == "X")

    result = "X"

  elsif (array[0][0] == "O" && array[1][0] == "O" && array[2][0] == "O") ||
    (array[0][1] == "O" && array[1][1] == "O" && array[2][1] == "O") ||
    (array[0][2] == "O" && array[1][2] == "O" && array[2][2] == "O")

    result = "O"
  else
    result = nil
  end
  return result
end

以下是失败的尝试:

def vertical_check_x(array)

  result = nil

  index = 0
  index2 = 0

  until result != nil || index == array.length

    while array[index][index2] == "X"
      index += 1
    end

    if index == array.length
      result = "X"
    else
      result = nil
      index = array.length
    end

    index2 += 1
  end

  return result
end

def vertical_check_o(array)

  result = nil

  index = 0
  index2 = 0
  until result != nil || index == array.length

    while array[index][index2] == "O"
      index += 1
    end

    if index -1 == array.length
      result = "O"
    else
      result = nil
      index = array.length
    end

    index2 += 1
  end

  return result
end

def vertical_check(array)

  result = vertical_check_x(array)

  if result == nil
    result = vertical_check_o(array)
  end

  return result
end

【问题讨论】:

  • 你注意到数组索引的模式了吗?
  • 您的代码格式需要帮助。请努力格式化您的问题以提高可读性。它不仅可以帮助我们回答您,还可以帮助那些在未来寻找类似解决方案的人,这是 SO 的主要目标。

标签: ruby-on-rails ruby methods tic-tac-toe sos


【解决方案1】:

要快速找到给定数组中的获胜者,请计算唯一元素的数量,确认只有一个唯一元素以及是否只有XO

def winner arr
  return arr[0] if arr.uniq.length == 1 && ['X', 'O'].include?(arr[0])
  nil
end

下一个问题是为nxn 数组选择行、列和对角线。

行很容易:

rows = arr.map {|row| row}

列如下 - 您为每一行选择具有相同索引的元素:

cols = n.times.collect {|i| arr.map {|row| row[i]}}

接下来是对角线。对角线有两条,一条从最左边开始,一条从最右边开始。

最左边的对角线的顺序为:

(0, 0) -> (1, 1) -> (2, 2) ....

看到图案了吗?

diag = n.times.collect {|i| arr[i][i]}

最右边的对角线的图案是这样的(对于 3x3):

(0, 2) -> (1, 1) -> (2, 0)

对于 4x4,它是这样的:

(0, 3) -> (1, 2) -> (2, 1) -> (3, 0)

所以,nxn 的模式是:

(0, n-1-0) -> (1, n-1-1) -> (2, n-1-2) -> ... (i, n-1-i) ... -> (n-1, 0)

所以:

diag = n.times.collect {|i| arr[i][n - 1 - i]}

现在,您可以执行以下操作:

w = rows.map {|r| winner r}.compact[0]

为每个数组获得优胜者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多