我写了一个tic-tac-toe程序,它是用户与用户。代码中有一个while循环,它可以反复运行。但是,当有人获胜时,这个循环不会中断。有什么建议吗?
这是我的代码:
class Game
def initialize
@board=Array.new
@board[1]="__|"
@board[2]="__"
@board[3]="|__"
@board[4]="\n__|"
@board[5]="__"
@board[6]="|__"
@board[7]="\n |"
@board[8]=" "
@board[9]="| "
@turn="x"
@win_status = false
end
def win_status
return @win_status
end
def show_board
@board.each do |i|
print i
end
end
def set_turn #switches turns
if @turn == "x"
@turn = "o"
else @turn == "o"
@turn = "x"
end
end
def make_move
puts "Enter x coordinate"
x=gets.to_i
puts "Enter y coordinate"
y=gets.to_i
@board[1]="_"+@turn+"|" if y==1 && x==1
@board[2]="_"+@turn if y==2 && x==1
@board[3]="|_"+@turn if y==3 && x==1
@board[4]="\n_"+@turn+"|" if y==1 && x==2
@board[5]="_"+@turn if y==2 && x==2
@board[6]="|_"+@turn if y==3 && x==2
@board[7]="\n "+@turn+"|" if y==1 && x==3
@board[8]=" "+@turn if y==2 && x==3
@board[9]="|"+@turn+" \n" if y==3 && x==3
end
def win_combo
@win_combo = [*[@board[1][1] + @board[2][1] + @board[3][2]], [@board[4][2] + @board[5][1] + @board[6][2]], [@board[7][1] + @board[8][1] + @board[9][1]],[@board[1][1] + @board[4][2] + @board[7][1]], [@board[2][1] + @board[5][1] + @board[8][1]], [@board[3][2] + @board[6][2] + @board[9][1]], [@board[1][1] + @board[5][1] + @board[9][1]], [@board[3][2] + @board[5][1] + @board[7][1]]]
end
def check_win
#if some row or column or diagonal is "xxx" or "ooo" then set @win_status = true
@win_combo.each do |str|
if str == "xxx" or str == "ooo"
@win_status = true
end
end
puts @win_status
end
end
g = Game.new
while g.win_status != true
g.set_turn
g.make_move
g.show_board
g.win_combo
g.check_win
end
答案 0 :(得分:1)
您不会检查是否赢了(check_win
)并且您没有更改@win_combo
while g.win_status != true
#puts g.check_win
g.set_turn
g.make_move
g.show_board
g.win_combo #this line
g.check_win #and this line
end
在@win_combo中假设是字符串数组而不是字符串数组。 例如,您的旧代码:
[["ooo"], ["_xx"], [" "], ["o_ "], ["ox "], ["ox "], ["ox "], ["ox "]]
新的:
["ooo", ["_x_"], [" "], ["o_ "], ["ox "], ["o_ "], ["ox "], ["ox "]]
只需在开头添加*
广告(就像我在这里所做的那样)或者只是不做数组:
@win_combo = [*[@board[1][1] + @board[2][1] + @board[3][2]], [@board[4][2] + @board[5][1] + @board[6][2]], [@board[7][1] + @board[8][1] + @board[9][1]],[@board[1][1] + @board[4][2] + @board[7][1]], [@board[2][1] + @board[5][1] + @board[8][1]], [@board[3][2] + @board[6][2] + @board[9][1]], [@board[1][1] + @board[5][1] + @board[9][1]], [@board[3][2] + @board[5][1] + @board[7][1]]]
好的,*
仅适用于第一个阵列,我的不好。
这是一个正确的版本。
您可以看到我放置()
而不是[]
的位置;通过这个我制作了一系列字符串。
此外,您在以下组合中检查了错误的位置。
@win_combo = [
(@board[1][1] + @board[2][1] + @board[3][2]), # ok
(@board[4][2] + @board[5][1] + @board[6][2]), # ok
(@board[7][2] + @board[8][1] + @board[9][1]), # this # [7][2] not [7][1]
(@board[1][1] + @board[4][2] + @board[7][2]), # this # [4][2] not [4][1]; [7][2]
(@board[2][1] + @board[5][1] + @board[8][1]), # ok
(@board[3][2] + @board[6][2] + @board[9][1]), # ok
(@board[1][1] + @board[5][1] + @board[9][1]), # ok
(@board[3][2] + @board[5][1] + @board[7][2]) # this [7][2] not [7][1]
]
puts "\n#@win_combo\n"
@win_combo
end
PS。 puts "\n#@win_combo\n"
用于限制您的申请。在发行版中删除它。