Saltar al contenido

"Jugar" al poker


Antoni

Recommended Posts

publicado

Hola:

Entrecomillo "Jugar" para que no os hagais ilusiones, de jugar, nada de nada.

Hay dos macros:

PokerAbierto y PokerCerrado

Ambas macros, lo único que hacen es barajar, repartir y mostrar las cartas, eso si,

las que tienen que estar tapadas, están tapadas.

Para descubrir las cartas tapadas, pulsar y arrastrar la tapa.

Los naipes se muestran como imagen incrustada en la hoja por lo que se pueden arrastrar y soltar donde nos convenga.

Cuando disponga de tiempo, intentaré poco a poco ir completando los juegos, aunque es mas difícil de lo que parece.

Saludos a todos menos a uno.

POKER.zip

publicado

Hola Antoni

Muy currado, a eso me refería cuando le propuse a Jorge el uso de caracteres de texto para montar la baraja (aunque yo no me la curre ni por asomo).

Un saludo

P.S. Voy a ver si usando funciones puedo..... (es broma, sólo por incordiar un poquito al "Señor de las Macros")

publicado

Hola ioyama:

Voy a ver si usando funciones puedo.....

Allá tú, dicen que el hombre es el único animal que tropieza dos veces con la misma piedra...jajaja

Un placer saludarte

publicado

Hola Antoni,

Sobre el tema de arrastrar imagenes y soltarlas en zonas, ayudé hace un tiempo en esta pagina a alguien que queria hacer votaciones usando un sistema que permite arrastrar imagenes a zonas especificas para que contaran los votos de un recuento electoral.

Hechale un vistazo al link que te puede ser util para soltar las cartas en montones o en zonas especificas.

Votos Elecciones, Arrastrar y Soltar (En hoja2)

Aqui el post original

Solo tienes que arrastrar los circulitos verdes del candidato al que quieres aumentar votos, automaticamente cambia al presidente seleccionado y le incrementa un voto en la zona de arrastre.

A ver como te va quedando el juego, por ahora tiene buena pinta.

publicado

Hola Macro, no soy jugador de cartas pero me gusta jugar con los caracteres de texto y la idea de ioyama de mostrarlas con Picas ♠ Corazones ♥ Diamantes ♦ y Tréboles ♣

No me gustó la representación que hiciste del 10 por lo que me he puesto a cambiar el aspecto de todas las cartas para intentar darles la apariencia de la baraja inglesa, añadiéndoles una fila más en el fichero adjunto.

También he añadido una sencilla macro OcultarTapa para hacer lo que se le dice cuando se haga click en las tapas (¡que no estamos hablando de comer pero a estas horas ya pica el gusanillo!)

Nota: si no se quieren ocultar las tapas, click con el botón derecho del ratón sobre ellas y se pueden arrastrar y mover.

Las J, Q, K las dejo para otro que no veo la forma de imaginarme la imagen de la sota, caballo y rey con caracteres de texto.

verzulsan, a ver si echamos una partida cuando acabe el juego nuestro querido Macro...

POKER_PW1.zip

publicado

Hola Santi: Pedro y demas "voyeurs":

Gracias por vuestros comentarios.

Lo del 10, me rompía toda la estructura que ya tenía montada, y decidí darle esa solución.

Ya se sabe que contra gustos no hay disputas.

Besitos a todos, hoy incluido el "uno".

Invitado jorgetchake
publicado

Saludos….

Y sigo con mi juego que vuelvo a adjuntar para formular mi consulta.

Adapté mi juego para manejar las imágenes proporcionadas por MA (Macro Antonio).

El original debí mantenerlo porque en la época que lo hice no sabía usar los nombres de rangos,… por eso todo está direccionado por rangos tipo A1,… me resulta muy complicado modificar el código para reformatear todas las columnas por las que requieren las imágenes. Por esa razón, en la hoja Tapete,.. se ven las imágenes de MA pero sólo para asegurarme que mi código seleccione correctamente las imágenes, en la hoja del juego se ven digamos en modo abreviado mientras que en Tapete la imagen completa.

A raíz de lo que hice,… se me ocurrió hacer un User Form con las imágenes como se ven en la hoja Tapete,… pero no sé como hacerlo ¡!!!

Por favor.

¿Cómo se mueve una imagen de la hoja a un User Form sea a un control Image o una Label ¿????? O a donde se pueda.

Pegones,... no entiendo lo de Ocultar Tapas,... y me gustó tu diseño, es bueno.

Muchas gracias.

Cordiales saludos

No puedo subir la nueva versión que incluye las hojas Baraja y Tapete.,… de todas formas por favor pienso que para responder la consulta no será necesario el archivo.

publicado
Pegones,... no entiendo lo de Ocultar Tapas,... y me gustó tu diseño, es bueno.

