Checking for a win in TicTacToe It looks like it should be shortened but I can't see how.

I have my methods &lt;= 5 lines but that's as far as I got:

def check_lines
  if horizontal?(@player) || vertical?(@player) || diagonal?(@player)
    @win=@player
  end
end

def horizontal?(player)
  ((@squares[0] == player) &amp;&amp; (@squares[1] == player) &amp;&amp; (@squares[2] == player)) ||
  ((@squares[3] == player) &amp;&amp; (@squares[4] == player) &amp;&amp; (@squares[5] == player)) ||
  ((@squares[6] == player) &amp;&amp; (@squares[7] == player) &amp;&amp; (@squares[8] == player))
end

def vertical?(player)
  ((@squares[0] == player) &amp;&amp; (@squares[3] == player) &amp;&amp; (@squares[6] == player)) ||
  ((@squares[1] == player) &amp;&amp; (@squares[4] == player) &amp;&amp; (@squares[7] == player)) ||
  ((@squares[2] == player) &amp;&amp; (@squares[5] == player) &amp;&amp; (@squares[8] == player))
end

def diagonal?(player)
  ((@squares[0] == player) &amp;&amp; (@squares[4] == player) &amp;&amp; (@squares[8] == player)) ||
  ((@squares[2] == player) &amp;&amp; (@squares[4] == player) &amp;&amp; (@squares[6] == player))
end
When all of your code is the same, just with different numbers, you want to use data-directed programming.

WINS = [
  [0, 1, 2], [3, 4, 5], [6, 7, 8],  # &lt;-- Horizontal wins
  [0, 3, 6], [1, 4, 7], [2, 5, 8],  # &lt;-- Vertical wins
  [0, 4, 8], [2, 4, 6],             # &lt;-- Diagonal wins
]

def check_lines
  if WINS.any? { |line| line.all? { |square| @squares[square] == @player } }
    @win = @player
  end
end