2014-10-07 60 views
0

我想在Ruby中構建一個簡單的2球員井字棋遊戲。 下面是代碼:未定義的方法`鍵'爲零:NilClass在井字棋遊戲RUBY

class Morpion 

    def init 
     create_grid 
     get_player 
     show_grid 
    end 
    def get_player 
     puts "Let play some Tic Tac Toe" 
     puts "" 
     @player1 ='X' 
     @player2='O' 
      puts "" 
      puts "Where would you like to move? (check out the grid below and type any number 1-9 to place your symbol): " 
      puts " 1 | 2 | 3 " 
      puts "---+---+---" 
      puts " 4 | 5 | 6 " 
      puts "---+---+---" 
      puts " 7 | 8 | 9 " 
    end 

    def create_grid 
     @grid = { 
      '1' => ' ', 
      '2' => ' ', 
      '3' => ' ', 
      '4' => ' ', 
      '5' => ' ', 
      '6' => ' ', 
      '7' => ' ', 
      '8' => ' ', 
      '9' => ' ' 
     } 
    end 

    def show_grid 
     puts "" 
     puts "#{@grid['1']}|#{@grid['2']}|#{@grid['3']}" 
     puts "-----" 
     puts "#{@grid['4']}|#{@grid['5']}|#{@grid['6']}" 
     puts "-----" 
     puts "#{@grid['7']}|#{@grid['8']}|#{@grid['9']}" 
     puts "" 
    end 

    def play 
     number_turns=1 
     while number_turns < 10 
     number_turns.odd? ? player_turn(@player1) : player_turn(@player2) 
     game_checker 
     if game_checker 
      break 
     end 
     number_turns+=1 
     end 
    end 

    def player_turn(player) 
     puts player == 'X' ? "It's X's turn!" : "It's O's turn!" 
     puts "" 
     cell = gets.chomp 
     unless @grid.keys.include?(cell) #check if the user entered a number corresponding to the grid 
      puts "" 
      puts "it has to be a number from 1 to 9" 
      player_turn(player) 
     end 
     if @grid[cell] == ' ' #check if cell in grid is empty for user input 
      @grid[cell] = player 
     else 
      puts "" 
      puts "That cell is occupied. Choose again!" 
      player_turn(player) 
     end 
     show_grid 
    end 

    def game_checker 
     end_game = false 
     if @grid['1'] != ' ' && @grid['5'] != ' ' && @grid['9'] != ' ' 
     if (@grid['1'] == @grid['2'] && @grid['1'] == @grid['3']) 
      end_game = true 
      victory = @grid['1'] 
      elsif (@grid['4'] == @grid['5'] && @grid['4'] [email protected]['6']) 
      end_game = true 
      victory = @grid['4'] 
      elsif (@grid['7'] == @grid['8'] && @grid['7'] == @grid['9']) 
      end_game = true 
      victory = @grid['7'] 
      elsif (@grid['1'] == @grid['4'] && @grid['1'] == @grid['7']) 
      end_game = true 
      victory = @grid['1'] 
      elsif (@grid['2'] == @grid['5'] && @grid['2'] == @grid['8']) 
      end_game= true 
      victory = @grid['2'] 
      elsif (@grid['3'] == @grid['6'] && @grid['3'] == @grid['9']) 
      end_game = true 
      victory = @grid['3'] 
      elsif (@grid['1'] == @grid['5'] && @grid['1'] == @grid['9']) 
      end_game = true 
      victory = @grid['1'] 
      elsif (@grid['3'] == @grid['5'] && @grid['3'] == @grid['7']) 
      end_game = true 
      victory = @grid['3'] 
      else 
      end_game = false 
     end 
     end 
     if end_game 
      puts "the winner of this game is #{victory}" 
      return true 
     end 
    end 


end 


m=Morpion.new 
m.play 

所以我的問題是這樣的:1。 我要求玩家在範圍從1到9的網格中添加自己的符號(X或O)(因爲有9細胞)

  • 如果我輸入1,例如,其是左上角的單元格我得到這個錯誤:

    (eval):187: undefined method `keys' for nil:NilClass (NoMethodError) from (eval):168:in `play' from (eval):245

  • 如果要運行這個程序,我建議使用THIS LINK

    編輯:initialize: 作爲@Paul@August指出的是,我使用了不正確的構造方法init而不是使用正確的問題。 現在我的程序正常運行。感謝他們。

    +1

    因此,它在這條線上剔除? '除非@ grid.keys.include?(空格)' – 2014-10-07 00:32:16

    +0

    確切,我不明白爲什麼,因爲我的'@ grid'散列的關鍵值從1到9,所以輸入「1」或「3」或什麼都應該工作......或不。我不知道在這一點上。 – Cyzanfar 2014-10-07 00:34:21

    +2

    爲什麼你將網格存儲在散列表中?你並沒有把它當作散列來使用。所有你需要的是九個值 - 一個數組會很好。您的輸入驗證應該只是檢查一個數字,例如'if space!〜/^\ d $ /'或'unless('1'。'9')。include?空間' – 2014-10-07 00:41:24

    回答

    1

    問題是您的@grid變量永遠不會被創建;它是nil。因此,錯誤消息,您正嘗試調用nil對象上的方法。

    您的悲哀的原因是您錯誤地使用了構造函數方法。在Ruby中,構造函數被命名爲initialize,但是您將其命名爲init。重命名爲正確的名稱,它應該工作。

    +1

    夥計...有時候答案只是在我面前直直,我看不到它。謝謝你的更正保羅。 – Cyzanfar 2014-10-07 00:41:39

    +1

    @Cyzanfar我知道這種感覺。馬克托馬斯在問題評論中提出了一個很好的觀點。你可能會更好地使用類似2維數組的東西(比如圖中的x和y值)。平面陣列也可以很好地工作。 – 2014-10-07 00:43:35

    +0

    我看到......這樣的事情:'@ grid = [[1,2,3],[4,5,6],[7,8,9]]' – Cyzanfar 2014-10-07 00:48:08

    2

    您使用名爲init的方法初始化@grid散列。當您構建Game的新實例時,Ruby將不會調用此方法。您應該將init方法重命名爲initialize,這將由Ruby自動調用。

    相關問題