A mi de gráficos se me da poco pero si estuviera haciendo algo como lo que explicas comenzaría así:
Para empezar me olvidaría de los TShape y usaría: un TPaintBox para presentar la imagen al jugador y tres TBitmap, uno para guardar la imagen original del mar y otros dos para las figuras de aciertos y fallos y una matriz (un array cuadrado) de enteros para representar en código las celdas de la imagen.
Cada celda de la matriz podría tener uno de tres valores:
0 - Nada (no se ha 'tirado' ahí)
1 - Acierto
2 - Fallo
En el evento OnPaint del TPaintBox copias el bitmap del mar primero y luego los bitmaps de aciertos y fallos sobre las celdas adecuadas según indique la matriz. Algo así como:
Código Delphi
[-]
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
I, J: Integer;
begin
CopiaFondo;
for I := 1 to NumFilas do
for J := 1 to NumColumnas do
case Matriz[I, J] of
1: CopiaCuadro(bmpAcierto, I, J);
2: CopiaCuadro(bmpFallo, I, J);
end;
end;
Claro que la parte difícil es la de las rutinas CopiaFondo y CopiaCuadro. En ambos casos podrías usar el método CopyRect del Canvas del PaintBox que copia parte de otro canvas en él mismo. Este método tiene estos parámetros:
Dest: TRect;
Canvas: TCanvas;
Source: TRect
Dest es la porción sobre la que vas a copiar el otro canvas. En el caso de CopiaFondo abarcaría todo el PaintBox y en el caso de CopiaCuadro abarcaría sólo el rectángulo en tu imagen que corresponda a las coordenadas I, J. Tendrás que calcularlo a partir de las medidas de cada celda.
Canvas es el canvas que contiene la imagen que vas a copiar. En este caso sería el canvas de los TBitmap.
Source es el rectángulo del canvas origen que vas a copiar. En este caso sería un rectángulo que abarque todo el bitmap.
No sé que tan buena o mala sea esta técnica pero es una idea para empezar.
// Saludos