Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-02-2006
Chompiras Chompiras is offline
Miembro
 
Registrado: ene 2006
Ubicación: La plata, Argentina
Posts: 37
Poder: 0
Chompiras Va por buen camino
Arrow Posicionamiento de barcos en batalla naval

Tengo que hacer la batalla naval para una materia de mi facultad. Me pidieron que lo haga unicamente para jugar contra la maquina. El jugador puede elegir la cantidad y posicion de los barcos. El tema es que no se :
-Como mostrar los barcos de diferente longitud en la pantalla, para que el jugador pueda elegir los barcos de la longitud que desee
-Como hacer que el jugador pueda arrastar un barco de longitud x y ponerlo en una posicion del mapa.

Por favor a los que respondan traten de ser simples, ya que recien estoy empezando con delphi y no se mucho todavia.
Responder Con Cita
  #2  
Antiguo 04-02-2006
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Según dices tus conocimientos en Delphi son exiguos, por lo tanto creo que debieras orientarlo a utilizar una Rejilla del tipo StringGrid y colorear cuadritos que representarían a los barcos, guardas en una matríz las posiciones de los barcos que son las que menos ocupan y toda coordenada que no sea barco es agua.

Así solamente tenemos que buscar las coordenadas que da el jugador y buscarlas en la matriz, sino aparecen = AGUA.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 04-02-2006
Chompiras Chompiras is offline
Miembro
 
Registrado: ene 2006
Ubicación: La plata, Argentina
Posts: 37
Poder: 0
Chompiras Va por buen camino
Esa rejilla esta relacionada con bases de datos?? (por que no se nada de base de datos)
Responder Con Cita
  #4  
Antiguo 04-02-2006
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
No en absoluto es una rejilla para escribir texto fundamentalmente, mediante coordenadas.
Código Delphi [-]
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
StringGrid1.Cells[1,1] := 'X'
end;

Puedes representar por ejemplo a los barcos mediante X y cuando estén tocados sustituyes las X por O por ejemplo.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #5  
Antiguo 05-02-2006
Chompiras Chompiras is offline
Miembro
 
Registrado: ene 2006
Ubicación: La plata, Argentina
Posts: 37
Poder: 0
Chompiras Va por buen camino
Ah joya, entonces lo hago asi como dijiste vos. Gracias por responder.

Última edición por Chompiras fecha: 08-02-2006 a las 21:07:08.
Responder Con Cita
  #6  
Antiguo 08-02-2006
Chompiras Chompiras is offline
Miembro
 
Registrado: ene 2006
Ubicación: La plata, Argentina
Posts: 37
Poder: 0
Chompiras Va por buen camino
¿Complicando un poquito mas...es mucho mas dificil?

¿Es mucho mas complicado en vez de usar strings, usar imagenes (mar, barco, barco hundido)? ¿Lo de las imagenes se puede hacer en el stringgrid?......¿Si no se puede hacer en el stringgrid, cual tendria que usar?

Pd:Esto lo pregunto ya que como es para una materia de la facultad, quiero esmerarme un poco asi me dan una buena nota
Responder Con Cita
  #7  
Antiguo 08-02-2006
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Según el caso que expones yo terminaría el trabajo con el StringGrid y luego iniciaría otro con un DrawGrid, si acaso este segundo no lo llevas a buen término tendrás por lo menos el otro.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #8  
Antiguo 09-02-2006
Chompiras Chompiras is offline
Miembro
 
Registrado: ene 2006
Ubicación: La plata, Argentina
Posts: 37
Poder: 0
Chompiras Va por buen camino
Arrow Palabras sabias

Cita:
Empezado por marcoszorrilla
Según el caso que expones yo terminaría el trabajo con el StringGrid y luego iniciaría otro con un DrawGrid, si acaso este segundo no lo llevas a buen término tendrás por lo menos el otro.
Si la verdad que tenes razon en lo que decis. El que mucho abarca poco aprieta.
Gracias de nuevo
Responder Con Cita
  #9  
Antiguo 09-02-2006
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
Lightbulb Sugerencia

Cuando ya tengas resuelto el problema de posicionar los barcos a través de una matriz, tal vez quieras aventurarte a crear la interfaz gráfica; pero, como dice Marcos, primero resuelve el funcionamiento del juego y el resto es sólo la apariencia.

Mi sugerencia es que lo hagas simple, puedes utilizar un ImageList para guardar los iconos y escribir directamente sobre el Canvas de un PaintBox.

