sábado, 27 de agosto de 2016

Como hacer un juego de Snake en C# (Windows Forms)


Para ver en youtube clic aquí
(No olvides suscribirte)


Juego de snake

   Este juego fue lanzado a mediados de lo años 70, a diferencia de lo que muchos creen no fue desarrollado por la Nokia, pero gracias a esta última adquirió una popularidad masiva debido a que venia pre-instalado en los teléfonos de esta marca.

Archivos del Video tutorial

  Nota: Todos los enlaces están patrocinados por Adfly luego de hacer clic esperas unos segundos y haces clic en "Saltar publicidad", debería llevarte directamente al archivo para su descarga, si no es así comunícate inmediatamente conmigo a través de un comentario

Imágenes

Ejemplo de Snake en WPF (Windows Presentation Foundation) proyecto completo Visual Studio

   Este último ejemplo es para que compares las diferencias con Windows Forms, no son muchas, estas solo son referentes a la interfaz gráfica, suscríbete a mi canal para ver más tutoriales como este, pronto publicaré el mismo tutorial pero en WPF

Código fuente completo (Windows Forms)

Form1.cs


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 snake1
{
    public partial class Form1 : Form
    {
        Graphics juego;
        Cola cabeza;
        Comida comida;
        int espacio;
        int xdir = 0,ydir = 0;
        int puntaje = 0;
        Boolean ejex = true, ejey = true;
        public Form1()
        {
            espacio = 10;
            InitializeComponent();
            juego = canvas.CreateGraphics();
            cabeza = new Cola(10, 10);
            comida = new Comida();
        }
        public void findeJuego()
        {
            xdir = 0;
            ydir = 0;
            puntaje = 0;
            puntos.Text = "0";
            ejex = true;
            ejey = true;
            cabeza = new Cola(10, 10);
            comida = new Comida();
            MessageBox.Show("Perdiste");
        }
        public void choqueCuerpo()
        {
            Cola temp;
            try
            {
                temp = cabeza.verSiguiente().verSiguiente();
            } catch(Exception err)
            {
                temp = null;
            }
            while(temp != null)
            {
                if (cabeza.interseccion(temp))
                {
                    findeJuego();
                } else
                {
                    temp = temp.verSiguiente();
                }
            }
        }

        public void choquePared()
        {
            if(cabeza.getX() < 0 || cabeza.getX() > 760 || cabeza.getY() < 0 || cabeza.getY() > 360)
            {
                findeJuego();
            }
        }

        public void dibujar()
        {
            juego.Clear(Color.White);
            cabeza.dibujar(juego);
            comida.dibujar(juego);
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (ejex)
            {
                if(e.KeyCode == Keys.Up)
                {
                    ydir = -espacio;
                    xdir = 0;
                    ejex = false;
                    ejey = true;
                }
                if (e.KeyCode == Keys.Down)
                {
                    ydir = espacio;
                    xdir = 0;
                    ejex = false;
                    ejey = true;
                }
            }
            if (ejey)
            {
                if (e.KeyCode == Keys.Right)
                {
                    ydir = 0;
                    xdir = espacio;
                    ejex = true;
                    ejey = false;
                }
                if (e.KeyCode == Keys.Left)
                {
                    ydir = 0;
                    xdir = -espacio;
                    ejex = true;
                    ejey = false;
                }
            }
        }

        public void movimiento()
        {
            cabeza.setxy(cabeza.getX() + xdir, cabeza.getY() + ydir);
        }

        private void bucle_Tick(object sender, EventArgs e)
        {
            dibujar();
            movimiento();
            choqueCuerpo();
            choquePared();
            if (cabeza.interseccion(comida))
            {
                comida.colocar();
                cabeza.meter();
                puntos.Text = (puntaje++).ToString();
            }
        }
    }
}

Cola.cs

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace snake1
{
    class Cola : objeto
    {
        Cola siguiente;
        public Cola(int x, int y)
        {
            this.x = x;
            this.y = y;
            siguiente = null;
        }
        public void dibujar(Graphics g)
        {
            if(siguiente != null)
            {
                siguiente.dibujar(g);
            }
            g.FillRectangle(new SolidBrush(Color.Blue), this.x, this.y, this.espacio, this.espacio);
        }
        public void setxy(int x, int y)
        {
            if(siguiente != null)
            {
                siguiente.setxy(this.x, this.y);
            }
            this.x = x;
            this.y = y;
        }
        public void meter()
        {
            if(siguiente == null)
            {
                siguiente = new Cola(this.x, this.y);
            } else
            {
                siguiente.meter();
            }
        }
        public int getX()
        {
            return this.x;
        }
        public int getY()
        {
            return this.y;
        }
        public Cola verSiguiente()
        {
            return siguiente;
        }
    }
}

