未定义的方法`keys';为零:tic-tac-toe游戏RUBY中的NilClass

未定义的方法`keys';为零:tic-tac-toe游戏RUBY中的NilClass,ruby,Ruby,我正在尝试用Ruby构建一个简单的2人tic-tac-toe游戏。 代码如下: 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

我正在尝试用Ruby构建一个简单的2人tic-tac-toe游戏。 代码如下:

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'] ==@grid['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
class Morpion
def初始化
创建网格
得到你的球员
显示网格
结束
def get_播放器
放上“让我们玩一些井字游戏”
放置“”
@player1='X'
@player2='O'
放置“”
放入“您想移动到哪里?(查看下面的网格,键入任何数字1-9以放置您的符号):”
放入“1 | 2 | 3”
放入“--+--+--”
放入“4 | 5 | 6”
放入“--+--+--”
把“7 | 8 | 9”
结束
def创建网格
@网格={
'1' => ' ',
'2' => ' ',
'3' => ' ',
'4' => ' ',
'5' => ' ',
'6' => ' ',
'7' => ' ',
'8' => ' ',
'9' => ' '
}
结束
def显示网格
放置“”
将“#{@grid['1']}|{@grid['2']}|{@grid['3']}”
放置“-----”
将“#{@grid['4']}|{@grid['5']}|{@grid['6']}”
放置“-----”
将“#{@grid['7']}|{@grid['8']}|{@grid['9']}”
放置“”
结束
def播放
圈数=1
当数字_小于10时
匝数?奇数?玩家回合(@player1):玩家回合(@player2)
游戏检查器
如果游戏检查
打破
结束
匝数+=1
结束
结束
def播放机U形转弯(播放机)
放置玩家=='X'?“轮到X了!”:“轮到O了!”
放置“”
cell=get.chomp
除非@grid.keys.include?(单元格)#检查用户是否输入了与网格对应的数字
放置“”
放入“必须是1到9之间的数字”
游戏者(游戏者)
结束
如果@grid[cell]=''#检查网格中的单元格是否为空,以便用户输入
@网格[单元]=播放器
其他的
放置“”
放入“该单元格已被占用。请重新选择!”
游戏者(游戏者)
结束
显示网格
结束
游戏检测器
结束游戏=错误
如果@grid['1']!=''&&@网格['5']!=''&&@网格['9']!=''
如果(@grid['1']==@grid['2']&&&grid['1']==@grid['3']))
结束游戏=正确
胜利=@grid['1']
elsif(@grid['4']==@grid['5']&&&grid['4']==@grid['6'])
结束游戏=正确
胜利=@grid['4']
elsif(@grid['7']==@grid['8']&&&grid['7']==@grid['9'])
结束游戏=正确
胜利=@grid['7']
elsif(@grid['1']==@grid['4']&&&grid['1']==@grid['7'])
结束游戏=正确
胜利=@grid['1']
elsif(@grid['2']==@grid['5']&&&grid['2']==@grid['8'])
结束游戏=正确
胜利=@grid['2']
elsif(@grid['3']==@grid['6']&&&grid['3']==@grid['9'])
结束游戏=正确
胜利=@grid['3']
elsif(@grid['1']==@grid['5']&&&grid['1']==@grid['9'])
结束游戏=正确
胜利=@grid['1']
elsif(@grid['3']==@grid['5']&&&grid['3']==@grid['7'])
结束游戏=正确
胜利=@grid['3']
其他的
结束游戏=错误
结束
结束
如果结束游戏
“这场比赛的赢家是#{胜利}”
返回真值
结束
结束
结束
m=Morpion.new
m、 玩
所以我的问题是: 1.我要求玩家在1到9的网格中添加他的符号(X或O)(因为有9个单元格)

  • 例如,如果输入1,即左上角的单元格,则会出现以下错误:

    (eval):187:nil:NilClass(NoMethodError)的未定义方法“key”
    from(eval):168:in'play'
    from(eval):245

  • 如果你想运行这个程序,我建议使用

    编辑: 如上所述的问题是,我使用了不正确的构造函数方法
    init
    ,而不是使用正确的方法:
    initialize

    现在我的程序工作了。多亏了它们。

    您可以在名为
    init
    的方法中初始化
    @grid
    哈希。当您构造
    Game
    的新实例时,Ruby不会调用此方法。您应该将
    init
    方法重命名为
    initialize
    ,这将由Ruby自动调用。

    您可以在名为
    init
    的方法中初始化
    @grid
    哈希。当您构造
    Game
    的新实例时,Ruby不会调用此方法。您应该将
    init
    方法重命名为
    initialize
    ,这将由Ruby自动调用。

    您可以在名为
    init
    的方法中初始化
    @grid
    哈希。当您构造
    Game
    的新实例时,Ruby不会调用此方法。您应该将
    init
    方法重命名为
    initialize
    ,这将由Ruby自动调用。

    您可以在名为
    init
    的方法中初始化
    @grid
    哈希。当您构造
    Game
    的新实例时,Ruby不会调用此方法。您应该将
    init
    方法重命名为
    initialize
    ,这将由Ruby自动调用。

    问题是您的
    @grid
    变量从未被创建;它是
    nil
    。因此出现错误消息,您试图调用
    nil
    对象上的方法


    造成您的问题的原因是您错误地命名了构造函数方法。在Ruby中,构造函数被命名为
    initialize
    ,而您将其命名为
    init
    。将它重命名为正确的名称,它应该可以工作。

    问题是,
    @grid
    变量从未被创建;它是
    nil
    。因此出现错误消息,您试图调用
    nil
    对象上的方法

    造成您的问题的原因是您错误地命名了构造函数方法。在俄罗斯