【问题标题】:Tic Tac Toe Help fixing method that checks if square has already been chosen. Game board is structured as empty arrayTic Tac Toe Help 修复方法,检查是否已经选择了正方形。游戏板结构为空数组
【发布时间】:2020-04-29 03:22:37
【问题描述】:

我正在使用 Ruby 在命令行中创建一个井字游戏。我有一个方法 display_board 在命令行中将我的数组显示为游戏板,当我玩游戏时,玩家可以在 1-9 之间进行选择,并用他们的“符号”填充正方形。我创建了一个方法 check_square 来验证网格中的一个正方形是否已经被占用,但它对我来说不能正常工作。我开始游戏,一切正常,直到它要求我选择我在网格上的第一个数字。它立即响应并告诉我该号码已被占用,即使这是游戏的第一步。它要求我选择另一个数字,并在第二次尝试时填充网格。它在每个玩家移动时都会这样做。这个逻辑对我来说似乎很有意义,我一直试图弄清楚一个小时,但我显然忽略了一些东西。任何朝着正确方向的推动都会有所帮助!

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

【问题讨论】:

  • 请确保构造一个minimal reproducible example。请注意,所有这三个词都很重要:它应该只是一个示例,您不应该发布整个实际代码,而应该创建一个简化的示例来演示您的问题。此外,它应该是minimal,即它不应该包含任何不是绝对需要证明问题的东西。 (大多数初学者的问题可以用不到 5 行简单的代码来演示,你的只有 1 行。)而且它应该是reproducible,这意味着如果我复制&粘贴并运行代码,我应该会看到与您看到的完全相同的问题。
  • 该代码确实满足最小可重现示例的要求。我能够复制和粘贴代码,看到它显示出所描述的确切问题并对其进行调试。
  • @Genzume:OP 发布的代码取决于用户输入,但 OP 并未在问题中包含用于重现问题的输入。问题应该至少包括输入,但理想情况下,应该重写代码,以便根本不需要任何用户交互。这就是它无法重现的原因。然后,OP 发布了超过 60 条 SLOC,而事实上,一行就足以重现问题,这就是它不是最小的原因。最后,看起来代码只是整个生产代码,根本不是示例。

标签: ruby methods tic-tac-toe


【解决方案1】:

您遇到的问题是 check_square 方法中的条件逻辑。

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

此逻辑假设检查是否有任何玩家的符号存储在所选位置的板上。然而,它真正做的是检查玩家一号的符号是否存储在板上的那个位置,如果不是,那么玩家二号的字符串文字被评估为真。这导致check_square总是返回true

试试这个:

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

对于更惯用的 ruby​​,您可以删除不必要的插值,因为 symbol 已经是一个字符串。

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

【讨论】:

    猜你喜欢
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多