elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  .Net C# Tragamonedas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: .Net C# Tragamonedas  (Leído 6,655 veces)
01munrra

Desconectado Desconectado

Mensajes: 282



Ver Perfil
.Net C# Tragamonedas
« en: 3 Agosto 2016, 05:09 am »

saludos!!!

estoy haciendo mi proyecto final que es un tragamonedas, y estoy en el cambio de imagen del juego, El Profesor me pidio que no Usara un Timer que usara un BackGroundWorker,  entonces programe lo siguiente para el cambio de imagen del juego:

Código
  1.   private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
  2.        {
  3.            int i = 1;
  4.  
  5.            while ( i > 0 )
  6.            {
  7.                imagen1 = objeto.Next(0, 3);
  8.                n1 = Convert.ToString(imagen1);
  9.                if (imagen1 == 0)
  10.                {
  11.                    pictureBox1.Image = Traga_monedas_frutas.Properties.Resources.Banana;
  12.                }
  13.                else
  14.                    if (imagen1 == 1)
  15.                    {
  16.                        pictureBox1.Image = Traga_monedas_frutas.Properties.Resources.Manzana;
  17.                    }
  18.                    else
  19.                        if (imagen1 == 2)
  20.                        {
  21.                            pictureBox1.Image = Traga_monedas_frutas.Properties.Resources.Pina;
  22.                        }
  23.                        else
  24.                            if (imagen1 == 3)
  25.                            {
  26.                                pictureBox1.Image = Traga_monedas_frutas.Properties.Resources.Cereza;
  27.                            }
  28.                i++;
  29.            }
  30.        }
  31.  

inicio el subproceso con:

Código
  1.  private void button1_Click(object sender, EventArgs e)
  2.        {
  3.            backgroundWorker1.RunWorkerAsync();
  4.        }
  5.  

lo detengo dando clic en un boton, ahora la logica del juego es que este cambiando constantemente la imagen de los picturebox, son 4 picture box que estoy usando, y por supuesto tengo 4 BackGroundWorker, uno para cada imagen.

el error que me esta generando es el siguiente:
Código
  1. El Codigo de usuario no encontro InvalidOperationException
  2.  

da en la linea:

Código
  1. pictureBox1.Image = Traga_monedas_frutas.Properties.Resources.Banana;
  2.  

que estoy haciendo mal?

gracias por su atencion.





En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: .Net C# Tragamonedas
« Respuesta #1 en: 3 Agosto 2016, 12:09 pm »


Código
  1. private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
  2.        {
  3.            int i = 1;
  4.  
  5.            while ( i > 0 )
  6.            {
  7.                       ...
  8.                i++;
  9.            }
  10.        }
  11.  

Hola

Primeramente, ¿eso exactamente con que intención lo haces?. No es necesario tener una variable-contador intermediaria para llevar a cabo las iteraciones, puedes simplificarlo de la siguiente manera:

Código
  1. private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
  2.    while (true) {
  3.        // Insertar código aquí.
  4.    }
  5. }



Segundo, esto ya depende de gustos, puedes hacerlo como prefieras, pero yo considero que así te quedaría un código más legible e intuitivo: podrías reemplazar toda esa colmena de condicionales lo por un switch:

Código
  1. private static readonly Random rnd = new Random();
  2. private static Image img;
  3. private static Int32 imgId;

Código
  1. imgId = rnd.Next(minValue: 0, maxValue: 3);
  2.  
  3. switch (imgId) {
  4.  
  5.    case 0:
  6.        img = Traga_monedas_frutas.Properties.Resources.Banana;
  7.        break;
  8.  
  9.    case 1:
  10.        img = Traga_monedas_frutas.Properties.Resources.Manzana;
  11.        break;
  12.  
  13.    case 2:
  14.        img = Traga_monedas_frutas.Properties.Resources.Pina;
  15.        break;
  16.  
  17.    default:
  18.        img = Traga_monedas_frutas.Properties.Resources.Cereza;
  19.        break;
  20. }



