我是Ruby的新手,我正在尝试通过编写一个简单的TicTacToe游戏来练习。
我刚刚遇到了一个关于评估玩家是否赢得了游戏的小问题。
从本质上讲,游戏使用的棋盘等于:
board = ["#",' ',' ',' ',' ',' ',' ',' ',' ',' ']
每当玩家移动时,他们的“记号”(X或O)被添加到棋盘上,并且有功能来检查斑点是否被占据,是否是平局,或者玩家是否赢了。
因此,临时董事会可能如下所示:
board = ["#",' ',' ','O',' ','X',' ','O',' ',' ']
我的问题是在评估某人是否赢的时候。我已经为此编写了一个函数:(前3个表达式检查水平胜利,接下来3个表达式检查垂直胜利,下面2个表达式检查对角线胜利。
def check_for_win(board)
if [board[1],board[2],board[3]].uniq == [("X" || "O")] || [board[4],board[5],board[6]].uniq == [("X" || "O")] ||
[board[7],board[8],board[9]].uniq == [("X" || "O")] || [board[1],board[4],board[7]].uniq == [("X" || "O")] ||
[board[5],board[2],board[8]].uniq == [("X" || "O")] || [board[6],board[9],board[3]].uniq == [("X" || "O")] ||
[board[1],board[5],board[9]].uniq == [("X" || "O")] || [board[7],board[5],board[3]].uniq == [("X" || "O")]
true
else
false
end
end
此函数似乎评估是否存在带有"X“标记的获胜者,但对于"O”标记,如果不能计算为true。应该注意的是,表达式的左侧仍然计算为我想要的值,例如:
board = ["#",' ',' ','O',' ','O',' ','O',' ',' ']
p [board[7],board[5],board[3]].uniq
>> ["O"]
我似乎不能理解为什么和任何方向,这将是非常感谢。
发布于 2019-03-04 08:37:39
'X' || 'O'
只说X或O,因为任何字符串都是真的,所以它总是返回X,所以任何你说过[('X' || 'O')]
的地方,你实际上只是说了['X']
。
因此,您只需检查整行3是否都是X。
我真的不理解你是如何测试这个的,但是我觉得你最好先运行函数两次,首先提交X,如果它没有发现X是赢家,那么再提交O,而不是试图一次都检查一次。
或者,你可以让函数返回'X‘、'O’或nil,然后你可以让它只运行函数一次。返回的字符串将是谁赢了,如果是零,那么没有人赢。我还建议为此创建一个循环。我发现它更容易阅读。
下面是我将如何解决这个问题。
ROWS = [
[1,2,3],
[4,5,6],
[7,8,9],
[1,4,7],
[2,5,8],
[3,6,9],
[1,5,9],
[7,5,3],
]
def find_winner(board)
ROWS.each do |row|
# subtract 1 because the ROWS is 1-indexed (like a phone dial) but arrays are 0-indexed
row_values = row.map { |v| board[v - 1] }
return('X') if row_values.all?('X')
return('O') if row_values.all?('O')
end
return(nil)
end
test1 = [
'X', 'X', 'X',
'O', 'X', 'O',
'O', 'O', '',
]
puts "Winner of test1: #{find_winner(test1).inspect}"
"X"
test2 = [
'X', '', 'X',
'X', 'O', 'O',
'X', 'O', 'X',
]
puts "Winner of test2: #{find_winner(test2).inspect}"
"X"
test3 = [
'O', 'X', 'X',
'O', 'X', 'O',
'O', 'O', '',
]
puts "Winner of test3: #{find_winner(test3).inspect}"
"O"
test4 = [
'O', 'X', 'O',
'X', 'O', 'X',
'O', 'O', 'X',
]
puts "Winner of test4: #{find_winner(test4).inspect}"
"O"
test5 = [
'O', 'X', 'O',
'O', 'X', 'O',
'X', 'O', 'X',
]
puts "Winner of test5: #{find_winner(test5).inspect}"
nil
https://stackoverflow.com/questions/54975158
复制相似问题