我想在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
而不是使用正確的問題。 現在我的程序正常運行。感謝他們。
因此,它在這條線上剔除? '除非@ grid.keys.include?(空格)' – 2014-10-07 00:32:16
確切,我不明白爲什麼,因爲我的'@ grid'散列的關鍵值從1到9,所以輸入「1」或「3」或什麼都應該工作......或不。我不知道在這一點上。 – Cyzanfar 2014-10-07 00:34:21
爲什麼你將網格存儲在散列表中?你並沒有把它當作散列來使用。所有你需要的是九個值 - 一個數組會很好。您的輸入驗證應該只是檢查一個數字,例如'if space!〜/^\ d $ /'或'unless('1'。'9')。include?空間' – 2014-10-07 00:41:24