Tic-Tac-Toe:检查一名球员是否赢了

时间:2016-12-01 08:42:03

标签: ruby

我目前正在制作一款曾经如此受欢迎的Tic-Tac-Toe游戏的复制品,使用纯红宝石制作。测试了TDD风格。

我唯一的问题是,在我的生活中,我无法弄清楚如何检查玩家何时获胜。我知道这是一个相对简单的问题,但我只是在其中的一天 - 而且我真的只是作为最后的手段在这里发布。

非常感谢任何帮助 - 并且可以随意批评我当前的代码!我能应付。 :)

我的代码:

class TicTacToe

WINNING_COMBINATIONS = [[0, 1, 2], [3, 4, 5], [6, 7, 8], #Horizontal
                      [0, 3, 6], [1, 4, 7], [2, 5, 8], #Vertical
                      [0, 4, 8], [2, 4, 6]] #Diagonal    

def initialize
  @board = ["", "", "", "", "", "", "", "", ""]
  @players = ['player_one', 'player_two']
  @current_player = 'player_one'
end

def player_1
  @players.first
end

def player_2
  @players.last
end

def switch
  @current_player = opponent_of(@current_player)
end

def display_board
  puts " #{@board[0]} | #{@board[1]} | #{@board[2]} "
  puts "-----------"
  puts " #{@board[3]} | #{@board[4]} | #{@board[5]} "
  puts "-----------"
  puts " #{@board[6]} | #{@board[7]} | #{@board[8]} "
end

def move(position)
  fail "Please select a space within range." if position < 1 || position > 9
  fail "That space is already taken!" unless @board[position-1].empty?
if @current_player == player_1
  @board[position-1] = 'o'
else
  @board[position-1] = 'x'
end
  switch
end

def check_for_winner
  #Help!
end

private

def opponent_of(player)
  @players.select { |p| p != player }.first
  end
end

3 个答案:

答案 0 :(得分:2)

我会从这样的事情开始:

def check_for_winner
  WINNING_COMBINATIONS.each do |combination|
    case board.values_at(*combination)
    when %w(o o o)
      return 'Player 1 wins'
    when %w(x x x)
      return 'Player 2 wins'
    end
  end
end

答案 1 :(得分:1)

这是确定小阵列(获胜集)是否完全是较大阵列(板)的子集的问题。你可以用简单的数组减法来做到这一点。

def has_winner(board)
  WINNING_COMBINATIONS.each do |line|
    return true if (line - board) == []
  end
  return false
end

将@Stefan的优秀建议纳入另一个答案......

def has_winner(board)
   WINNING_COMBINATIONS.any? {|line| (line - board) == [] }
end

答案 2 :(得分:1)

你非常接近。我不想为你编写代码,但我会给你一些伪代码,你应该从中识别出适用的正确算法:

def has_winner(board)
  WINNING_COMBINATIONS.each do |i, j, k|
    return true if board[i] == board[j] && board[i] == board[k]
  end
  false
end

根据需要进行整合,然后可能会试图通过一些更高阶的函数来获得所有的幻想。

顺便说一句,有一些非常奇特且更快的方法来计算基于位掩码和两个等的求和功能的获胜,但我猜测最可读的是什么。

豫ICP备18024241号-1