未定义的方法`keys';为零:tic-tac-toe游戏RUBY中的NilClass
我正在尝试用Ruby构建一个简单的2人tic-tac-toe游戏。 代码如下:未定义的方法`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
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个单元格)
(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
对象上的方法
造成您的问题的原因是您错误地命名了构造函数方法。在俄罗斯