buidling Tic Tac Toe,为什么我的方法不起作用?

时间:2016-02-09 21:59:31

标签: ruby

我正在尝试构建一个Tic Tac Toe,方法valid_move?假设确保提交的位置是:

  1. 出现在游戏板上。
  2. 尚未填充令牌。
  3. 所以我首先尝试确保位置在棋盘上的1-9之间,第二次尝试确保不采取位置,这里我只使用辅助方法 {{1但似乎出现了问题,我的position_taken?无法正常工作......

    valid_move?

    基本上我试图通过以下规范:

    def valid_move?(board,position)
      if  position.to_i.between?(1,9) && position_taken?
        true
      else
         false
      end
    end
    
    
    
    def position_taken?(board,position)
      if board[position] == " "
        false
        elsif board[position] == ""
        false
        elsif  board[position] == nil
        false
        else   board[position] == "X" || "O"
        true
    
      end
    end
    

2 个答案:

答案 0 :(得分:1)

我不确定你的代码是如何工作的,但是有些事情引起了我的注意。

else之后你不能有条件,所以else board[position] == "X" || "O"不会工作。即使您使用elseif board[position] == "X" || "O",它也会始终返回true,因为"0"是真实的。 board[position] == "X" || board[position] == "O"会更正确。

你没有将任何参数传递给position_taken?,并且它的外观应该被反转,这意味着你应该否定它的价值。我的意思是,除非采取立场,否则它只是一个有效的移动

您的规范还假设董事会职位1位于索引1,这是不正确的。您必须按1递减价值才能使其有效,例如position.to_i - 1

试试这个。

def valid_move?(board,position)
  position.to_i.between?(1,9) and not position_taken?(board, position.to_i - 1)
end

def position_taken?(board,position)
  return false if [" ", "", nil].include?(board[position])
  return true if ["X", "O"].include?(board[position])
  raise "#{board[position]} is not a valid move"
end

答案 1 :(得分:1)

你不能写:

board[position] == "X" || "O"

以下是需要考虑的事项:

如果董事会职位为''

[2] (pry) main: 0> '' == 'X' || 'O'
"O"

如果董事会职位为' '

[3] (pry) main: 0> ' ' == 'X' || 'O'
"O"

如果董事会职位为'X'

[4] (pry) main: 0> 'X' == 'X' || 'O'
true

如果董事会职位为'O'

[5] (pry) main: 0> 'O' == 'X' || 'O'
"O"

换句话说,你想要一个真/假,但是你没有得到一个。这是因为Ruby正在比较'' == 'X',然后检查'O'并返回它,因为'O'是一个真值。

尝试:

board[position] == "X" || board[position] == "O"

这是未经测试但您应该可以使用:

def position_taken?(board,position)
  board[position] == "X" || board[position] == "O"
end

def position_taken?(board,position)
  !!board[position][/^[XO]$/]
end