2017-05-11 6 views
-2

Das folgende ist mein Code. Ich habe versucht, nur den Code einzufügen, an dem ich das Problem vermute.Ruby NoMethodError - Undefinierte Methode

Klasse Ship enthält getStatus:

class Ship 
    def initialize(name, size, status, shipNumber, firedUpon) 
    @name = name 
    @size = size 
    @status = status 
    @shipNumber = shipNumber 
    @firedUpon = firedUpon 
    end 
    def setSize(nSize) 
    @size = nSize 
    end 
    def getSize 
    return @size 
    end 
    def setName(nName) 
    @name = nName 
    end 
    def getName() 
    return @name 
    end 
    def setStatus(nStatus) 
    @status = nStatus 
    end 
    def getStatus 
    return @status 
    end 
    def setFiredUpon(nFired) 
    @firedUpon = nFired 
    end 
    def getFiredUpon 
    return @firedUpon 
    end 
    def setShipNumber(nNum) 
    @shipNumber = nNum 
    end 
    def getShipNumber 
    return @shipNumber 
    end 
    def ==(rhs) 
    if (@name !=rhs.getName() || @size != rhs.getSize() || @status != rhs.getStatus() || @shipNumber != rhs.getShipNumber() || @firedUpon != rhs.getFiredUpon()) 
     return false 
    end 
    return true 
    end 
end 

Klasse Vorstand fordert getStatus und enthält rangeIsOccupied:

load 'ship.rb' 
class Board 
    def initialize() 
    @gameBoard = Array.new(100) 
    @Ships = Array.new(5) 
    #initialize all ships on board 
    r = 0 
    while(r < 100) 
     @gameBoard[r] = Ship.new('', -1, false, -1, false) 
     r = r + 1 
    end 

    @Ships[0] = Ship.new('Carrier', 5, true,0, false) 
    @Ships[1] = Ship.new('BattleShip', 4, true,1, false) 
    @Ships[2] = Ship.new('Cruiser', 3, true,2, false) 
    @Ships[3] = Ship.new('Submarine', 3, true,3, false) 
    @Ships[4] = Ship.new('Destroyer', 2, true,4, false) 

    end 
    def printBoard() 
    board_size = 10 
    alphabet = 'abcdefghijklmnopqrstuvwxyz' 
    puts 'x = hit ship' "\n" 'o = ship on board' "\n" 'm = empty space' "\n" 
    puts '---------------------------------------------------------' "\n" 
    puts ' |A| |B| |C| |D| |E| |F| |G| |H| |I| |J|' 

    s = 0 
    rownum = 0 
    printrow = true 
    while(s < 100) 
     if printrow 
     print rownum 
     print ' - ' 
     print ' ' 
     printrow = false 
     end 
     if @gameBoard[s].getShipNumber() != -1 && @gameBoard[s].getFiredUpon() 
     print 'x' 
     elsif([email protected][s].getStatus) 
     print 'm' 
     else 
     print 'o' 
     end 
     if s % 10 == 9 
     print "\n" 
     printrow = true 
     rownum = rownum + 1 
     else 
     print ' ' 
     end 
     s = s + 1 
    end 
    end 

    def isValidDirection(x1, y1, x2, y2) 
    if x1 == x2 || y1 == y2 
     return true 
    end 
    return false 
    end 

    def rangeIsOccupied(x1, y1, x2, y2) 
    #if horizontal 
    if(y1 == y2) 
     while(x1 != x2) 
     if @gameBoard[(y1*10)+x1]. 
      return true 
     end 
     if x1 > x2 
      x1 = x1 - 1 
     else 
      x1 = x1 + 1 
     end 
     end 
     if @gameBoard[(y1*10)+x1].getStatus 
     return true 
     end 
    else 
     while y1 != y2 
     if @gameBoard[(y1*10)+x1].getStatus 
      return true 
     end 
     if y1 > y2 
      y1 = y1 - 1 
     else 
      y1 = y1 + 1 
     end 
     end 
     if @gameBoard[(y1*10)+x1].getStatus 
     return true 
     end 
    end 
    return false 
    end 

Klasse Game Anrufe getBoard() und randomizeFleet, der Beginn der Problem:

load 'player.rb' 

class Game 
    def initialize() 
    @p1 = Player.new('', 1, true) 
    @p2 = Player.new('cpu', 2, false) 

    gamemode = 0 
    puts '---------------------------------------------------------' 
    print "Gamemodes:\n1. Player vs. CPU\n2. CPU vs. CPU\n" 
    puts '---------------------------------------------------------' 
    print "Please select a gamemode (1/2):\n: " 
    gamemode = gets.chomp 

    @p2.getBoard().randomizeFleet() 

Wenn ich versuche, meine codeI bekommen, den Fehler zu laufen:

Pension: 89: in rangeIsOccupied': undefined method getStatus' für nil: NilClass (NoMethodError)

Ich möchte dieses Problem überwinden, .

Antwort

0

, wenn Sie nicht sicher sind, dass @gameBoard[(y1*10)+x1] ein Schiff Instanz zurück, dann können Sie eine weitere Klausel zu Ihrem conditionals hinzufügen, wie:

if @gameBoard[(y1*10)+x1] && @gameBoard[(y1*10)+x1].getStatus 
Verwandte Themen