Hola jorgetchake, las tapas son las cartas vueltas que ocultan a las demás y tienen asignada la macro:

Sub OcultarTapa()
ActiveSheet.Shapes.Range(Array(ActiveSheet.Shapes(Application.Caller).Name)).Visible = False
End Sub[/CODE]

aunque debería haberla simplificado así:

[CODE]Sub OcultarTapa()
ActiveSheet.Shapes.Range(Array(Application.Caller)).Visible = False
End Sub[/CODE]

Siendo Application.Caller el nombre de la imagen a invisibilizar para mostrar la carta que hay debajo.

Invitado jorgetchake
publicado

Presente....

No pude anexar el archivo porque había crecido (aparentemente) demasiado por no haber borrado la sucesión de imágenes durante la prueba,... recordé que MA tenía una línea de código

Hoja.DrawingObjects.Delete[/CODE]

la puse y se acomodó el carro con todos sus zapallos.

Disculpen y cordiales saludos.

juego-poker-let-and-raid.diseño4.zip

publicado

Hola a todos:

Jorge, no acabo de tener claro si has entendido el tema de las "imágenes".

Entrecomillo "imágenes" porqué realmente, no existen.

Los naipes se encuentran como datos en las celdas con la fuente Symbol, en la hoja Baraja que está oculta.

A la hora de mostrar un naipe se construye la imagen a partir del rango que ocupa dicho naipe con el método CopyPicture que realiza tal cometido. Cuando ya no se necesita, la imagen del naipe es eliminada.

Dicho esto, queda claro que las imágenes no existen como archivos independientes.

Que yo sepa, un control Image en un formulario se puede cargar:

1) En tiempo de diseño desde un Archivo o con Pegar en la propiedad Picture

2) Con la instrucción LoadPicture desde un Archivo

3) Desde otro control Image

4) Desde un control ImageList cargado previamente con las imágenes.

No he sido capaz de encontrar una forma de cargar la imagen directamente de la hoja.

Hay una forma de convertir una imagen de una hoja en un gráfico, y posteriormente exportar el gráfico a un archivo .gif.

Una vez disponemos del archivo .gif ya podemos cargarlo en nuestro control Image.

Pero no es nada práctico ya que constantemente estás generando ficheros que tienes que ir eliminando, es lento, y en el proceso se pierde calidad de imagen.

Yo te recomiendo que hagas un esfuerzo por intentar usar "mi sistema", ya que por el momento y hasta que alguien me demuestre lo contrario, es el mas idóneo.

Saludos y buen "finde".

Invitado jorgetchake
publicado

Macro Antonio

Hola MA,… gracias por la respuesta,… entendí,…. De todos modos por favor,… cuando puedas usa mi juego y verás que la hoja Baraja,…. es la tuya y que usé tu hoja Tapete para mis visualizaciones.

Pegones

Hola Pegones... tal vez no esté haciendo algo que sea requerido antes de ejecutar la macro Ocultar Tapa.

ActiveSheet.Shapes.Range(Array(ActiveSheet.Shapes(Application.Caller).Name)).Visible = False[/CODE]

[CODE]ActiveSheet.Shapes.Range(Array(Application.Caller)).Visible = False[/CODE]

Son cosas muy sofisticadas para mi nivel,… con cualquiera de las dos formas siempre sale .

[b]Error 1004

El Índice de la colección especificada se encuentra fuera de los límites[/b]

Amigos,… muchas gracias y saludos.

publicado

Hola Jorge:

Prueba con:

ActiveSheet.Shapes(Application.Caller).Visible = False 'Oculta la imagen
[/CODE]

A mi me funciona.

He buscado en la ayuda [b]Application.Caller[/b] y es mucho mas sencillo de lo que parece.

[b]Application.Caller[/b] nos proporciona el nombre del objeto que ha iniciado la ejecución de la macro. En nuestro caso es una imagen de una "Tapa", que como todas las imágenes tiene un [b]nombre [/b]y que forma parte de la colección [b]Shapes [/b]de la [b]hoja activa[/b].

Fijate en la estructura:

[b]ActiveSheet.Shapes(Application.Caller)[/b] nos devuelve la imagen con el nombre que nos proporciona [b]Application.Caller[/b], y luego con la propiedad .Visible del objeto a False, lo ocultamos.

Si te queda alguna duda, no dudes en preguntar.

Saludos.

PD: Si ejecutas la macro desde el editor de VBA te saltará un error porqué [b]ApplicationCaller [/b]no contendrá el nombre de la imagen.

publicado

Hola Macro, con esta macro asignada a la imagen de una carta se transformará en un

¡¡¡ AS DE CORAZONES !!!

