首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >String || Ruby中的比较运算符

String || Ruby中的比较运算符
EN

Stack Overflow用户
提问于 2019-03-04 08:20:17
回答 1查看 198关注 0票数 -1

我是Ruby的新手,我正在尝试通过编写一个简单的TicTacToe游戏来练习。

我刚刚遇到了一个关于评估玩家是否赢得了游戏的小问题。

从本质上讲,游戏使用的棋盘等于:

代码语言:javascript
复制
board = ["#",' ',' ',' ',' ',' ',' ',' ',' ',' ']

每当玩家移动时,他们的“记号”(X或O)被添加到棋盘上,并且有功能来检查斑点是否被占据,是否是平局,或者玩家是否赢了。

因此,临时董事会可能如下所示:

代码语言:javascript
复制
board = ["#",' ',' ','O',' ','X',' ','O',' ',' ']

我的问题是在评估某人是否赢的时候。我已经为此编写了一个函数:(前3个表达式检查水平胜利,接下来3个表达式检查垂直胜利,下面2个表达式检查对角线胜利。

代码语言:javascript
复制
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。应该注意的是,表达式的左侧仍然计算为我想要的值,例如:

代码语言:javascript
复制
board = ["#",' ',' ','O',' ','O',' ','O',' ',' ']
p [board[7],board[5],board[3]].uniq 
>> ["O"]

我似乎不能理解为什么和任何方向,这将是非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-04 08:37:39

'X' || 'O'只说X或O,因为任何字符串都是真的,所以它总是返回X,所以任何你说过[('X' || 'O')]的地方,你实际上只是说了['X']

因此,您只需检查整行3是否都是X。

我真的不理解你是如何测试这个的,但是我觉得你最好先运行函数两次,首先提交X,如果它没有发现X是赢家,那么再提交O,而不是试图一次都检查一次。

或者,你可以让函数返回'X‘、'O’或nil,然后你可以让它只运行函数一次。返回的字符串将是谁赢了,如果是零,那么没有人赢。我还建议为此创建一个循环。我发现它更容易阅读。

下面是我将如何解决这个问题。

代码语言:javascript
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54975158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档