Te dejo un ejemplo adjunto para que te des una idea de como puedes lograr el efecto.

Si no te queda tiempo para dibujar los barquitos, prueba con esta suite de imagenes que puedes descargar gratuitamente.

SpriteLib GPL

Saludos y suerte.
Archivos Adjuntos
Tipo de Archivo: zip Tablero.zip (5,6 KB, 86 visitas)

Última edición por Héctor Randolph fecha: 09-02-2006 a las 20:13:44.
Responder Con Cita
  #10  
Antiguo 09-02-2006
Chompiras Chompiras is offline
Miembro
 
Registrado: ene 2006
Ubicación: La plata, Argentina
Posts: 37
Poder: 0
Chompiras Va por buen camino
Arrow Ok

De acuerdo hector, gracias por la ayuda.
Responder Con Cita
  #11  
Antiguo 09-02-2006
Chompiras Chompiras is offline
Miembro
 
Registrado: ene 2006
Ubicación: La plata, Argentina
Posts: 37
Poder: 0
Chompiras Va por buen camino
Arrow Nuevos inconvenientes

Estoy en la parte que el jugador elige donde quiere que vayan sus barcos. Esto lo hice como me suigirieron, poniendo x en donde el jugador quiera poner sus barcos. Lo cual lo hice haciendo (valga la redundancia) que en el evento selectcell se ponga una x en la celda elegida por el usuario para los barcos. El tema mio es el siguiente:
¿ Hay manera que la unica forma de selecionar una celda sea a traves del mouse ?

Otra cosa...¿ si el jugador se equivoca de posicion, como podria hacer para remover la x (o sea que evento del stringgrid deberia utilizar) ?
Responder Con Cita
  #12  
Antiguo 09-02-2006
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Como el StringGrid tiene unas coordenadas que tu ya conoces, puedes pedir al usuario en unos simples edits que ponga las coordenadas de sus barcos y botón para validad los datos, en tanto no valide se pueden corregir las mismas.

A la salida de cada edit, puedes limpiar mediante un ciclo todas las coordenadas y redibujarlas de nuevo, esto no llevará prácticamente tiempo y no se notará, de esta manera te garantizas que si corrige alguna se borren todas las X y tras acabar el ciclo del borrado recorres los edits y vuelves a pintarlas.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #13  
Antiguo 10-02-2006
Chompiras Chompiras is offline
Miembro
 
Registrado: ene 2006
Ubicación: La plata, Argentina
Posts: 37
Poder: 0
Chompiras Va por buen camino
Arrow

Yo ya tengo dos combobox que cada vez que cambia su valor se modifica el stringrid de acuerdo al nuevo tamaño. Ahora lo que quiero hacer es poner dos combobox mas para que el jugador pueda elegir la cantidad y longitud de los barcos. El tema es el siguiente:
Para hacer esto... ¿ aun es posible hacerlo con un stringrid ?...en donde yo veo la complicacion es en que, si el jugador tiene un barco de una longitud de 3, por ejemplo (aclaracion: el usuario debe elegir la misma longitud para todos los barcos) no se como hacer para que el usuario pueda elegir si quiere ponerlo vertical o horizontal sobre el mapa.

Otra cosa, yo tengo en el mismo formulario, la seleccion del tamaño del mapa, la configuracion de la cantidad y longitud de barcos, y el posicionamiento de los barcos en si... pero creo que estoy complicando la cosa...tal vez seria mejor que en un formulario tenga la seleccion del tamaño del mapa, la configuracion del tamaño y cantidad de barcos, y en el otro los posicione...¿verdad?

Lo ultimo, hector no entiendo esta parte del codigo que vos me pasaste (el del zip):

Código Delphi [-]
for j:=0 to 9 do
   for i:=0 to 9 do
   ImageList1.Draw(PaintBox1.Canvas,i*ANCHO,j*ALTO,Matriz[j,i]);

Pd: Hector, muy buena la suite de imagenes, lo unico malo es que no hay una de un barco. Igual me sirven bastante, ya que de ahi puedo sacar la imagen del mar y la de la explosion...EDIT: perdon, acabo de ver las imagenes de nuevo y encontre a los barcos, retiro lo dicho entonces.

Última edición por Chompiras fecha: 10-02-2006 a las 00:47:48.
Responder Con Cita
  #14  