Tercero y último, el mensaje de error que has mencionado parece ficticio, tiene faltas de ortografia de principio a fín, y no parece tener ningún sentido razonable entre eso del user-code y la mención a la excepción. Por favor, muestra el mensaje de error real, tal y como te lo muestra Visual Studio (preferiblemente en Inglés si te fuese posible,,puesto que las traducciones de los mensajes de error por parte de Microsoft al Castellano ... son lo peor)

De todas formas, intuyo que posiblemente tengas un conflicto por intentar manipular un control que no fue creado desde el mismo hilo en donde estás ejecutando el BackgroundWorker.

Prueba a intentar utilizar un delegado, de la siguiente manera:

Código
  1. private static readonly Random rnd = new Random();
  2. private static Image img;
  3. private static Int32 imgId;
  4.  
  5. public delegate void SetPictureBoxImage(PictureBox pcb, Image img);
  6. public static SetPictureBoxImage PictureBoxDelegate = new SetPictureBoxImage(SetPictureBoxImageMethod);

Código
  1. public static void SetPictureBoxImageMethod(PictureBox pcb, Image img) {
  2.    pcb.Image = img;
  3. }

Código
  1. private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
  2.  
  3.    imgId = rnd.Next(minValue: 0, maxValue: 3);
  4.  
  5.    switch (imgId) {
  6.  
  7.        case 0:
  8.            img = Traga_monedas_frutas.Properties.Resources.Manzana;
  9.            break;
  10.  
  11.        case 1:
  12.            img = Traga_monedas_frutas.Properties.Resources.Pina;
  13.            break;
  14.  
  15.        case 2:
  16.            img = Traga_monedas_frutas.Properties.Resources.Cereza;
  17.            break;
  18.  
  19.        default:
  20.            img = Traga_monedas_frutas.Properties.Resources.Banana;
  21.            break;
  22.    }
  23.  
  24.    form1.Invoke(PictureBoxDelegate, new object[] { pictureBox1, img });
  25.  
  26. }

Saludos


« Última modificación: 3 Agosto 2016, 12:21 pm por Eleкtro » En línea



01munrra

Desconectado Desconectado

Mensajes: 282



Ver Perfil
Re: .Net C# Tragamonedas
« Respuesta #2 en: 3 Agosto 2016, 14:10 pm »

Aplique tu forma y funciono!.. (Y) interesante la logica que le aplicastes, se lo aplique a los 4 PictureBox que tiene el juego, aqui una imagen para que tengas una idea:



lo añadi en un ciclo:
Código
  1. While(true)
  2. {
  3.   .................
  4. }
  5.  

