Battlefield game in ruby [closed]











up vote
-3
down vote

favorite
1












This is a classic battleship game for two players:



#board1 and board2 arrays are boards that players see only dots (not bumped yet), O (not ship part) and X (bumped ship part) 
board1 =
board2 =

#Create the board that players can see through with terminal
for i in 0..4
board1.append("O")
end

for i in 0..4
board2.append("O")
end

def print_board(board1)
for row in board1
puts board1.map { |k| "#{k}" }.join(" ")
end
end

def print_board(board2)
for row in board2
puts board2.map { |k| "#{k}" }.join(" ")
end
end


print_board(board1)
puts "n"
print_board(board2)

#array1 and array2 are obvious boards of player1 and player2 respectly
array1 = [ [0, 1, 1, 1, 0], [1, 0, 0, 0, 0], [1, 0, 1, 0, 0], [0, 0, 1, 0, 1], [0, 0, 0, 0, 0] ]
array2 = [ [1, 0, 1, 1, 0], [0, 0, 0, 0, 1], [0, 1, 0, 0, 1], [0, 1, 0, 0, 1], [0, 0, 0, 0, 0] ]

#Starting of the game and the printing the board
while true do
puts "Welcome to the game!!!"
puts "Do you want to start? (start/reset):"
a = gets.chomp
if a == 'start'

for i in 0..100
puts "Turn - Player1: "
puts "Enter row: "
q = gets.chomp
p1_row = q.to_i
puts "Enter coloumn: "
w = gets.chomp
p1_col= w.to_i
if array2[p1_row][p1_col] == 1
array2[p1_row][p1_col] ="X"
board2[p1_row][p1_col] ="X"
elsif array2[p1_row][p1_col] == 0
array2[p1_row][p1_col] ="-"
board2[p1_row][p1_col] ="-"
elsif array2[p1_row][p1_col] =="X" or array2[p1_row][p1_col] =="-"
next
end
print_board(board2)

puts "Turn - Player2: "
puts "Enter row: "
e = gets.chomp
p2_row = e.to_i
puts "Enter coloumn: "
r = gets.chomp
p2_col= r.to_i
if array1[p2_row][p2_col] == 1
array1[p2_row][p2_col] ="X"
board1[p2_row][p2_col] ="X"
elsif array1[p2_row][p2_col] == 0
array1[p2_row][p2_col] ="-"
board1[p2_row][p2_col] ="-"
elsif array1[p2_row][p2_col] =="X" or array1[p2_row][p2_col] =="-"
next
end
print_board(board1)

end

elsif a == 'reset'
puts "You are off the game"
break
else
puts "n"
puts "Answer can be only {start} or {reset}"
end
end


I have two problems with this code. When I entered index 4 for player 2, I get "index 4 out of string (IndexError)", but I did not find why. The other problem is that, when if statement finds 1 or 0, it changes all columns, and does not change only the element of the array.










share|improve this question









New contributor




Gulnar Necefova is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











closed as unclear what you're asking by Jörg W Mittag, sawa, Roland Studer, EdChum, SRack Nov 5 at 13:17


Please clarify your specific problem or add additional details to highlight exactly what you need. As it's currently written, it’s hard to tell exactly what you're asking. See the How to Ask page for help clarifying this question. If this question can be reworded to fit the rules in the help center, please edit the question.















  • What is your question?
    – sawa
    Nov 5 at 3:52















up vote
-3
down vote

favorite
1












This is a classic battleship game for two players:



#board1 and board2 arrays are boards that players see only dots (not bumped yet), O (not ship part) and X (bumped ship part) 
board1 =
board2 =

#Create the board that players can see through with terminal
for i in 0..4
board1.append("O")
end

for i in 0..4
board2.append("O")
end

def print_board(board1)
for row in board1
puts board1.map { |k| "#{k}" }.join(" ")
end
end

def print_board(board2)
for row in board2
puts board2.map { |k| "#{k}" }.join(" ")
end
end


print_board(board1)
puts "n"
print_board(board2)

#array1 and array2 are obvious boards of player1 and player2 respectly
array1 = [ [0, 1, 1, 1, 0], [1, 0, 0, 0, 0], [1, 0, 1, 0, 0], [0, 0, 1, 0, 1], [0, 0, 0, 0, 0] ]
array2 = [ [1, 0, 1, 1, 0], [0, 0, 0, 0, 1], [0, 1, 0, 0, 1], [0, 1, 0, 0, 1], [0, 0, 0, 0, 0] ]

#Starting of the game and the printing the board
while true do
puts "Welcome to the game!!!"
puts "Do you want to start? (start/reset):"
a = gets.chomp
if a == 'start'

