当用户在tic-tac-toe中输入一个坐标时,我该如何处理?

时间:2013-11-18 00:47:27

标签: ruby-on-rails ruby ruby-on-rails-3 class tic-tac-toe

我正在写一个tic-tac toe程序。现在,用户可以覆盖一个正方形。此外,当用户输入不在板上的坐标时,它会跳过那些人转动的坐标。我想让我的程序说出当用户输入一个采用的坐标或一个不在板上的坐标时,“你输入的坐标已被采用或无效”。然后程序需要给用户另一个输入他/她坐标的机会。有什么建议吗?

这是我的代码:

class Game

        def initialize
                @board=Array.new
                @board[1]="  1   2   3\n" + "1  __|"
                @board[2]="__"
                @board[3]="|__"
                @board[4]="\n2  __|"
                @board[5]="__"
                @board[6]="|__"
                @board[7]="\n3    |"
                @board[8]="  "
                @board[9]="|  "
                @turn="x"
                @win_status = false
        end

        def turn
                @turn
        end

        def show_board
                @board.each do |i|
                        print i
                end
                puts ""
        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]="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
                return [[@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
                self.win_combo.each do |arr|
                        str = arr.join
                        if str == "xxx" or str == "ooo"
                                return true
                        end
                end
                return false
        end
end


g = Game.new
while g.check_win != true
        g.show_board
        g.set_turn
        g.make_move
end
puts "won"

1 个答案:

答案 0 :(得分:0)

尝试更改您拥有的每一行

@board[1]="1  _"+@turn+"|"   if y==1 && x==1

为:

if y==1 && x==1 && @board[1].eql?("  1  2  3\n" + "1 _|")
  @board[1] = "1 _" +@turn + "|" 

并使用elsif作为@board [2-9]。 @board [1] .eql?()部分是您初始化这些值的部分。在这一行的最后:

else
  make_move
end

现在它只会让你更改@board [x]的值,如果它尚未更改的话。如果没有满足任何条件来更改该值,它将再次运行make_move方法。最终的代码看起来应该是这样的

if y==1 && x==1 && @board[1].eql?("  1  2  3\n" + "1 _|")
  @board[1] = "1 _" +@turn + "|" 
elsif y==2 && x==1 && ...
  ...
else
  make_move
end