objeto.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace snake1
{
    class objeto
    {
        protected int x, y, espacio;
        public objeto()
        {
            espacio = 10;
        }
        public Boolean interseccion(objeto o)
        {
            int difx = Math.Abs(this.x - o.x);
            int dify = Math.Abs(this.y - o.y);
            if(difx >= 0 && difx < espacio && dify >= 0 && dify < espacio)
            {
                return true;
            } else
            {
                return false;
            }
        }
    }
}

Comida.cs

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace snake1
{
    class Comida : objeto
    {

        public Comida()
        {
            this.x = generar(77);
            this.y = generar(37);
        }
        public void dibujar(Graphics g)
        {
            g.FillRectangle(new SolidBrush(Color.Red), this.x, this.y, this.espacio, this.espacio);
        }
        public void colocar()
        {
            this.x = generar(77);
            this.y = generar(37);
        }
        public int generar(int n)
        {
            Random random = new Random();
            int num = random.Next(0, n) * 10;
            return num;
        }
    }
}

38 comentarios:

  1. cuando ejecuto el juego no me corre para nada la serpiente podrias ayudarme

    ResponderEliminar
    Respuestas
    1. Ya te respondí en youtube, hiciste seguramente algo mal, compara el código fuente

      Eliminar
    2. Joan a ver que problema presenta?

      Eliminar
    3. Viejo para que te corra tienes iniciar el timer = bucle con buble.start();

      Eliminar
    4. bucle.start(); corregido el anterior lo escribi mal XD

      Eliminar
    5. En cual metodo hay que poner bucle.start(); ???

      Eliminar
    6. hola como lo solucionaste me ocurre el mismo error

      Eliminar
  2. gracias por compartir tus conocimientos que buena gente eres

    ResponderEliminar
    Respuestas
    1. Me alegra que te haya servido, puedes también suscribirte a mi canal de youtube

      Eliminar
  3. tengo problemas al generar numero random porque a veces la manzana no aparece dentro del canvas, he utilizado las mismas dimensiones que tu, a ver si puedes hacer un video en el que expliques las medidas y como cambiar de posición en relación de los limites de los objetos

    ResponderEliminar
    Respuestas
    1. Las medidas del código deben coincidir con las medidas reales, revisa el panel de propiedades

      Eliminar
  4. tengo el mismo problema que TravisPlay

    ResponderEliminar
  5. Gracias por publicar y ayuda a la comunidad me ha servido de mucho todo a la perfeccion incluso mirando esto no tan solo lo hize y lo jugue, tambien comprendi mas como funciona el lenguaje programacion C#, das muy buena explicacion Ojala pueda seguir subiendo mas video respeto a los videos juegos.

    ResponderEliminar
  6. muchas gracias, una pregunta como podria ponerle niveles, por ejemplo que al comer 5 manzanas me mande a otro nivel con mas velocida y obstaculos

    ResponderEliminar
    Respuestas
    1. Lo de subir niveles es sencillo ya que tienes que cambiar el intervalo de la herramienta timer , mientras menos valor tenga su intervalo mas rapido sera la ejecucio del codigo

      Eliminar
    2. Podrías ayudarme por favor, no he podido hacer que cambie de nivel.

      Eliminar
  7. Hola bro, ¿cuál es tu nombre? Tome prestadas partes de tu código, y se me hace anti ético no citarte en mi trabajo final.
    PD: sos un genio.

    ResponderEliminar
  8. EL JUEGO SE PUEDE HACER EN VISUAL 2012 O SOLO 2015

    ResponderEliminar
    Respuestas
    1. Supongo que si, si es el mismo lenguaje y las mismas librerías debería funcionar sin diferencia

      Eliminar
  9. Buenas, tendrás el archivo de Visual Studio subido para poder descargarlo ?

    ResponderEliminar
  10. Amigo,me gustaría saber un par de cosas más para esto,por favor.
    1. Cómo se pone pausa?
    2. Cómo puedo guardar la partida del juego y luego cargarla después de cerrarla?
    3. Cómo poner obstáculos?

    ResponderEliminar
  11. Buen dia, tan pronto llego a 2 puntos el juego me mata, por que podria ser? gracias

    ResponderEliminar
  12. Hola buenas, porque no corre la serpiente, no arranca ni nada. cual es la solucion ? o donde hay que poner un codigo ?

    ResponderEliminar
  13. como lo realiso los proceso para poder jugar ,tengo que copiar todo ese codigo en el bloc de notas?

    ResponderEliminar
  14. al poner esta sentencia me marca error y desparece el rectangulo principal
    if (cabeza.interseccion(comida))
    {
    comida.colocar();
    }

    ResponderEliminar
  15. no puede comer , cuando inicio el programa por q pasa eso ?

    ResponderEliminar
  16. Holaa me podrias ayudar a ingresar obstaculos?
    Como seria si tuviera obstaculos?

    ResponderEliminar