Autor Tema: Problema al tomar cartas.

0 Usuarios y 3 Visitantes están viendo este tema.

31 Enero, 2026, 02:35 pm
Leído 2146 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
En el siguiente video notarán varios errores pero céntrense en la posición de las cartas, estoy diciendo al juego que me de otra y otra, etc, y debería mostrarlas mejor posicionadas (las cartas, los símbolos en ellas son otro tema) ¿cómo lo logro?
Código: (actionscript) [Seleccionar]
// para tomar otra carta: Crear función para distribuir cartas y agregar 1, en vez de agregar y redistribuir todas cuando ya están.

// Generar array de cartas:
Cartas = [];
Nro = 0;
do {
Nro++;
Cartas[Cartas.length] = "P"+Nro;
Cartas[Cartas.length] = "T"+Nro;
Cartas[Cartas.length] = "C"+Nro;
Cartas[Cartas.length] = "D"+Nro;
} while (Nro < 13);

// Ordenarlas al azar:
// Eso creo que no tiene que ver así que no lo pongo acá.

// Dar 2 a jugadores:
SiguienteNroDeCarta = 0;
CartasDeHumano = [];
// Para facilitar las sumas:
NumerosDeHumano = [];
CartasDeIA = [];
do {
CartasDeHumano[CartasDeHumano.length] = Cartas[SiguienteNroDeCarta];
NumerosDeHumano[NumerosDeHumano.length] = Number(Cartas[SiguienteNroDeCarta].substring(1, Cartas[SiguienteNroDeCarta].length));
CartasDeIA[CartasDeIA.length] = Cartas[SiguienteNroDeCarta+1];
SiguienteNroDeCarta = SiguienteNroDeCarta+2;
} while (SiguienteNroDeCarta < 4);

// Mostrarlas en pantalla:
function MostrarCartasDeHumano () {
NroDeCartaaMostrar = 0;
if (CartasDeHumano.length % 2 == 0) {
PosicionDe0 = 256 - CartasDeHumano.length-1 * 50 - 25;
} else {
PosicionDe0 = 256 - CartasDeHumano.length * 50;
}
// trace(PosicionDe0);
do {
NombreDeCarta = "CartaDeHumano"+CartasDeHumano[NroDeCartaaMostrar];
attachMovie ("sCarta", NombreDeCarta, NroDeCartaaMostrar);
setProperty (NombreDeCarta, _x, PosicionDe0+(NroDeCartaaMostrar)*150);
setProperty (NombreDeCarta, _y, 192);
// Para el interior de la carta:
// Eso creo que no tiene que ver así que no lo pongo acá.
NroDeCartaaMostrar++;
} while (NroDeCartaaMostrar < CartasDeHumano.length);
}
MostrarCartasDeHumano();

// Calcular suma de humano:
// Eso creo que no tiene que ver así que no lo pongo acá.

// Calcular suma de IA:
// Eso creo que no tiene que ver así que no lo pongo acá.

// Tomar carta sí o no. Un objeto en F2 repite esto:
function TomarCartaSoN () {
// Si se presiona izquierda:
if (Key.isDown(37)) {
// Eso creo que no tiene que ver así que no lo pongo acá.
} else if (Key.isDown(39)) {
SiguienteNroDeCarta++;
CartasDeHumano[CartasDeHumano.length] = Cartas[SiguienteNroDeCarta];
NumerosDeHumano[NumerosDeHumano.length] = Number(Cartas[SiguienteNroDeCarta].substring(1, Cartas[SiguienteNroDeCarta].length));
Mensaje = "Has recibido "+CartasDeHumano[CartasDeHumano.length];
MostrarCartasDeHumano();
}
}

01 Febrero, 2026, 07:01 pm
Respuesta #1

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Si tienes un ancho de pantalla o area de trabajo, con un  ancho en pixeles llamémosle Ancho_pantalla y un ancho de carta llamémosle Ancho_carta

Si vas a colocar en pantalla un numero $$N$$ de cartas  el punto superior izquierda de la carta te queda como

Código: [Seleccionar]
Espacio_libre=Ancho_pantalla-N*Ancho_carta
El espacio entre cartas
Código: [Seleccionar]
Espacio_cartas=Espacio_libre/(N+1)
La posición del primer pixel a la izquierda de cada carta $$i$$ con $$i$$ que va de $$1$$ a $$N$$.

Código: [Seleccionar]
Posi_x _carta_i=i*Espacio_cartas+(i-1)*Ancho_carta
Espero te sirva.
Saludos  \(\mathbb {R}^3\)

