Ruby NoMethodError语言 - 未定义的方法



以下是我的代码。我试图只包含我认为可能存在问题的代码。

Ship 包含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

类委员会在获取状态时调用,并包含范围被占用:

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(!@gameBoard[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

Game调用getBoard()randomizeFleet,问题的开始:

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. CPUn2. CPU vs. CPUn"
    puts '---------------------------------------------------------'
    print "Please select a gamemode (1/2):n: "
    gamemode  = gets.chomp
    @p2.getBoard().randomizeFleet()

当我尝试运行我的代码时我收到错误:

board:89:in rangeIsOccupied': undefined method getStatus' for nil:NilClass (NoMethodError(

我想克服这个问题。

如果您不确定@gameBoard[(y1*10)+x1]将返回一个 ship 实例,那么您可以在条件中添加另一个子句,例如:

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

最新更新