Huhu.
Ich bin derzeit am programmieren von Schiffe versenken für meinen Taschenrechner, den wir in der Schule nutzen (TI nSpire CX CAS). Funktioniert soweit alles so, wie ich es will, nur macht mir eine Sache Probleme. Ich schaffe es nicht, die Schiffe des Computerspielers zufällig zu platzieren.
Mein Code (Ausschnitt):
Wenn ich das am PC ausführe, sagt der Emulator gar nichts mehr, er scheint in einer Endlosschleife gefangen zu sein. Ich hab schon andere Methoden versucht, aber die obige ist die letzte abgespeicherte. Die Methoden der Klasse Ship funktionieren alle. Ich führe alle Tests zur Einhaltung der Schiffsplatzierungsregeln mit Pixelpositionsvergleichen durch, die funktionieren auch. Ich habe somit keine 2d-Arrays mit den Schiffsplatzierungen! Was ich vermute, ist, dass ich irgendwas bei den Bedingungen der Schleifen falsch gemacht habe, aber was das ist, erschließt sich mir nicht.
Kann mir da jemand helfen bzw. einen anderen Ansatz geben?
Ich bin derzeit am programmieren von Schiffe versenken für meinen Taschenrechner, den wir in der Schule nutzen (TI nSpire CX CAS). Funktioniert soweit alles so, wie ich es will, nur macht mir eine Sache Probleme. Ich schaffe es nicht, die Schiffe des Computerspielers zufällig zu platzieren.
Mein Code (Ausschnitt):
Code:
local fieldLength = 13
local length = 140
local ships = {}
local enemyShips = {}
local shipSizes = {5,4,4,3,3,3,2,2,2,2}
local Ship = class() ...
...
function placeEnemyShips()
local i = 1
local count = 0
local lastShip
while i < #shipSizes+1 do
print(tostring(count).."|"..tostring(i))
local nShip = getEnemyShip(i, shipSizes[i])
if nShip == nil or lastShip == nShip then
i = i - 2
else
enemyShip[i-1] = lastShip
lastShip = nShip
if i-1 == #shipSizes then
enemyShip[i] = nShip
end
end
i = i + 1
count = count + 1
end
end
function getEnemyShip(id, blocks)
local nShip = Ship(id, blocks, 3*w/4-length/2+math.floor(math.random(0,9))*(fieldLength+1), h/2-length/2+math.floor(math.random(0,9))*(fieldLength+1))
if tonumber(math.random()) then
nShip:rotate()
end
local i = 0
local abort = false
while not (nShip:isPlaceable() and nShip:isOnGrid(3*w/4-length/2, (h-length)/2)) and not abort do
nShip:move(3*w/4-length/2+math.floor(math.random(0,9))*(fieldLength+1), h/2-length/2+math.floor(math.random(0,9))*(fieldLength+1))
i = i + 1
if i > 20 then
nShip:rotate()
elseif i > 40 then
abort = true
end
end
if abort then
return nil
end
return nShip
end
Kann mir da jemand helfen bzw. einen anderen Ansatz geben?