Antiguo 10-02-2006
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
Espero no haberte confundido demasiado, la manera que a mi se me ocurrió para representar el tablero fue por medio de una matriz de NxN, en cada entrada puedes colocar un número digamos 0,1,2, etc. Estos números corresponden a un índice en la lista de imagenes que previamente tienes cargadas.

La matriz tiene esta apariencia.

0 1 0 0
0 0 0 0
0 0 2 0
0 0 0 0

De tal manera que en donde aparezca un número 0 se dibujara el fondo del mar y con los demás números se dibujarán otros objetos.

El código que te muestro a continuación transforma los valores de la matriz en coordenadas dentro del Canvas (lienzo) del control PaintBox.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
const
  ANCHO=32;  ALTO=32;
  MAR=0;  AVION=1;  EXPLOSION=2;
var
  i,j: Integer;
 Matriz: array [0..9, 0..9] of Integer;
begin
 for j:=0 to 9 do
   for i:=0 to 9 do
      Matriz[j,i]:=MAR; // Rellenar la matriz completa de ceros
 // Colocamos dos objetos en la matriz tan solo como ejemplo
 Matriz[8,8]:=AVION; // Colocar un objeto en la posición (8,8)
 Matriz[4,4]:=EXPLOSION; // Colocar otro objeto en la posición (4,4)

 // Dibujamos la matriz en el PaintBox
 for j:=0 to 9 do
   for i:=0 to 9 do
   ImageList1.Draw(PaintBox1.Canvas,i*ANCHO,j*ALTO,Matriz[j,i]);
end;

El doble for recorre todas las entradas de la matriz y uso el método Draw(Canvas,X,Y,Indice) del ImageList para dibujar la imagen sobre el canvas del PaintBox, observa que el indice se obtiene de las entradas de la matriz.

Bueno, esta podría ser una forma de representarlo pero no es la única.

Saludos
Responder Con Cita
  #15  
Antiguo 10-02-2006
Chompiras Chompiras is offline
Miembro
 
Registrado: ene 2006
Ubicación: La plata, Argentina
Posts: 37
Poder: 0
Chompiras Va por buen camino
Arrow

Ante nada, gracias por seguir respondiendo.

Ahora, lo que no entiendo de eso hector, es por que cuando haces el metodo draw, para pasar las coordenadas J e I , se las pasas multiplicando por ANCHO y ALTO.

Pd: igual, voy a tratar de resolverlo como me habian dicho al principio, pero esta bueno saber como tendria que hacer para mejorar el programa (ya sea como decia marcoszorrilla, o de la manera en que decis vos)
Responder Con Cita
  #16  
Antiguo 11-02-2006
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
Lo único que hago es una transformación (una escala)

Los valores de I y de J son los indices de la matriz, los ciclos for sirven para obtener coordenadas X,Y

Código:
Los indices de la matriz transpuesta son los siguientes:

(0,0) (1,0) (2,0) ... (9,0)
(0,1) (1,1) ...       (9,1)   
  :                     :
  :                     :
(0,9) (1,9) ...       (9,9)    

Pero en coordenadas X, Y del canvas lo que necesito es lo siguiente:
(suponiendo que las imagenes son de tamaño 32x32)

( 0, 0) (32, 0) (64, 0) ... (288, 0)
( 0,32) (32,32) ...         (288,32)
   :                            :
   :                            :
( 0,288) (32,288) ...       (288,288)
La forma de obtener estas coordenadas es haciendo el producto del indice J por la altura (32) y el indice I por el ancho (32).


Este tipo de procedimientos son muy comunes cuando se trata de escalar, piensa en tu matriz como un pequeño cuadrado de dimensión 9x9 y deseas transformarlo en un cuadrado más grande de dimensión 288x288, por esta razón necesitas escalarlo (multiplicarlo por un factor).


Saludos

Última edición por Héctor Randolph fecha: 11-02-2006 a las 00:54:21.
Responder Con Cita
  #17  
Antiguo 11-02-2006
Chompiras Chompiras is offline
Miembro
 
Registrado: ene 2006
Ubicación: La plata, Argentina
Posts: 37
Poder: 0
Chompiras Va por buen camino
Arrow ahhhh!!!!

Ahhhhh!!! ahora si!!!, gracias de nuevo hector!!
__________________
El sabio no dice todo lo que piensa, pero piensa todo lo que dice...
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 12:05:52.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi