2015-01-21 4 views
0

잠시 후 나는 Codecademy - Python 트랙을 만들고 간단한 전함 게임을 만들었습니다. 저는 지금 루비를 배우면서 파이썬에서 루비로 게임을 변환하려고했습니다. 지금까지 번역에서 잘 해왔지만이 시점에서 플레이어가 이미 추측 한 보드에 "X"를 인쇄하려고했습니다. 나는 여러 가지 방법으로 놀았지만 지금까지는 내 목표를 달성하지 못했습니다.Ruby에서 간단한 전함 게임 만들기

내가 변환하는 데 문제가 특정 라인은 다음과 같습니다 board[guess_row][guess_col] = "X"

여기에 전체 게임 코드 (내가 알고 다른 부분은 여전히뿐만 아니라 변경해야하지만, 질서를 통과 한거야 그리고이되었습니다 내 지금까지 중단 점, 더 이상의 팁 또한 매우 감사합니다!) :

편집 : 정보 주셔서 감사합니다, 나는 그것을 얻을 수 있었고 모든 도움으로 상상할 수 있었다! 덧글이 지적한대로 지금 나는 그냥 .. 거기에 종료 방법을 넣어하는 방법을 알아 내기 위해

def play_battleship 

    board = Array.new(10) { Array.new(10, "O") } 

    def print_board(board) 
    board.each do |r| 
     puts r.map { |p| p }.join(" ") 
    end 
    end 


    puts "Let's play Battleship!\n-----\nYou have 10 tries!\n-----" 
    print_board(board) 
    def random_row(board) 
     return rand(10) 
    end 

    def random_col(board) 
     return rand(10) 
    end 

    ship_row = random_row(board) 
    ship_col = random_col(board) 
    #puts ship_row ##debugging purposes 
    #puts ship_col ## ^^^^ 


    for turn in 1..10 
    puts "Turn: #{turn}" 
    puts "Guess Row (0-9): " 
    guess_row = gets.chomp.to_i 
    puts "Guess Collumn (0-9): " 
    guess_col = gets.chomp.to_i 
    if turn == 10 
     puts "------\nGame Over!\nThe Battleship coordinates were:#{ship_row},#{ship_col}" 
     break 
    elsif (guess_row == ship_row) && (guess_col == ship_col) 
     puts "Congratulations! You sunk my battleship!" 
     break 
    else 
     if ((guess_row < 0) || (guess_row > 9)) || ((guess_col < 0) || (guess_col > 9)) 
      puts "Oops, that's not even in the ocean." 
     elsif(board[guess_row][guess_col] == "X") 
      puts "You guessed that one already." 
     else 
      puts "You missed my battleship!" 
      board[guess_row][guess_col] = "X" 
       #if turn == 10 
       # puts "Game Over\nThe Battleship coordinates were:#{ship_row},#{ship_col}" 
       # break 
       #end 
     end 
    end 
    print_board(board) 
    end 
end 
play_battleship 
+1

다차원 배열에서 이것을 참조하십시오 : http://www.ehow.com/how_2091651_create-multidimensional-array-ruby.html 아직 만들어 보지 않았습니다 –

+2

보드가 2 차원 배열이 아니며 단지 10 개입니다 . 'board = []'그럼'board 10 times {board << ("0"* 10)}' – Jordan

+0

정보 녀석 들께 감사드립니다. – Tom

답변

2

현재 문제가 필요합니다, 당신은 당신의 보드와 같은 단일 차원 배열을 사용하고 있다는 점이다. 즉, board[guess_row][guess_col]으로 전화하면 nil이됩니다.

nil입니까? board[guess_row]은 문자열 'O'이기 때문에. 'O'[guess_col]은 여전히 ​​유효한 코드입니다. guess_col 문자열의 문자를 요구합니다. 그러나 문자열의 길이가 한 문자이기 때문에 0보다 큰 모든 색인은 nil이됩니다.

board을 정의하는 방법을 변경하여 시작해야합니다. 실제로는 다차원 배열이거나 '행'문자열에 원하는만큼의 문자가 포함되도록해야합니다.

이 더 팁을 요구하기 때문에

, 여기에 몇 가지 고려의 :

Fencepost 오류 : 배열 (및 문자열) 루비 제로 인덱싱됩니다. 보드가 10 요소 배열 인 경우 행은 board[0]부터 board[9]까지입니다. 코드에 숫자 대신 board[1] ~ board[10]을 입력하면 문제가 발생합니다. 예를 들어, 'Battleship'이있는 임의의 값을 선택하면 rand(10)이 0에서 9까지 약간의 임의의 정수를 반환합니다. rand(10) 일 때 rand(1..10)을 사용하면 열이있는 배열에서 a[10]을 호출합니다. 요소 (0에서 9까지의 인덱스)는 예외를 생성하지 않으며 단지 (추측 한 것입니다) nil입니다.

개체 참조 :Array.new(10, Array.new(10,'O'))과 같이 보드를 정의 할 수 있습니다. 그렇게했다면 재미있는 문제가 생길 것입니다 ... 하나의 원소를 'X'로 설정하면 해당 열의 모든 원소가이됩니다. 도 마찬가지입니다. Ruby는 먼저 'inner'배열을 정의한 다음, 보드의 모든 요소를 ​​동일한 배열에 설정합니다. 소중한 학습 경험이기 때문에 거의 언급하지 않았지만, 독자에게 운동으로 이러한 상황을 피하는 방법을 생각해 봤으면합니다.

마지막으로 루비스트는 for 대신에 .each을 사용합니다. 프롬프트에 puts 대신 print을 사용하면 줄 바꿈이 삽입되지 않습니다.Ruby는 명시적인 return 문을 필요로하지 않습니다. 메서드의 마지막 행의 값을 반환합니다. 전체 프로그램을 방법 (아마도 play)으로 만드십시오.

+0

도움에 감사드립니다! – Tom