09 Febrero, 2026, 08:04 pm
Respuesta #2

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Intenté aplicarlo.

Siendo 2 cartas se colocan en
-100
104
O sea, la 1era queda fuera de la pantalla, demasiado a la izquierda.

Fijate qué hice mal:

Dices:
Código: [Seleccionar]
Espacio_libre=Ancho_pantalla-N*Ancho_carta

Puse
EspacioLibre = 512-CartasDeHumano.length*100;

El ancho de pantalla es 512
CartasDeHumano.length es cuántas variables hay en el array, o sea cuántas cartas hay que mostrar.
100 es el ancho de las cartas.
Es: EspacioLibre = 312
Tiene sentido: 512-2 cartas de 100... es 312.

Luego dices:
El espacio entre cartas
Código: [Seleccionar]
Espacio_cartas=Espacio_libre/(N+1)
Puse:
EspacioEntreCartas = EspacioLibre/(CartasDeHumano.length+1);
Es: EspacioEntreCartas = 104
312/3, correcto. Si hay 2 cartas habría 3 espacios, entonces:
104 + 100 + 104 + 100 + 104
espacio + carta, etc

Luego dices:
Código: [Seleccionar]
Posi_x _carta_i=i*Espacio_cartas+(i-1)*Ancho_carta
Puse:
setProperty (NombreDeCarta, _x, NroDeCartaaMostrar*EspacioEntreCartas+(NroDeCartaaMostrar-1)*100);
Es: 0*104+(0-1)*100
¿Será que empezaste a contar desde carta 1?
0-1*100 = -100
Pruebo quitar el -1.
No, me da 0, la carta se pone justo donde empieza la pantalla.

Además la posición de las cartas se basa en su centro, o sea, si la pongo en la posición 0 de las x, el centro de la carta irá ahí, por lo que la mitad quedará a la izquierda de eso y la otra mitad a la derecha. Si se pone en la posición 0, la mitad izquierda no está en la pantalla.

Tras probar varias me funcionó esta
setProperty (NombreDeCarta, _x, (NroDeCartaaMostrar+1)*EspacioEntreCartas+(NroDeCartaaMostrar+1)*100-50);

¿Es posible evitar los -1?

El -50 es por lo que te expliqué de qué marca la posición de la carta. Hacer que esté en la parte izquierda implicaría tener que cambiar cómo se colocan los signos y eso además de complicaciones puede implicar restas que ahora no hay, así que se queda ¿o puede evitarse de otro modo?

Así queda:


Como ves, la 1era queda demasiado a la izquierda (el cartel de abajo marca el ancho de la pantalla).

Así:
setProperty (NombreDeCarta, _x, Math.max(50, (NroDeCartaaMostrar+1)*EspacioEntreCartas+(NroDeCartaaMostrar+1)*100-50));

Logro que la posición de la 1er carta nunca sea <50

pero como ves su distancia con respecto a la 2nda es menor que las demás, y la última carta está demasiado a la derecha.
¿Puedes arreglarlo?

 :aplauso:


09 Febrero, 2026, 08:42 pm
Respuesta #3

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada


¿Puedes arreglarlo?

 :aplauso:
Si, mas tarde con tiempo lo reviso, el tema es que empecé  contar desde el 1 y que el origen de la carta no está en la esquina superior izquierda sino en el centro...  hay que hacer un par de correcciones pero ando con poco tiempo ahora.


Y para mas cartas observa que si cada carta cubre 100 pixeles y quieres poner mas de 6 cartas, no te alcanza la pantalla ya que ocuparían 600 y solo tienes 512 disponibles...  o reduces el tamaño de la carta, agrandas la pantalla o las solapas una encima de la otra... tu decides  allí no puedo ayudarte.


y si quieres solaparlas debes decirme cuanto quieres que se solape, ¿que sea proporcional al numero de cartas ?  es decir que si mas cartas tienes menos ves de cada una pero conservas el tamaño de la carta


Saludos  \(\mathbb {R}^3\)

09 Febrero, 2026, 10:06 pm
Respuesta #4

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada

Prueba lo siguiente:

Voy a crear  nuevas variables 
Código: [Seleccionar]
extremo =7
ancho_util=ancho_pantalla-2* extremo-ancho_carta
Espacio_entre_cartas=ancho util/(N+1)
Posi_x _carta_i=extremo+ancho_carta/2+(i+1)*Espacio_cartas

Con $$i$$ entre $$0$$ y $$n-1$$