for i in 0..100
puts "Turn - Player1: "
puts "Enter row: "
q = gets.chomp
p1_row = q.to_i
puts "Enter coloumn: "
w = gets.chomp
p1_col= w.to_i
if array2[p1_row][p1_col] == 1
array2[p1_row][p1_col] ="X"
board2[p1_row][p1_col] ="X"
elsif array2[p1_row][p1_col] == 0
array2[p1_row][p1_col] ="-"
board2[p1_row][p1_col] ="-"
elsif array2[p1_row][p1_col] =="X" or array2[p1_row][p1_col] =="-"
next
end
print_board(board2)

puts "Turn - Player2: "
puts "Enter row: "
e = gets.chomp
p2_row = e.to_i
puts "Enter coloumn: "
r = gets.chomp
p2_col= r.to_i
if array1[p2_row][p2_col] == 1
array1[p2_row][p2_col] ="X"
board1[p2_row][p2_col] ="X"
elsif array1[p2_row][p2_col] == 0
array1[p2_row][p2_col] ="-"
board1[p2_row][p2_col] ="-"
elsif array1[p2_row][p2_col] =="X" or array1[p2_row][p2_col] =="-"
next
end
print_board(board1)

end

elsif a == 'reset'
puts "You are off the game"
break
else
puts "n"
puts "Answer can be only {start} or {reset}"
end
end


I have two problems with this code. When I entered index 4 for player 2, I get "index 4 out of string (IndexError)", but I did not find why. The other problem is that, when if statement finds 1 or 0, it changes all columns, and does not change only the element of the array.










share|improve this question









New contributor




Gulnar Necefova is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











closed as unclear what you're asking by Jörg W Mittag, sawa, Roland Studer, EdChum, SRack Nov 5 at 13:17


Please clarify your specific problem or add additional details to highlight exactly what you need. As it's currently written, it’s hard to tell exactly what you're asking. See the How to Ask page for help clarifying this question. If this question can be reworded to fit the rules in the help center, please edit the question.















  • What is your question?
    – sawa
    Nov 5 at 3:52













up vote
-3
down vote

favorite
1









up vote
-3
down vote

favorite
1






1





This is a classic battleship game for two players:



#board1 and board2 arrays are boards that players see only dots (not bumped yet), O (not ship part) and X (bumped ship part) 
board1 =
board2 =

#Create the board that players can see through with terminal
for i in 0..4
board1.append("O")
end

for i in 0..4
board2.append("O")
end

def print_board(board1)
for row in board1
puts board1.map { |k| "#{k}" }.join(" ")
end
end

def print_board(board2)
for row in board2
puts board2.map { |k| "#{k}" }.join(" ")
end
end


print_board(board1)
puts "n"
print_board(board2)

#array1 and array2 are obvious boards of player1 and player2 respectly
array1 = [ [0, 1, 1, 1, 0], [1, 0, 0, 0, 0], [1, 0, 1, 0, 0], [0, 0, 1, 0, 1], [0, 0, 0, 0, 0] ]
array2 = [ [1, 0, 1, 1, 0], [0, 0, 0, 0, 1], [0, 1, 0, 0, 1], [0, 1, 0, 0, 1], [0, 0, 0, 0, 0] ]

#Starting of the game and the printing the board
while true do
puts "Welcome to the game!!!"
puts "Do you want to start? (start/reset):"
a = gets.chomp
if a == 'start'

for i in 0..100
puts "Turn - Player1: "
puts "Enter row: "
q = gets.chomp
p1_row = q.to_i
puts "Enter coloumn: "
w = gets.chomp
p1_col= w.to_i
if array2[p1_row][p1_col] == 1
array2[p1_row][p1_col] ="X"
board2[p1_row][p1_col] ="X"
elsif array2[p1_row][p1_col] == 0
array2[p1_row][p1_col] ="-"
board2[p1_row][p1_col] ="-"
elsif array2[p1_row][p1_col] =="X" or array2[p1_row][p1_col] =="-"
next
end
print_board(board2)

puts "Turn - Player2: "
puts "Enter row: "
e = gets.chomp
p2_row = e.to_i
puts "Enter coloumn: "
r = gets.chomp
p2_col= r.to_i
if array1[p2_row][p2_col] == 1
array1[p2_row][p2_col] ="X"
board1[p2_row][p2_col] ="X"
elsif array1[p2_row][p2_col] == 0
array1[p2_row][p2_col] ="-"
board1[p2_row][p2_col] ="-"
elsif array1[p2_row][p2_col] =="X" or array1[p2_row][p2_col] =="-"
next
end
print_board(board1)

end

elsif a == 'reset'
puts "You are off the game"
break
else
puts "n"
puts "Answer can be only {start} or {reset}"
end
end


