如何在井字棋盘中找到第一个获胜组合?

迭戈·巴斯克斯(Diego Vasquez)

Ruby的新功能,请原谅可怜的代码。我想遍历多维数组,WIN_COMBINATIONS并检查至少一个数组的所有元素是否等于'X'或全部等于'O'如果是这样,则返回匹配的数组。这是通过won?函数完成的,但似乎只返回了整个多维数组。任何援助将不胜感激。

class TicTacToe
  WIN_COMBINATIONS = [ 
[0,1,2], # top_row 
[3,4,5], # middle_row 
[6,7,8], # bottom_row 
[0,3,6], # left_column 
[1,4,7], # center_column 
[2,5,8], # right_column 
[0,4,8], # left_diagonal 
[6,4,2] # right_diagonal 
]

  def initialize
    @board = Array.new(9, " ")
  end

  def display_board
    puts " #{@board[0]} | #{@board[1]} | #{@board[2]} "
    puts "-----------"
    puts " #{@board[3]} | #{@board[4]} | #{@board[5]} "
    puts "-----------"
    puts " #{@board[6]} | #{@board[7]} | #{@board[8]} "
  end

  def input_to_index(board_position)
    user_input = board_position.to_i
    user_input - 1
  end

  def move(board_index, player_token = 'X')
    @board[board_index] = player_token
  end

  def position_taken?(board_position)
    if @board[board_position] == ' '
      false
    else
      true
    end
  end

  def valid_move?(board_position)
    if board_position >= 0 and board_position <= 8
      if @board[board_position] == ' '
        true
      end
    else
      false
    end
  end

  def current_player
    turn_count % 2 == 0 ? "X" : "O"
  end

  def turn_count
    @board.count{|token| token == "X" || token == "O"}
  end

  def turn
    puts "Select your move (1-9)\n"
    move = gets.chomp
    move_index = input_to_index(move)
    if valid_move?(move_index)
      token = current_player
      move(move_index, token)
      display_board
    else
      puts "Select your move (1-9)\n"
      move = gets.chomp
    end
  end

  def won?
    WIN_COMBINATIONS.each do |combinations|
      if combinations.all? {|combination| combination == 'X' or combination == 'O'}
        combinations
      else
        false
      end
    end
  end

  def draw?
    if full? and !won?
      true
    elsif won?
      false
    else
      false
    end
  end

  def over?

  end

  def winner

  end

  def play

  end
end
斯特凡

[...]似乎只返回整个多维数组。

您尝试的解决方案存在几个问题:

  1. WIN_COMBINATIONS是一个索引数组。这些索引是数字,因此它们永远不会是'X''O'您必须检查其对应的值'X'还是'O'

  2. or用于场景控制流运算符do_this or fail布尔“或”运算符||使用or代替代替|| 可能有效,但由于优先级较低可能会产生意想不到的结果你几乎总是想要||

  3. 表达式array.all? { |element| element == 'X' || element == 'O' }检查是否所有的元素都是任一 'X''O'这是true['X','O','O']false['X',' ','O']那是因为您将条件放在块中。您要检查的元素是全部'X'还是全部'O'

    array.all?('X') || array.all?('O')
    
  4. 您方法的返回值是的结果,WIN_COMBINATIONS.each { ... }并且Array#each始终返回数组本身(即WIN_COMBINATIONS),而不管块的结果如何。要获取与条件匹配的第一个元素,请使用find

让我们将所有这些应用到您的代码中。鉴于此板:

@board = %w[
X - O
O X -
- - X
]

您可以通过以下方式获得第一个匹配组合:

WIN_COMBINATIONS.find do |indices|
  values = @board.values_at(*indices)
  values.all?('X') || values.all?('O')
end
#=> [0, 4, 8]

values_at返回相应索引的值(*indices数组转换为参数列表,因此values_at(*[0,1,2])变为values_at(0,1,2))。然后,该块的第二行检查这些值是all'X'还是all 'O'一旦计算结果为true,循环就会中断并find返回匹配的元素。(或者nil如果没有匹配项)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在MATLAB的每一行中找到第一个'1'

来自分类Dev

如何在URL中找到第一个参数的indexOf

来自分类Dev

如何在每个后续数字间隔中找到第一个缺失数字?

来自分类Dev

如何在各种事件序列中找到第一个开始时间?

来自分类Dev

如何在VBA的列中找到大于零的第一个值?

来自分类Dev

如何在算术表达式中找到第一个运算符?

来自分类Dev

如何在水豚中找到第一个空字段?

来自分类Dev

如何在vim中找到单词的第一个大写字母?

来自分类Dev

如何在C ++中找到第一个最大值?

来自分类Dev

如何在算术表达式中找到第一个运算符?

来自分类Dev

如何在表格中找到第一个文本框的值?

来自分类Dev

如何在长路径中找到第一个丢失的目录?

来自分类Dev

如何在字符串中找到第一个元音

来自分类Dev

如何在Ruby中找到字符串的第一个非重复字母?

来自分类Dev

如何在VBA中找到第一个空单元格?

来自分类Dev

如何在对象中找到作为数组的第一个属性?

来自分类Dev

如何在排名较高的张量中找到第一个匹配张量的索引

来自分类Dev

如何在 Django 模板中找到第一个实例

来自分类Dev

如何在列表中找到连续重复数字的第一个索引?

来自分类Dev

如何在一个变量中找到组合的关系

来自分类Dev

如何在 v-for 循环中仅打印第一个获胜者?

来自分类Dev

如何在列表python中找到第二个元素和第一个元素的差异

来自分类Dev

如何在R中找到子字符串的第一个唯一的相遇

来自分类Dev

如何在java中找到一维字符串的第一个字符

来自分类Dev

如何在CSS中使用tr类名在tr中找到第一个td?

来自分类Dev

如何在与用户给定前缀匹配的字符串向量中找到第一个单词?

来自分类Dev

如何在x,y点的2D数组中找到第一个极值?

来自分类Dev

如何在后续行中找到与当前行相比较小的第一个值?

来自分类Dev

如何在行缓冲区中找到第一个响应后让 grep 运行命令?

Related 相关文章

  1. 1

    如何在MATLAB的每一行中找到第一个'1'

  2. 2

    如何在URL中找到第一个参数的indexOf

  3. 3

    如何在每个后续数字间隔中找到第一个缺失数字?

  4. 4

    如何在各种事件序列中找到第一个开始时间?

  5. 5

    如何在VBA的列中找到大于零的第一个值?

  6. 6

    如何在算术表达式中找到第一个运算符?

  7. 7

    如何在水豚中找到第一个空字段?

  8. 8

    如何在vim中找到单词的第一个大写字母?

  9. 9

    如何在C ++中找到第一个最大值?

  10. 10

    如何在算术表达式中找到第一个运算符?

  11. 11

    如何在表格中找到第一个文本框的值?

  12. 12

    如何在长路径中找到第一个丢失的目录?

  13. 13

    如何在字符串中找到第一个元音

  14. 14

    如何在Ruby中找到字符串的第一个非重复字母?

  15. 15

    如何在VBA中找到第一个空单元格?

  16. 16

    如何在对象中找到作为数组的第一个属性?

  17. 17

    如何在排名较高的张量中找到第一个匹配张量的索引

  18. 18

    如何在 Django 模板中找到第一个实例

  19. 19

    如何在列表中找到连续重复数字的第一个索引?

  20. 20

    如何在一个变量中找到组合的关系

  21. 21

    如何在 v-for 循环中仅打印第一个获胜者?

  22. 22

    如何在列表python中找到第二个元素和第一个元素的差异

  23. 23

    如何在R中找到子字符串的第一个唯一的相遇

  24. 24

    如何在java中找到一维字符串的第一个字符

  25. 25

    如何在CSS中使用tr类名在tr中找到第一个td?

  26. 26

    如何在与用户给定前缀匹配的字符串向量中找到第一个单词?

  27. 27

    如何在x,y点的2D数组中找到第一个极值?

  28. 28

    如何在后续行中找到与当前行相比较小的第一个值?

  29. 29

    如何在行缓冲区中找到第一个响应后让 grep 运行命令?

热门标签

归档