extremo: es un espacio a derecha y izquierda de pantalla que ninguna carta pisará.
ancho_util: es lo que te queda de pantalla si le sacas los extremos y tambien media carta de cada lado o sea una carta.
espacio_entre_cartas: es lo que te queda para cada carta si divides el espacio util sobre todas las cartas una,pues hay un espacio más que cartas.
posi_x_carta_i=  hace un loop de 0 a n-1 , y te ubicará el centro de cada carta en esa posición.

Si se acaba el espacio imagino que la primer carta a izquierda es solapada en parte por la segunda, que la tercera solapa la misma cantidad de la segunda y así sucesivamente....serviría para cualquier n.
He modificado el código revisa

Saludos
Saludos  \(\mathbb {R}^3\)

10 Febrero, 2026, 02:49 am
Respuesta #5

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
y si quieres solaparlas debes decirme cuanto quieres que se solape, ¿que sea proporcional al numero de cartas ?  es decir que si mas cartas tienes menos ves de cada una pero conservas el tamaño de la carta
Eso.

Otro día leo tus siguientes mensajes.

Es para un Black Jack, así que muchas cartas no se van a tener, el máximo es 12.

Con 11 es posible seguir en este caso:
4 1s (suman 4)
4 2s (suman 8, total 12)
3 3s (suman 9, total 21)

Con 12 se perdería seguro así que más de 12 no se podrá, ni siquiera tiene sentido llegar a 12.

16 Febrero, 2026, 02:28 am
Respuesta #6

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Puse esto:
Código: [Seleccionar]
function MostrarCartasDeHumano () {
extremo = 7;
ancho_util = 512-2*extremo-100;
trace("ancho_util: "+ancho_util);
Espacio_entre_cartas = ancho_util/(CartasDeHumano.length+1);
trace("Espacio_entre_cartas: "+Espacio_entre_cartas);
NroDeCartaaMostrar = 0;
do {
NombreDeCarta = "CartaDeHumano"+CartasDeHumano[NroDeCartaaMostrar];
attachMovie ("sCarta", NombreDeCarta, NroDeCartaaMostrar);
setProperty (NombreDeCarta, _x, extremo+50+(CartasDeHumano.length+1)*Espacio_entre_cartas);
trace(getProperty(NombreDeCarta, _x));
// cosas que no vienen al caso.
NroDeCartaaMostrar++;
} while (NroDeCartaaMostrar < CartasDeHumano.length);
}

Pone las cartas muy en la derecha. y las 2 en el mismo sitio:
ancho_util: 398
Espacio_entre_cartas: 132.666666666667
carta1: 455
carta2: 455

:/

16 Febrero, 2026, 03:01 am
Respuesta #7

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada

Puse esto:
Código: [Seleccionar]
   ancho_util = 512-2*extremo-100;

El ancho de la carta es 50 no? , no 100 y el punto de inserción esta al medio

Deria quedarte

Código: [Seleccionar]
   ancho_util = 512-2*extremo-50;
Saludos  \(\mathbb {R}^3\)

16 Febrero, 2026, 06:29 am
Respuesta #8

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Nota: Esto lo pensé antes de leer tu nuevo mensaje.

A ver, hay un espacio X de 512 y se quieren colocar 2 cartas así:
E C E C E
Cada espacio E debe medir 512/(cartas*2+1).
Ejemplo si fuese 500
100 100 100 100 100

Cada carta se coloca en Nro de carta*2*E+1
No pero
Carta 0 va en 100, o sea 0*E*2+E
Carta 1 va en 300: 1*E*2+E

Pero al colocar las cartas hay que sumarle 50 ¿o no?
eee ece
Pruebo.

Con esto:
Código: [Seleccionar]
LargoDeEspacios = 512/(CartasDeHumano.length*2+1);
NroDeCartaaMostrar = 0;
do {
NombreDeCarta = "CartaDeHumano"+CartasDeHumano[NroDeCartaaMostrar];
attachMovie ("sCarta", NombreDeCarta, NroDeCartaaMostrar);
setProperty (NombreDeCarta, _x, NroDeCartaaMostrar*LargoDeEspacios*2+LargoDeEspacios+50);

La 1era vez, cuando hay 2 cartas, está bien, pero luego la carta más a la derecha queda muy al extremo comparado con la izquierda.

A ver...
En un espacio de 600 para 3 cartas debería ser
0 150 200 350 400 550 600
esas serían las ubicaciones de
E C E C E C E
Van aumentando de a 200. Y yo puse
NroDeCartaaMostrar*LargoDeEspacios*2+LargoDeEspacios+50);[/code]
Aumenta de a LargoDeEspacios*2, está bien.
¿El problema es el +50, no siempre corresponde?

