Tic-Tac-Toe帮助修复方法,检查是否已经选择了方形.游戏板的结构为空阵列



我正在使用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

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

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

假设该逻辑用于检查玩家的符号是否存储在所选位置的棋盘上。然而,它真正要做的是检查玩家一的符号是否存储在该位置的棋盘上,如果不是,那么玩家二的符号的字符串文字将被评估为真实的。这导致check_square总是返回true

试试这个:

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

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

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

相关内容

最新更新