Ti c Ta c Toe Помогите исправить метод, который проверяет, был ли квадрат уже выбран. Игровое поле структурировано как пустой массив - PullRequest
1 голос
/ 29 апреля 2020

Я создаю игру ti c ta c toe в командной строке, используя Ruby. У меня есть метод display_board, который отображает мой массив как игровую доску в командной строке, и когда я играю в игру, игроки могут выбирать между 1-9 и заполнять квадрат своим «символом». Я создал метод check_square, чтобы убедиться, что один из квадратов в сетке уже занят, но он не работает для меня должным образом. Я запускаю игру, и все работает, пока она не попросит меня выбрать свой первый номер в сетке. Он немедленно отвечает и говорит, что номер уже занят, хотя это первый ход в игре. Он просит меня выбрать другой номер и со второй попытки заполняет сетку. Это происходит при каждом движении игрока. Логика c, кажется, имеет смысл для меня, и я пытаюсь понять это в течение часа, но я явно что-то упускаю. Любые толчки в правильном направлении будут полезны!

class Players
    attr_accessor :name, :symbol
    def initialize(name, symbol)
        @name = name
        @symbol = symbol
    end
end

class Game 
    @@board = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
    @@count = 0

    def initialize
        puts "Tic Tac Toe!"
    end

    def display_board
        puts "  #{@@board[0]}  |  #{@@board[1]}  |  #{@@board[2]}"
        puts seperator = "-----+-----+-----"
        puts "  #{@@board[3]}  |  #{@@board[4]}  |  #{@@board[5]}"
        puts seperator
        puts "  #{@@board[6]}  |  #{@@board[7]}  |  #{@@board[8]}"
        puts "\n"
    end

    def game_start
        puts "Time for some Tic Tac Toe! Enter your name player 1: \n"
        player1 = gets.chomp
        puts "Would you like to be X or O #{player1}?"
        symbol1 = gets.chomp.upcase
        player_one = Players.new(player1, symbol1)
        puts "And a name for player 2: \n"
        player2 = gets.chomp
        symbol2 = player_one.symbol == "X" ? "O" : "X"
        player_two = Players.new(player2, symbol2)
        puts "\n"
        puts "Okay #{player_one.name}, you're up. Make a move."
        display_board
        make_moves(player_one, player_two)
    end

    def make_moves(player_one, player_two)
        until @@count == 9

            puts "Pick a number from the grid above #{player_one.name}"
            move = gets.chomp.to_i - 1
            check_square(move, player_one, player_two)
            @@board[move] = player_one.symbol
            @@count += 1
            display_board

            puts "Pick a number from the grid above #{player_two.name}"
            move = gets.chomp.to_i - 1
            check_square(move, player_one, player_two)
            @@board[move] = player_two.symbol
            @@count += 1
            display_board
        end
    end

    def check_square(move, player_one, player_two)
        if @@board[move] == "#{player_one.symbol}" || "#{player_two.symbol}"
            puts "That number is taken, pick another!"
            move = gets.chomp.to_i - 1
        else
            return
        end
    end

end

game = Game.new
game.game_start

1 Ответ

2 голосов
/ 29 апреля 2020

Проблема, с которой вы сталкиваетесь, заключается в условной логике c в вашем методе check_square.

@@board[move] == "#{player_one.symbol}" || "#{player_two.symbol}"

В этой логике c предполагается проверить, является ли какой-либо из символов игроков хранится на доске в выбранной позиции. Однако на самом деле он проверяет, хранится ли символ игрока на доске в этой позиции, а если нет, то строковый литерал для символа игрока два оценивается как достоверный. В результате check_square всегда возвращается true

Попробуйте вместо этого:

@@board[move] == "#{player_one.symbol}" || @@board[move] == "#{player_two.symbol}"

Для большей идиоматизации c ruby вы можете удалить интерполяцию который не нужен, так как символ уже является строкой.

@@board[move] == player_one.symbol || @@board[move] == player_two.symbol
...