문제

나는 tic-tac-toe 프로그램을 작성했습니다.제가 만든 보드는 다음과 같습니다.

1  __|__|__
2  __|__|__
3    |  |  

제가 좌표를 설정한 방식은 첫 번째 상자가 (1,1), 두 번째 상자가 (1,2), 세 번째 상자가 (1,3), 네 번째 상자가 (2,1) 등이 되는 것입니다.사용자가 이를 명확히 알 수 있도록 측면에 1, 2, 3을 썼습니다.또한 보드 상단에 1, 2, 3을 추가하고 싶습니다.이 작업을 수행하는 방법에 대한 도움이 필요합니다.

내 코드는 다음과 같습니다.

class Game

        def initialize
                @board=Array.new
                @board[1]="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"
도움이 되었습니까?

해결책

귀하의 show_board 기능을 사용하면 인쇄할 수 있습니다. 1 2 3 거기

def show_board
    puts "   1 2 3"
    @board.each do |i|
        print i
    end
    puts ""

아니면 다음의 일부로 가질 수도 있습니다. initialize 그리고 make_move 다음으로 차단

@board[1]="   1 2 3\n" + "1  __|"

참고 사항:이내에 show_board 기능 대신 @board.each .. end 블록, 당신은 사용할 수 있습니다

@board.each {|i| print i}

다른 팁

우리는 제안을하고 있기 때문에, 이렇게 움직이는 방법을 변화시키지 않으려면이

 def make_move(*coords)
       case coords
         when [1,1]    
           @board[1]="1  _"+@turn+"|"
         when [2,1]
           @board[2]="_"+@turn
         when [3,1]
           @board[3]="|_"+@turn
         #...... you get the point 
end
.

다음 풋을 여기에서 여기로 이동

g = Game.new
while g.check_win != true
    g.show_board
    g.set_turn
    putc "Enter x coordinate: "
    x=gets.to_i
    putc "Enter y coordinate: "
    y=gets.to_i
    g.make_move(y,x)
end
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top