Sub MostrarAs()
ActiveSheet.Shapes(Application.Caller).Select
ExecuteExcel4Macro "FORMULA(""=Baraja!R[0]C[0]:R[5]C[4]"")"
End Sub[/CODE]

publicado

Buenas Pedro & Macro,

Peter, esta vez te has adelantado jeje, justamente ayer antes de salir estaba trasteando con el archivo y las nuevas funciones que le habeis metido y me preguntaba por que estabais copiando y pegando cuando se podia hacer mas facil con lo que tu has puesto. No subí el archivo por que no me daba tiempo a escribir el post cuando me marchaba fue sobre la hora que lo pusiste cuando lo terminé, estoy sincronizado con tus ondas jejeje.

Por cierto, el Application.Caller lo usais como si fuera un puntero de objetos no? A mi me da error, a ver si puedes compartir un libro en donde no de error en version 2007.

Un saludo y thanks por las innovaciones.

POKER_PW1.zip

publicado

Hola Santi, ya sabes que tengo Excel 2010 y tu último fichero me permite ocultar las tapas usando Application.Caller que es una propiedad del objeto Application.

A ver si Macro te puede ayudar con Excel 2007.

¡El copiar y pegar se va a acabar!

Eso es más de Windows que de Excel, siendo más lógico cambiar las fórmulas en las formas - shapes, como has hecho tú:

Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Shapes("pruebas_vzs0").Select
Selection.Formula = Range("micarta")
ActiveCell.Select
End Sub[/CODE]

Por cierto, las conexiones con el foro cada vez son peores y con errores en la base de datos de AyudaExcel.com

publicado

Por alusiones:

Tengo Excel 2007 y no tengo problemas con Application.Caller.

El tema, creo yo, es el que apunte en mi último comentario.

Si ejecutas la macro desde el editor de VBA te saltará un error porqué ApplicationCaller no contendrá el nombre de la imagen.

Si la macro no se ejecuta desde un objeto incrustado, ActiveSheet.Shapes(Application.Caller) no puede resolverse.

Santi, mira en la ayuda los distintos valores que devuelve Application.Caller.

¡¡¡ Muxo Beti !!!

Saludos

Si ejecutas la macro

publicado

Bueno, continuo con el estudio de ayer de tratar la imagen desde sus propiedades en lugar de copiar/pegar a lo bruto. El sistema que planteamos Pegones y yo, parece que es el camino ideal, pero es un tanto tosco la manera de llamar al objeto. 1, Seleccionar y luego manejar la selección.

No soy un experto, pero parece que la clase Selection, hereda todas las propiedades del objeto al que llama, en este caso dicho objeto es de la clase Image, es por esto que se hace tan útil esta funcion, no obstante, limita en muchos aspectos la utilización del objeto, que por poner un ejemplo, no puede llamarse desde otra hoja, es necesario que visualmente estemos encima de el y seleccionárlo para poder acceder a sus metodos. Por otro lado, Shapes, es un objeto con metodos limitados, desde el no podemos acceder al metodo Formula, que es el que interesa.

Se me ocurre una forma que es cutre desde mi punto de vista pero que solucionaria el problema.

    Dim Carta As Picture
Worksheets("Tapete").Shapes("MiImagen").Select
Set Carta = Selection[/CODE]

Una vez hecho esto, ya no es necesario que la imagen esté seleccionada, por poner un ejemplo, si la variable Carta fuera una variable global, podriamos manejar todas las propiedades de Image desde otra hoja y para interactuar con ella no tendríamos que volver a seleccionarla, es decir, la hemos “capturado” con Carta. Como metodo está bien si quieres salir del paso, te creas la variable global, asignas todas las cartas a un array de objetos Image y luego ya manejas comodamente toda la baraja, pero lo ideal seria poder asignar las imágenes sin el metodo Selection, que en este caso, unicamente esta actuando como conversor de punteros void, y que unicamente necesitamos para asignar el objeto Image a la variable Carta, si os dais cuenta de lo que estamos haciendo realmente, estareis con migo en que es tosco y tiene que haber una mejor solucion como la siguiente:

[CODE] Dim Carta As Picture
Set Carta = Worksheets("Tapete").Shapes("MiImagen")[/CODE]

Pero no funciona por que Shapes no es del tipo Image, he hecho pruebas y buscado por google pero no he conseguido encontrar la manera de realizar la asignación de una imagen usando su funcion de llamada Image.

Pero bueno, mientras no lo sepamos, se puede usar una variable global para guardar las 40 cartas, algo es algo.

Un saludo!

Invitado jorgetchake
publicado

Estimado Pegones

