Tic Tac Toe 帮助修复方法,检查是否已选择正方形。游戏板结构为空数组
Tic Tac Toe Help fixing method that checks if square has already been chosen. Game board is structured as empty array
我正在使用 Ruby 在命令行中创建井字游戏。我有一个方法 display_board 在命令行中将我的数组显示为游戏板,当我玩游戏时,玩家可以在 1-9 之间选择并用他们的 "symbol" 填充方块。我创建了一种方法 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
always 返回 true
试试这个:
@@board[move] == "#{player_one.symbol}" || @@board[move] == "#{player_two.symbol}"
为了更加地道ruby,您可以删除不需要的插值,因为符号已经是一个字符串。
@@board[move] == player_one.symbol || @@board[move] == player_two.symbol
我正在使用 Ruby 在命令行中创建井字游戏。我有一个方法 display_board 在命令行中将我的数组显示为游戏板,当我玩游戏时,玩家可以在 1-9 之间选择并用他们的 "symbol" 填充方块。我创建了一种方法 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
always 返回 true
试试这个:
@@board[move] == "#{player_one.symbol}" || @@board[move] == "#{player_two.symbol}"
为了更加地道ruby,您可以删除不需要的插值,因为符号已经是一个字符串。
@@board[move] == player_one.symbol || @@board[move] == player_two.symbol