我正在尝试构建一个Tic Tac Toe,方法valid_move?
假设确保提交的位置是:
所以我首先尝试确保位置在棋盘上的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
答案 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