Puse que en el programa la pantalla mida 600, por probar. Los valores son
LargoDeEspacios: 120
170
410

Con 3 cartas
LargoDeEspacios: 85.7142857142857
135.7
307.1
478.55

Esos números no parecen tener sentido.
LargoDeEspacios = 600/(CartasDeHumano.length*2+1);
LargoDeEspacios = 600/(3*2+1);
No, entonces no me conviene poner 600 sino 700, debe ser
0123456
No, pero...
ECECECE
Claro, el último espacio no se coloca en 600, por eso necesito 700.
Con 3 cartas es
LargoDeEspacios: 100
150
350
550
¡está bien! Pero creo que esta vez con 2 cartas quedó mal, y con más de 3 seguro, sigue mal ¿por qué? Parece que sólo funciona con ciertas combinaciones de largo de pantalla y cantidad de cartas, lo cual no parecer tener sentido.

A ver, con 2 si la pantalla fuese 500 sería
0 150 200 350 400
La carta 0 va en LargoDeEspacios+50
La 1 en LargoDeEspacios*3+50

Con 2 si la pantalla fuese 700 sería
0 150 200 350 400 550 600
La carta 0 va en LargoDeEspacios+50
La 1 en LargoDeEspacios*3+50
La 2 en LargoDeEspacios*5+50

La fórmula es la misma ¿por qué no siempre funciona? Es muy raro.

El ancho de la carta es 50 no? , no 100 y el punto de inserción esta al medio
El ancho es 100.


Creo que ya entiendo por qué falla lo que puse, no se tiene en cuenta lo que ocupa la carta más allá del límite. Quizá es eso.

Pongamos que la pantalla fuese 400, con 3 cartas queda
0 150 200 350 400
si fuese 200
0 100 100 200 200
o sea... sí, parece eso, la de la izquierda empezaría donde termina la pantalla. Está mal. Es como que la pantalla disponible fuese dependiente de la cantidad de cartas.

16 Febrero, 2026, 12:24 pm
Respuesta #9

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Hola esta mal de entrada porque los espacios no miden lo mismo que una carta para cual quier cantidad de cartas es decir  esta mal que el espacio sea $$\cancel{E = 512/ (2*cartas+1)}$$

Si llamas $$x$$ a extremo, $$c $$  al ancho de carta , y $$e$$ a espacio entre centros de carta

Tu quieres  formar  algo como  $$xececec...cex$$ pero en realidad es $$xc/2eeeee...eeec/2x$$
Hay siempre un espacio mas que cartas y ya el espacio tiene en cuenta lo que mide una carta, porque si hay pocas cartas veras tablero entre medio pero si hay muchas se solapan y se puede hacer el calculo con ibdependencia de lo que mide la carta.

El espacio util es el espacio total menos los dos extremos. $$Eu=Et-2*x$$ asi ves algo de tablero siempre en la puntas.

Si. Cada carta mide 100 o $$c$$ y  la pones en pantalla con el valor donde queda la mitad de su ancho 50  o $$c/2$$ tienes que

Primero al ancho útil descontarle el ancho de una carta, asi no puede pisar los extremos.
Ancho disponible= ancho util -ancho carta
$$Ed=Eu-c$$

Y ahora habria que distribuir las cartas, pero si hay muchas vas a solaparlas osea no hay espacio entre ellas.
A diferecia de lo que antes te escribi, noto que quieres ahora que las cartas queden centradas y espaciadas equidistantes.
Ahora entonces habra un espacio mas que cartas.
Entonces la separación entre cartas es el espacio disponible dividido la cantidad de espacios

$$e=Ed/(n +1)$$  si $$n$$ es la cantidad de cartas a mostrar.

La carta nro $$i$$ ira ubicada en la posicion

$$X_i=x+c/2+e+i*e$$

Siempre que $$i$$ vaya de $$0$$  hasta $$n-1$$
Es asi primero tienes el tablero limpio, por lo que dejaste de extremo ,luego c/2 es el espacio que dejas para que la primera carta pueda ir hacia la izquierda sin salirse de pantalla y tampoco pisar el extremo, y luego viene el primer espacio ya que hay uno siempre antes de la primer carta y uno mas al final de la ultima.

Prueba asi antes las ponía a la izquierda ahora se distribuyen desde el centro.
Saludos  \(\mathbb {R}^3\)