a bit weird. I finished my code, all specs passed, then dove in and started working on getting the game to run correctly. Finally got the basic version where I want it, went to double check the specs before I submitted, and I get this…
1) BattleshipGame#play_turn gets a move from the player and makes an attack at that position
Failure/Error: game.play_turn
NoMethodError:
undefined method `write' for #<Board:0x007f99858df290 @grid=[[:s, :s], [nil, nil]]>
# ./lib/battleship.rb:21:in `display'
# ./lib/battleship.rb:21:in `play_turn'
# ./spec/battleship_spec.rb:51:in `block (3 levels) in <top (required)>'
no where in my code do I even have the word “write”
What’s on line 21 in battleship.rb? Post that and a few surrounding lines.
Fixed it. I wanted my my HumanPlayer to have a method that called a method on the instance of the board. The issue arose with how I was getting the board instance “into” the HumanPlayer so that the board method was called. Ended up setting up get_move to have an argument for the board, and then weaseled that arg input through to the method that I needed it to access (if that makes sense). Here is what I did for those that are interested
Battleship class vvv
def play_turn
display_status
pos = player.get_play(board)
hit_or_miss(pos)
attack(pos)
puts "You have #{self.count} ships remaining!"
end
HumanPlayer class vvvv
def get_play(board)
while true
puts "Where would you like to attack Admiral #{name}? Ex: 1,2"
pos = gets.chomp.split(",").map {|el| el.to_i}
break if ok_move?(pos, board)
end
pos
end
def valid_entry?(pos)
##assumes a 10x10 board
if pos.length == 2
return true if pos.all? {|num| (0..9).include?(num)}
end
false
end
def ok_move?(pos, board)
if valid_entry?(pos) == false
puts "That is not a valid entry, try again!"
return false
end
if board.valid_shot?(pos) == false
puts "You've already gone there, pick again!"
return false
end
true
end
``
Glad you figured it out!
I’m working on battleship now too, and I found out why it gives such a weird error message. display
is a built-in ruby method. So if you call display
on something (like an rspec double), and you haven’t given it your own display
method, instead of saying
undefined method 'display'
it will say
undefined method 'write'
because the built in ruby display
calls write.