I have two problems with this code. When I entered index 4 for player 2, I get "index 4 out of string (IndexError)", but I did not find why. The other problem is that, when if statement finds 1 or 0, it changes all columns, and does not change only the element of the array.










share|improve this question









New contributor




Gulnar Necefova is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











This is a classic battleship game for two players:



#board1 and board2 arrays are boards that players see only dots (not bumped yet), O (not ship part) and X (bumped ship part) 
board1 =
board2 =

#Create the board that players can see through with terminal
for i in 0..4
board1.append("O")
end

for i in 0..4
board2.append("O")
end

def print_board(board1)
for row in board1
puts board1.map { |k| "#{k}" }.join(" ")
end
end

def print_board(board2)
for row in board2
puts board2.map { |k| "#{k}" }.join(" ")
end
end


print_board(board1)
puts "n"
print_board(board2)

#array1 and array2 are obvious boards of player1 and player2 respectly
array1 = [ [0, 1, 1, 1, 0], [1, 0, 0, 0, 0], [1, 0, 1, 0, 0], [0, 0, 1, 0, 1], [0, 0, 0, 0, 0] ]
array2 = [ [1, 0, 1, 1, 0], [0, 0, 0, 0, 1], [0, 1, 0, 0, 1], [0, 1, 0, 0, 1], [0, 0, 0, 0, 0] ]

#Starting of the game and the printing the board
while true do
puts "Welcome to the game!!!"
puts "Do you want to start? (start/reset):"
a = gets.chomp
if a == 'start'

for i in 0..100
puts "Turn - Player1: "
puts "Enter row: "
q = gets.chomp
p1_row = q.to_i
puts "Enter coloumn: "
w = gets.chomp
p1_col= w.to_i
if array2[p1_row][p1_col] == 1
array2[p1_row][p1_col] ="X"
board2[p1_row][p1_col] ="X"
elsif array2[p1_row][p1_col] == 0
array2[p1_row][p1_col] ="-"
board2[p1_row][p1_col] ="-"
elsif array2[p1_row][p1_col] =="X" or array2[p1_row][p1_col] =="-"
next
end
print_board(board2)

puts "Turn - Player2: "
puts "Enter row: "
e = gets.chomp
p2_row = e.to_i
puts "Enter coloumn: "
r = gets.chomp
p2_col= r.to_i
if array1[p2_row][p2_col] == 1
array1[p2_row][p2_col] ="X"
board1[p2_row][p2_col] ="X"
elsif array1[p2_row][p2_col] == 0
array1[p2_row][p2_col] ="-"
board1[p2_row][p2_col] ="-"
elsif array1[p2_row][p2_col] =="X" or array1[p2_row][p2_col] =="-"
next
end
print_board(board1)

end

elsif a == 'reset'
puts "You are off the game"
break
else
puts "n"
puts "Answer can be only {start} or {reset}"
end
end


I have two problems with this code. When I entered index 4 for player 2, I get "index 4 out of string (IndexError)", but I did not find why. The other problem is that, when if statement finds 1 or 0, it changes all columns, and does not change only the element of the array.







ruby






share|improve this question









New contributor




Gulnar Necefova is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question









New contributor




Gulnar Necefova is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question








edited Nov 5 at 3:50









sawa

128k27191296




128k27191296






New contributor




Gulnar Necefova is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked Nov 4 at 23:21









Gulnar Necefova

1




1




New contributor




Gulnar Necefova is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





Gulnar Necefova is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






Gulnar Necefova is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.




closed as unclear what you're asking by Jörg W Mittag, sawa, Roland Studer, EdChum, SRack Nov 5 at 13:17


Please clarify your specific problem or add additional details to highlight exactly what you need. As it's currently written, it’s hard to tell exactly what you're asking. See the How to Ask page for help clarifying this question. If this question can be reworded to fit the rules in the help center, please edit the question.






closed as unclear what you're asking by Jörg W Mittag, sawa, Roland Studer, EdChum, SRack Nov 5 at 13:17


Please clarify your specific problem or add additional details to highlight exactly what you need. As it's currently written, it’s hard to tell exactly what you're asking. See the How to Ask page for help clarifying this question. If this question can be reworded to fit the rules in the help center, please edit the question.














  • What is your question?
    – sawa
    Nov 5 at 3:52


















  • What is your question?
    – sawa
    Nov 5 at 3:52
















What is your question?
– sawa
Nov 5 at 3:52




What is your question?
– sawa
Nov 5 at 3:52












1 Answer
1






active

oldest

votes

















up vote
1
down vote













The main problem is in your board set-up. You have



for i in 0..4
board1.append("O")
end


But that only creates one dimension. Try this:



for i in 0..4
board1[i] =
(0..4).each do
board1[i].append("O")
end
end


