0

I am practicing my ruby skills after a long while from backpacking and I think I am way rustier than I thought. The following code below is a connect 4 game that I am trying to implement for Code Wars. While doing coding this, I am having a problem with the attr_accessor: turn_counter.

I have declared this variable as such, so I can increment it but when I call turn_tracker.odd? I receive a value of nil. Why is that? All my other variables are able to read/write respectively. For example, the grid is able to be called and returns the expected value. I don't see why turn_tracker should need the self call. The other variables don't need to. Can I get a refresher as to why that is? Thanks.

class Connect4


attr_reader :player_one, :player_two
  attr_accessor :turn_tracker, :grid

  def initialize
    @player_one = Player.new("Player 1")
    @player_two = Player.new("Player 2")
    @turn_tracker = 1
    @grid = [[],[],[],[],[],[]]
  end

  def play(column)

    ######### Problem ##############
    if turn_tracker.odd?
      self.turn_tracker += 1
    ################################    

      player_one.makes_a_move(grid[column])
      win?(grid[column], player_one)
    else
      self.turn_tracker += 1
      player_two.makes_a_move(grid[column])
      win?(grid[column], player_two)
    end
  end

  private

  def win?(grid, player)
    #vertical
    if grid.count(player) == 4
      player_indexes = grid.each_index.select do |i|
        grid[i].name == player.name
      end

      one = (player_indexes[0].next == player_indexes[1])
      two = (player_indexes[1].next == player_indexes[2])
      three = (player_indexes[2].next == player_indexes[3])

      if (one && two && three)
        "#{player.name} wins!"
      elsif column_full?(grid)
        "Column full!"
      else
        "#{player.name} has a turn"
      end
    else
      "#{player.name} has a turn"
    end
  end

  def column_full?(grid)
    grid.size == 7
  end
end

class Player
  attr_reader :name

  def initialize(name)
    @name = name
  end

  def makes_a_move(grid)
    grid << self
  end
end

puts "New game!"
game = Connect4.new
puts game.play(0) #"Should return 'Player 1 has a turn'
puts game.play(0) #"Should return 'Player 2 has a turn'

puts "New game!"
game = Connect4.new

puts game.play(0) #"Should return 'Player 1 has a turn'
puts game.play(1) #"Should return 'Player 2 has a turn'
puts game.play(0) #"Should return 'Player 1 has a turn'
puts game.play(1) #"Should return 'Player 2 has a turn'
puts game.play(0) #"Should return 'Player 1 has a turn'
puts game.play(1) #"Should return 'Player 2 has a turn'
puts game.play(0) #"Player 1 wins!", "Player 1 wins!'


puts "New game"
game = Connect4.new
puts game.play(4) #"Player 1 has a turn"
puts game.play(4) #"Player 2 has a turn"
puts game.play(4) #"Player 1 has a turn"
puts game.play(4) #"Player 2 has a turn"
puts game.play(4) #"Player 1 has a turn"
puts game.play(4) #"Player 2 has a turn"
puts game.play(4) # "Column full!"
Dan Rubio
  • 4,709
  • 10
  • 49
  • 106

0 Answers0