2015-09-14 65 views
0

我正在构建一个井字棋游戏,以在命令行中播放。在井字棋游戏中,nil:NilClass(NoMethodError)的未定义方法`[]'

module TicTacToe 
    class Player 
    attr_accessor :symbol 

    def initialize(symbol) 
     @symbol = symbol 
    end 

    end 

    class Board 
    attr_reader :spaces 

    def initialize 
     @spaces = Array.new(9) 
    end 

    def to_s 
     output = "" 
     0.upto(8) do |position| 
     output << "#{@spaces[position] || position}" 
     case position % 3 
     when 0, 1 then output << " | " 
     when 2 then output << "\n-----------\n" unless position == 8 
     end 
     end 
     output 
    end 

    def space_available(cell, sym) 
     if spaces[cell].nil? 
     spaces[cell] = sym 
     else 
     puts "Space unavailable" 
     end 
    end 
    end 

    class Game < Board 
    attr_reader :player1, :player2 

    def initialize 
     play_game 
    end 

    def play_game 
     @player1 = Player.new("X") 
     @player2 = Player.new("O") 
     puts Board.new 
     @current_turn = 1 
     turn 
    end 

    def move(player) 
     while victory != true 
     puts "Where would you like to move?" 
     choice = gets.chomp.to_i 
     space_available(choice, player.symbol) 
     puts Board 
     @current_turn += 1 
     turn 
     end 
    end 

    def turn 
     @current_turn.even? ? move(@player2) : move(@player1) 
    end 

    def victory 
     #still working on this 
    end 

    end 

end 

puts TicTacToe::Game.new 

即取一个用户的小区的选择(space_available),并改变与他们的片('X''O')阵列的方法,是给我一个错误。我找不到为什么我的代码抛出这个特定的错误。

+2

也应该是'提出self',而不是'把Board' –

+0

有什么错误你得到? – sawa

+0

@sawa错误阅读'tic_tac_toe.rb:34:在'space_available':未定义方法\'[]'为零:NilClass(NoMethodError)' – scobo

回答

1

的问题是,你不调用父类的构造在Game类,因此@spaces未初始化。

你的层次决策是值得商榷的,但要使其工作,你可以简单地将Game构造改变为:

def initialize 
    super 
    play_game 
end 
+0

最好有疑问:) –

+0

@SergioTulentsev,非常非常:) – ndn

+0

谢谢@ndn。这对我有效。这不在我的问题的范围之内,但是你能解释一下你的意思吗?你是指从Board类继承的Game类吗? – scobo

1

您正在致电spaces[cell]。错误是告诉你,你在nil上调用[],这意味着spaces必须为零。

也许你的意思是@spaces?否则 - 您需要告诉程序如何定义spaces以及它是如何初始化的。一个简单的spaces = {} unless spaces会工作

初始化你spaces变量将是超级调用的另一种方式,当你初始化游戏:

class Game < Board 
    attr_reader :player1, :player2 

    def initialize 
     super 
     play_game 
    end 
    ... 
+0

'attr_reader'负责定义'空格' –

+0

也许 - 但它是未初始化。游戏子类初始化程序不会调用超级 – Yule

+0

是的,这是真的。 –

相关问题