A secondary problem is the subroutine print_board. First, you only need one definition of the subroutine, then second, the map needs to apply to "row" not "board", like this:



def print_board(board)
for row in board
puts row.map { |k| "#{k}" }.join(" ")
end
end


There are many other problems with your code. I assume you are learning Ruby and this is an exercise to learn the Array API. In such case, it will be best for you continue the exercise yourself, learning as you go.



However, one additional hint: Learn about rubocop and run it on your code. Doing this consistently will teach you about good Ruby style while also improving your code. To be specific: Install the rubocop gem, then run rubocop against your code like this:



rubocop -SEa battleship.rb





share|improve this answer






























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes








    up vote
    1
    down vote













    The main problem is in your board set-up. You have



    for i in 0..4
    board1.append("O")
    end


    But that only creates one dimension. Try this:



    for i in 0..4
    board1[i] =
    (0..4).each do
    board1[i].append("O")
    end
    end


    A secondary problem is the subroutine print_board. First, you only need one definition of the subroutine, then second, the map needs to apply to "row" not "board", like this:



    def print_board(board)
    for row in board
    puts row.map { |k| "#{k}" }.join(" ")
    end
    end


    There are many other problems with your code. I assume you are learning Ruby and this is an exercise to learn the Array API. In such case, it will be best for you continue the exercise yourself, learning as you go.



    However, one additional hint: Learn about rubocop and run it on your code. Doing this consistently will teach you about good Ruby style while also improving your code. To be specific: Install the rubocop gem, then run rubocop against your code like this:



    rubocop -SEa battleship.rb





    share|improve this answer



























      up vote
      1
      down vote













      The main problem is in your board set-up. You have



      for i in 0..4
      board1.append("O")
      end


      But that only creates one dimension. Try this:



      for i in 0..4
      board1[i] =
      (0..4).each do
      board1[i].append("O")
      end
      end


      A secondary problem is the subroutine print_board. First, you only need one definition of the subroutine, then second, the map needs to apply to "row" not "board", like this:



      def print_board(board)
      for row in board
      puts row.map { |k| "#{k}" }.join(" ")
      end
      end


      There are many other problems with your code. I assume you are learning Ruby and this is an exercise to learn the Array API. In such case, it will be best for you continue the exercise yourself, learning as you go.



      However, one additional hint: Learn about rubocop and run it on your code. Doing this consistently will teach you about good Ruby style while also improving your code. To be specific: Install the rubocop gem, then run rubocop against your code like this:



      rubocop -SEa battleship.rb





      share|improve this answer

























        up vote
        1
        down vote










        up vote
        1
        down vote









        The main problem is in your board set-up. You have



        for i in 0..4
        board1.append("O")
        end


        But that only creates one dimension. Try this:



        for i in 0..4
        board1[i] =
        (0..4).each do
        board1[i].append("O")
        end
        end


        A secondary problem is the subroutine print_board. First, you only need one definition of the subroutine, then second, the map needs to apply to "row" not "board", like this:



        def print_board(board)
        for row in board
        puts row.map { |k| "#{k}" }.join(" ")
        end
        end


        There are many other problems with your code. I assume you are learning Ruby and this is an exercise to learn the Array API. In such case, it will be best for you continue the exercise yourself, learning as you go.



        However, one additional hint: Learn about rubocop and run it on your code. Doing this consistently will teach you about good Ruby style while also improving your code. To be specific: Install the rubocop gem, then run rubocop against your code like this:



        rubocop -SEa battleship.rb





        share|improve this answer














        The main problem is in your board set-up. You have



        for i in 0..4
        board1.append("O")
        end


        But that only creates one dimension. Try this:



        for i in 0..4
        board1[i] =
        (0..4).each do
        board1[i].append("O")
        end
        end


        A secondary problem is the subroutine print_board. First, you only need one definition of the subroutine, then second, the map needs to apply to "row" not "board", like this:



        def print_board(board)
        for row in board
        puts row.map { |k| "#{k}" }.join(" ")
        end
        end


        There are many other problems with your code. I assume you are learning Ruby and this is an exercise to learn the Array API. In such case, it will be best for you continue the exercise yourself, learning as you go.



        However, one additional hint: Learn about rubocop and run it on your code. Doing this consistently will teach you about good Ruby style while also improving your code. To be specific: Install the rubocop gem, then run rubocop against your code like this:



        rubocop -SEa battleship.rb






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Nov 5 at 1:58

























        answered Nov 5 at 1:38









        rcrews

        468




        468















            這個網誌中的熱門文章

            Hercules Kyvelos

            Tangent Lines Diagram Along Smooth Curve

            Yusuf al-Mu'taman ibn Hud