Операторы условия не дают правильный результат - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь разработать игру на корабле в консоли. Мне нужен ввод координат, которые угадывают, где находится игра. Я сделал это:

#array1 and array2 are not obvious boards of player1 and player2 respectly 
array1 = [ ['*', 'A', 'B', 'C', 'D', 'E'],['1',0, 1, 1, 1, 0], ['2',1, 0, 0, 0, 0], ['3',1, 0, 1, 0, 0], ['4',0, 0, 1, 0, 1], ['5',0, 0, 0, 0, 0] ]
array2 = [ ['*', 'A', 'B', 'C', 'D', 'E'],['1',1, 0, 1, 1, 0], ['2',0, 0, 0, 0, 1], ['3',0, 1, 0, 0, 1], ['4',0, 1, 0, 0, 1], ['5',0, 0, 0, 0, 0] ]

#arr1 and arr2 are obvious boards of player1 and player2 respectly
arr1 = [['*', 'A', 'B', 'C', 'D', 'E'],['1','.','.','.','.','.'],['2','.','.','.','.','.'],['3','.','.','.','.','.'],['4','.','.','.','.','.'],['5','.','.','.','.','.']]
arr2 = [['*', 'A', 'B', 'C', 'D', 'E'],['1', '.','.','.','.','.'],['2', '.','.','.','.','.'],['3', '.','.','.','.','.'],['4', '.','.','.','.','.'],['5', '.','.','.','.','.']]
coor = ['A', 'B', 'C', 'D', 'E']

#board1 and board2 are the final boards of player1 and player2
#this arrays will be seen during game 
#every changes will be seen on these boards
board1 = arr1.map { |x| x.join(' ') }
board2 = arr2.map { |x| x.join(' ') }

#num1 and num2 are the numbers of the parts of ships respectively
num1 = 8
num2 = 8

#count1 and count2 are the numbers of poped ship parts respectively
count1 = 0
count2 = 0

#Starting of the game and the printing the board 
#If we type "start" game will be started
#"Reset" game will be ended
#If we type words except "start" or "reset" program will ask "Do you want to start? (start/reset)" again
while true do
    puts "Welcome to the game!!!"
    puts "Do you want to start? (start/reset):"
    respond = gets.chomp
    if respond == 'start'
        puts "\n"
        puts "Player ONE"
        puts board1
        puts "\n"
        puts "Player TWO"
        puts board2

        while true do
            #Burada while ile player1 in shertleri olacaq 
            while true do 
                puts "\n"
                puts "Turn - Player ONE"
                puts "Enter coordinate: " 
                a = gets.chomp
                a1 = a.split('')
                b = coor.index(a1[0]) +1
                col1 = b
                row1= a1[1].to_i
                if a == '""'
                    puts "You have to enter any coordinate"
                    break
                elsif array1[row1][col1] == 'X' or array1[row1][col1] == '0'
                    puts "You have already bumped this coordinate!"
                elsif col1<1 or col1>5 or row1>5 or row1<1
                    puts "This coordinate is out of board"
                else
                    if array1[row1][col1] == 1
                        count1 = count1 + 1
                        arr1[row1][col1] = "X"
                    elsif array1[row1][col1] == 0
                        arr1[row1][col1] = "0"
                    end
                    board1 = arr1.map { |x| x.join(' ') }        
                    puts "\n"
                    puts "Player ONE"
                    puts board1
                    puts "\n"
                    puts "Player TWO"
                    puts board2

                    if count1 == num1
                        puts "Player ONE won the game!"
                        break
                    end
                end
                break
            end


            while true do 
                #Burada while ile player2 in shertleri olacaq 
                puts "\n"
                puts "Turn - Player TWO"
                puts "Enter coordinate: " 
                c = gets.chomp
                c1 = c.split('')
                d = coor.index(c1[0]) + 1
                col2 = d
                row2= c1[1].to_i
                if c == '""'
                    puts "You have to enter any coordinate"
                    break
                elsif array2[row2][col2] == 'X' or array2[row2][col2] == '0'
                    puts "You have already bumped this coordinate!"
                elsif col2<1 or col2>5 or row2>5 or row2<1
                    puts "This coordinate is out of board"
                else
                    if array2[row2][col2] == 1
                        count2 = count2 + 1
                        arr2[row2][col2] = "X"
                    elsif array2[row2][col2] == 0
                        arr2[row2][col2] = "0"
                    end
                    board2 = arr2.map { |x| x.join(' ') } 
                    puts "Player ONE"
                    puts board1
                    puts "\n"
                    puts "Player TWO"
                    puts board2

                    if count2 == num2
                        puts "Player TWO won the game!"
                        break
                    end
                end
                break
            end
        end

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

Возникли некоторые проблемы, и я добавил if elsif else условия в код для их решения. Один из них предназначен для ввода координат вне поля, второй - для того, чтобы не вводить координаты, а последний - для увеличенной координаты. Если эти три условия обойдены, игроки могут ввести любую координату.

Но эти коды не работают. Когда я проверяю эти три условия, результатом является ошибка. Может кто-нибудь сказать мне, что проблема с этими условиями? Почему они не дают подходящий результат?

1 Ответ

0 голосов
/ 09 ноября 2018

При вводе A8 в качестве значения вы получаете ошибку:

battleship.rb:54:in `<main>': undefined method `[]' for nil:NilClass (NoMethodError)

Это строка 54:

elsif array1[row1][col1] == 'X' or array1[row1][col1] == '0'

В этом случае ошибка состоит в том, что array1 ["8"] равно nil, а nil ["A"] не определено. Простое решение - переместить линию 56 над этой (той, которая проверяет, действительно ли вход находится в пределах диапазона платы).

elsif col1<1 or col1>5 or row1>5 or row1<1

Если вы сделаете это, то, поскольку 8 больше 5, вы получите сообщение «out of board», а не ошибку.


Другая ошибка, о которой вы упоминаете, - это когда вы вставляете пустую строку. В этом случае ошибка:

battleship.rb:48:in `<main>': undefined method `+' for nil:NilClass (NoMethodError)

В строке 48 написано:

b = coor.index(a1[0]) +1

В этом случае индекс возвращает ноль, и вы не можете добавить 1 к нолю.

Один из способов исправить это - переместить секцию на несколько строк вниз, чтобы проверить, является ли поле a пустым перед строкой 48.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...