He probado el archivo que modificaste (incluyendo la variable Dibujo),.. y luego de la primera pasada dejó de funcionar coherentemente,.. es decir,.. la macro OcultaTapa con el bendito Caller,… no se activa clicando en una de las tapadas,.. la activaba otra carta cualquiera y se oculta,… Yo no soy muy de confiar a éste nivel,… pero llegué a la conclusión y lo probé certificando que siempre funciona,.. si sustituimos en la sentencia del famoso Caller la acción de ocultar (.visible=False) por la de Delete.

No sé demostrarlo pero el ocultar mantiene en memoria el Shape que se ocultó, mientras que el Delete lo elimina de la memoria. Al mantenerse en memoria,… parece que provoca un desfase con la sucesión de imágenes y se pierde la sincronización con lo indicado con la variable Dibujo. Todo se produce porque para mí la sentencia Hoja.DrawingObjects.Delete,…. Deletea lo que se ve y no el contenido en memoria.

Eso lo pude constatar poniendo un msgbox para mostrar el Count de Shapes antes de la fila con DrawingObjects y otro msgbox después y el Count se mantiene con saldo,…. Por ejemplo antes de la sentencia DrawingObjects el contador tenía 10,.. en la hoja Tapete a la vista con 7 cartas ( las 5 más las 2 tapadas),… luego del DrawingObjects el contador de Shapes queda en 3,… y esas son las que provocan el desfase.

Espero que comprendas,… más o menos eso hice,… y además también probé por un momento sustituyendo el DrawingObjects por

Tapete.Shapes.SelectAll 
Selection.Delete
[/CODE]

Y funcionó bien,... pero volví al original.

Ahora tengo más claro el panorama,… esperaré a juntar ánimo para rehacer mi juego de Lets & Raid,… con el bendito diseño,…

Muchas gracias

Cordiales saludos.

publicado

Efectivamente Jorge:

La diferencia entre .Visible y .Delete es que en un caso el objeto continua existiendo en la colección Shapes y en la otra no.

Mañana seguramente subiré otra versión. Tengo pendiente mirar tú último envío. Lo que estamos haciendo no se si valdrá o no para jugar al Poker, pero se aprenden un montón de cosas nuevas ¿No?

Saludos a todos

publicado

Di con la tecla Pedro, como dije, iba a ser una tonteria. Era asi de simple:

    Dim MiCarta As Picture
Set MiCarta = Sheets("Tapete").Pictures("pruebas_vzs0")[/CODE]

Me he permitido tomar prestada tu formula RC para hacer un ejemplo de lo facil que seria manejar las 52 cartas por el metodo que propongo en el archivo, tomando como ejemplo la definicion anterior:

[CODE] MiCarta.Formula = Card(i)[/CODE]

Notese que no hay que seleccionar la carta en ningun momento, y ésta puede ser manejada desde cualquier hoja, estemos o no en la hoja objetivo, y para cambiar de carta unicamente hace falta un numero entre 1 y 52.

Un saludo amigos!

POKER_vzs.zip

Invitado jorgetchake
publicado

Amigos

Adjunto el estado que logré con mi juego,… por unos días dormirá en su carpeta hasta que pueda juntar la voluntad de rehacerlo con el diseño que gracias a MA y PW ya tengo.

Todo el juego se desarrolla en la hoja Let & Raid,… y se muestran las cartas en modo abreviado,… en paralelo se arma la hoja Tapete que muestra los diseños nuevos donde las dos últimas están tapadas,… a medida que el jugador va respondiendo a las opciones de SI-NO, se van destapando las ocultas en la hoja Tapete,… pero no usé el sofisticado Caller,… preferí hacerlo de un modo más artesanal pero para mí más sólido.. Primero despliego las 5 cartas en Tapete y después tapo las 2 últimas,…. De tal forma que para eliminar las tapadas lo que hago es

Tapete.Shapes(Tapete.Shapes.Count).Delete[/CODE]

Pienso en rehacerlo para tener algo más limpio como código. En estos momentos de pruebas y definiciones está hecho (como decía un amigo peruano) [b]Un arroz con Mango.[/b]

Cordiales saludos.

juego-poker-let-and-raid.diseño5.zip

publicado

Hola:

Otra forma de ver la función:

Public Function Card(Num As Integer) As String
Dim a As Integer, b As Integer, c As Integer, d As Integer
a = (Int((Num - 1) / 13) * 6) + 1
b = ((Num - 1) * 5 + 1) Mod 65
c = a + 5
d = b + 4
Card = "=Baraja!" & Range(Cells(a, , Cells(c, d)).Address
End Function
[/CODE]

Creo que el valor del aporte de Pedro no es es la fórmula en si, ya que de hecho se trata de un rango. Lo verdaderamente importante para mi, es haber descubierto que a una imagen se le puede aplicar una fórmula, cosa que yo desconocía.

Así mismo, también agradacerle el descubrimiento para mi de Application.Caller

Saludos a todos.

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.