e hice esto para ver si se detiene los  backgroundWorker:
Código
  1.        private void button2_Click(object sender, EventArgs e)
  2.        {
  3.            backgroundWorker1.CancelAsync();
  4.            backgroundWorker2.CancelAsync();
  5.            backgroundWorker3.CancelAsync();
  6.            backgroundWorker4.CancelAsync();
  7.  

pero no se esta deteniendo, como se hace ps????

Saludos!! Gracias!
« Última modificación: 3 Agosto 2016, 15:46 pm por Eleкtro » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: .Net C# Tragamonedas
« Respuesta #3 en: 3 Agosto 2016, 15:58 pm »

pero no se esta deteniendo, como se hace ps????

( hasta que has mostrado la imagen no habia entendido del todo bien tu duda por que no sabía que era eso de tragamonedas, aquí lo llamamos tragaperras xD )

Piensa en lo siguiente: lo único que tienes hecho hasta ahora es un thread que ejecuta un búcle infinito, ¿cómo esperas poder cancelarlo por arte de mágia sin añadir nada más, si de ese búcle nunca sales?

Para que tu thread/backgroundworker se pueda cancelar, debes modificar el código actual (el bloque de código del evento BackgroundWorker.DoWork) para añadir una comprobación que determine si existe una petición/señal de cancelación, y en caso afirmativo, terminar la ejecución de ese bloque de código.

Cuando llamas al método BackgroundWorker.CancelAsync(), se activa el valor de la propiedad booleana BackgroundWorker.CancellationPending, ese es el valor que debes controlar dentro de tu búcle infinito para modificar el comportamiento o flujo de tu BackgroundWorker.

Es algo muy sencillo, pero lo mejor es que leas y estudies la siguiente documentación (sobre todo el primer enlace, y el ejemplo de código que verás ahí) para que aprendas a hacerlo por ti mismo:

PD: ¿realmente el profesor os ha mandado implementar algoritmos de programación asincrónica sin haberos enseñado antes?

Saludos!
« Última modificación: 3 Agosto 2016, 16:23 pm por Eleкtro » En línea



01munrra

Desconectado Desconectado

Mensajes: 282



Ver Perfil
Re: .Net C# Tragamonedas
« Respuesta #4 en: 3 Agosto 2016, 18:35 pm »

PD: ¿realmente el profesor os ha mandado implementar algoritmos de programación asincrónica sin haberos enseñado antes?

el dio una clase, y ps primero se enredo explicando el tema(no lo explico bien) y segundo dio un ejercicio que cargaba unos datos que estaban en un .TXT y mostraba en el form, pero no tan complejo como un juego como este.

Gracias por tu ayuda, me leere esa documentación.

Saludos!
En línea

01munrra

Desconectado Desconectado

Mensajes: 282



Ver Perfil
Re: .Net C# Tragamonedas
« Respuesta #5 en: 4 Agosto 2016, 06:21 am »

Amigo añadi esto al DOWork:
Código
  1.                    if (backgroundWorker1.CancellationPending == true)
  2.                    {
  3.                        e.Cancel = true;
  4.                        return;
  5.                    }
  6.  

quedando asi:

Código
  1.      private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
  2.        {
  3.            while (true)
  4.                {
  5.                    imgId = rnd.Next(minValue: 0, maxValue: 3);
  6.                    switch (imgId)
  7.                    {
  8.  
  9.                        case 0:
  10.                            img = Traga_monedas_frutas.Properties.Resources.Manzana;
  11.                            break;
  12.  
  13.                        case 1:
  14.                            img = Traga_monedas_frutas.Properties.Resources.Pina;
  15.                            break;
  16.  
  17.                        case 2:
  18.                            img = Traga_monedas_frutas.Properties.Resources.Cereza;
  19.                            break;
  20.  
  21.                        default:
  22.                            img = Traga_monedas_frutas.Properties.Resources.Banana;
  23.                            break;
  24.                    }
  25.  
  26.                    if (backgroundWorker1.CancellationPending == true)
  27.                    {
  28.                        e.Cancel = true;
  29.                        return;
  30.                    }
  31.  
  32.                    Invoke(PictureBoxDelegate, new object[] { pictureBox1, img });
  33.                }            
  34.        }
  35.  

y si funciona!....

gracias por tu ayuda me ha servido de mucho   ;-)

En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
trampa en tragamonedas « 1 2 3 4 5 »
Foro Libre
=AzTLaN= 44 102,045 Último mensaje 6 Octubre 2011, 23:20 pm
por netbios_hack1111111j
hack tragamonedas? « 1 2 3 4 5 »
Hacking
Kase 42 116,565 Último mensaje 2 Agosto 2019, 20:24 pm
por torrealba2719
[Juego] Tragamonedas.
Programación Visual Basic
79137913 0 7,225 Último mensaje 5 Noviembre 2010, 18:49 pm
por 79137913
Por favor,ayuda con tragamonedas britanica en flash
Juegos y Consolas
gamesuruguay 0 2,294 Último mensaje 20 Marzo 2012, 07:25 am
por gamesuruguay
Tragamonedas visual basic
Ejercicios
Strow 0 2,932 Último mensaje 25 Mayo 2016, 19:03 pm
por Strow
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines