以下是我的代码。我试图只包含我认为可能存在问题的代码。
类 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