0

我写了一个用户与用户的井字游戏程序。代码中有一个 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
4

1 回答 1

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

附言。puts "\n#@win_combo\n"用于调试您的应用程序。在发布版本中删除它。

于 2013-11-13T23:32:47.337 回答