[ Foro de C# ]

Ayuda en juego de ping pong

01-Jun-2014 23:50
Edvin Gutierrez
6 Respuestas

Saludos.
Queria saber si me podian ayudar en un juego de ping pong en c# windows from, ya que tome como ejemplos otros codigos y la verdad no me funciona, entonces queria saber si me podian ayudar.
Este es el codigo que tengo.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Ping_Pong
{
    public partial class MainForm1 : Form
    {
        //  1 -> Derecha      -1 -> Izquierda
        //  1 -> Abajo        -1 -> Arriba
        private int dx = -1, dy = 1;

        // Variables q contiene la ultima tecla pulsada por cierta pala
        // para q el rebote se efectue en una o otra direcion
        // 'u' (up) -> arriba     'd' (down) -> abajo
        private char d1, d2;
        public MainForm1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
        void reproducirSonido()
        {
            System.Media.SoundPlayer player = new System.Media.SoundPlayer();
            player.SoundLocation = @"C:\WINDOWS\Media\ding.wav";
            player.Play();
        }

        void Timer1Tick(object sender, EventArgs e)
        {
            // Movemos la "pelota"
            pelota.Left += dx;
            pelota.Top  += dy;
            /* Para el movimiento de la pelota
            dx = pelota.Location.X >= this.ClientSize.Width ? -1 : dx;
            dx = pelota.Location.X  == 0 ? 1 : dx;*/
            
            if (pelota.Location.X + 18 >= this.ClientSize.Width)
            {
                Timer1.Enabled = false;
                MessageBox.Show("Gana el jugador 1", "Felicidades");
            }
            if (pelota.Location.X == 0)
            {
                Timer1.Enabled = false;
                MessageBox.Show("Gana el jugador 2", "Felicidades");
            }
            
            // Si choca contra la parte inferior o el menú
            dy = pelota.Location.Y + 50  >= this.ClientSize.Width ? -1 : dy;
            dy = pelota.Location.Y  == 25 ? 1 : dy;
            // Si choca contra la pala1
            
            if (pelota.Left == pala1.Left + pala1.Width)
            {
                reproducirSonido();
                if (pelota.Top > pala1.Top && pelota.Top < dx =" 1;" dy =" d1" left ="="> pala2.Top && pelota.Top < dx =" -1;" dy =" d2" a =" arriba," z =" abajo" k =" arriba," m =" abajo" top =" 25;" d1 =" 'u';">= this.ClientSize.Height)
                pala1.Top = this.ClientSize.Height - pala1.Height;
                d1 = 'd';
                break;

                case 'K':
                //La pala2
                pala2.Top -= 10;
                if (pala2.Top  < top =" 25;" d2 =" 'u';">= this.ClientSize.Height)
                pala2.Top = this.ClientSize.Height - pala2.Height;
                d2 = 'd';
                break;
}
}

        private void BtnControles_Click(object sender, EventArgs e)
        {
            MessageBox.Show ("Pulsar las teclas A y K para subir y las teclas Z y M para bajar las respectivas paletas de losjugadores 1 y 2", "Controles");
        }

        private void BtnSalir_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }
}



02-Jun-2014 01:06
Nacho Cabanes (+83)

Es difícil reproducir un programa de "Windows Forms", porque tu código incluye sólo la parte "lógica", pero no la "parte visual".  Por ejemplo, habría que recrear BtnControles y BtnSalir, y no hay detalles sobre qué son "pala1" y "pala2".

¿Que problema es el que estás teniendo?


02-Jun-2014 01:31
Edvin Gutierrez

si tengo la parte visual e incluso ya tengo creado lo necesario... solo que no me dejo pegar una imagen para que vieran como quedaba


02-Jun-2014 01:37
Nacho Cabanes (+83)

Imagino que la tienes. Lo que digo es que incluyas algún detalle más sobre lo que falla, porque es difícil probarlo viendo apenas la mitad del problema.


02-Jun-2014 01:43
Edvin Gutierrez

ok. La pala1 y pala2 son botones que los e utilizado como "raquetas" y la pelota es un radiobotton que la funcion de ella seria chochar con las "raquetas".


02-Jun-2014 01:58
Edvin Gutierrez

me empieza el error desde esta parte:


if (pelota.Left == pala1.Left + pala1.Width)
            {
                reproducirSonido();
                if (pelota.Top > pala1.Top && pelota.Top < dx =" 1;" dy =" d1" left ="="> pala2.Top && pelota.Top < dx =" -1;" dy =" d2" a =" arriba," z =" abajo" k =" arriba," m =" abajo" top =" 25;" d1 =" 'u';">= this.ClientSize.Height)
                pala1.Top = this.ClientSize.Height - pala1.Height;
                d1 = 'd';
                break;

                case 'K':
                //La pala2
                pala2.Top -= 10;
                if (pala2.Top  < top =" 25;" d2 =" 'u';">= this.ClientSize.Height)
                pala2.Top = this.ClientSize.Height - pala2.Height;
                d2 = 'd';
                break;



02-Jun-2014 23:26
Nacho Cabanes (+83)

No puedo probarlo sin recrear la parte visual, pero no entiendo qué pretendes hacer con ese "if" tan largo y que incluye puntos y coma, asignaciones de valores en incluso órdenes "cas" que no corresponde a ningún "switch".

Si lo has creado tú, tendrás que revisar la lógica; si lo has "copiado y pegado" desde algún sitio, tendrás que comprobar qué has dejado sin incluir.

Yo esperaría una lógica parecida a


if (pelota.Left == pala1.Left + pala1.Width) // Izquierda de pelota con derecha de pala
{
    reproducirSonido();
    pelota.velocidadX = -pelota.velocidadX; // Rebote horizontal
}


Pero eso tampoco es bueno, porque puede ocurrir que nunca llegue a coincidir exactamente el borde de la pelota con el bode de la raqueta, sino que se solapen un poco. Es más fiable mirar si se solapan los rectángulos que contienen la raqueta y la pelota. Cuando tu fuente al menos compile, te ayudo a mejorar esos detalles.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)