【问题标题】:My method is outputting an entire array instead of an integer from within that array我的方法是输出整个数组而不是该数组中的整数
【发布时间】:2020-05-13 14:45:28
【问题描述】:

我正在创建一个井字游戏,我希望计算机根据棋盘上可用的获胜组合进入战略位置。出于某种原因,computer_index 方法一直有效,直到turn_count == 4,它输出整个WIN_COMBINATIONS 数组而不是一个值。可以理解,这会在 valid_move? 方法中产生错误。相关错误及代码如下。

Traceback (most recent call last):
    3: from tictactoe.rb:12:in `<main>'
    2: from /Users/irosen419/Flatiron/code/tictactoe/tic_tac_toe.rb:201:in `play'
    1: from /Users/irosen419/Flatiron/code/tictactoe/tic_tac_toe.rb:117:in `comp_turn'
/Users/irosen419/Flatiron/code/tictactoe/tic_tac_toe.rb:40:in `valid_move?': undefined method `between?' for #<Array:0x00007fbe650d8268> (NoMethodError)
WIN_COMBINATIONS = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 4, 8], [2, 4, 6], [0, 3, 6], [1, 4, 7], [2, 5, 8]]

def valid_move?(index)
  index.between?(0,8) && !position_taken?(index)
end

def computer_index
  if turn_count == 0
    CORNERS.sample
  elsif turn_count == 2
    CORNERS.sample
  elsif turn_count == 4 || turn_count == 6
    WIN_COMBINATIONS.each do |combo|
      if @board[combo[0]] == "X" && @board[combo[1]] == "X"
          @board[combo[2]]
      elsif @board[combo[1]] == "X" && @board[combo[2]] == "X"
        @board[combo[0]]
      elsif @board[combo[0]] == "X" && @board[combo[2]] == "X"
        @board[combo[1]]
      elsif @board[combo[0]] == "O" && @board[combo[1]] == "O"
          @board[combo[2]]
      elsif @board[combo[1]] == "O" && @board[combo[2]] == "O"
        @board[combo[0]]
      elsif @board[combo[0]] == "O" && @board[combo[2]] == "O"
        @board[combo[1]]
      else
        CORNERS.sample
      end
    end
  else
    @board.each do |space|
      if space == " "
        space
      end
    end
  end
end

def comp_turn
  index = computer_index
  if valid_move?(index)
    move(index, current_player)
    display_board
  else
    comp_turn
  end
end

def turn_count
  count = 0
  @board.each do |space|
    if space == "X" || space == "O"
      count +=1
    end
  end
  count
end

【问题讨论】:

    标签: ruby tic-tac-toe


    【解决方案1】:

    我认为您缺少return 声明:

    def computer_index
      if turn_count == 0
        CORNERS.sample
      elsif turn_count == 2
        CORNERS.sample
      elsif turn_count == 4 || turn_count == 6
        WIN_COMBINATIONS.each do |combo|
          if @board[combo[0]] == "X" && @board[combo[1]] == "X"
            return @board[combo[2]]
          elsif @board[combo[1]] == "X" && @board[combo[2]] == "X"
            return @board[combo[0]]
          elsif @board[combo[0]] == "X" && @board[combo[2]] == "X"
            return @board[combo[1]]
          elsif @board[combo[0]] == "O" && @board[combo[1]] == "O"
            return @board[combo[2]]
          elsif @board[combo[1]] == "O" && @board[combo[2]] == "O"
            return @board[combo[0]]
          elsif @board[combo[0]] == "O" && @board[combo[2]] == "O"
            return @board[combo[1]]
          else
            return CORNERS.sample
          end
        end
      else
        @board.each do |space|
          if space == " "
            space
          end
        end
      end
    end
    

    【讨论】:

    • 我的印象是 Ruby 有隐式返回。如果没有“return”,该方法似乎仍然适用于 turn_count 0 和 2。使用“return”,我收到一个新错误,在这种情况下对我来说更没有意义 ...tic_tac_toe.rb:39:in `between?': comparison of String with 0 failed (ArgumentError)
    • 你是对的,ruby 对最后一个评估的表达式有隐式返回。但是#each 返回您迭代的集合。
    • 对于你的错误信息:似乎@board[combo[2]] 返回一个字符串而不是一个数字。
    • 正确。这解决了眼前的问题。谢谢!
    猜你喜欢
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    相关资源
    最近更新 更多