Collisions in game snake c #

0

I'm doing the snake game in c #, and the collisions with the walls and with the snake itself are giving me problems, this is the whole code that I've been up to now:

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

namespace Cuc
{
    class Program
    {
        public struct Coords
        {
            public int cXanelles;
        }
        public struct CoordsCuc
        {
            public int cX, cY;
            public char direcció;
            public int llargada;
        }

        public struct fruita
        {
            public int x, y, durada, augment, valorNutritiu;
        }

        static void Main(string[] args)
        {
            bool colisio = false;
            bool final = false;
            int Augment = 0;
            int duradafalsa = 0;
            int[] cucx = new int[1800];
            int[] cucy = new int[1800];


            CoordsCuc cuc = new CoordsCuc();
            cuc.cX = 37;
            cuc.cY = 12;
            cuc.llargada = 4;

            Coords body = new Coords();
            body.cXanelles = 37;

            CoordsCuc Direccions;
            Direccions.direcció = 'W';
            ConsoleKeyInfo cki;

            fruita Fruita = new fruita();
            Fruita.durada = 0;
            Fruita.valorNutritiu = 9;
            Fruita.x = 0;
            Fruita.y = 0;

            pintaMarc();

            PintarCuc1rPosicio(ref body.cXanelles, ref cucx, ref cucy, ref cuc);

            while (!final)
            {
                if (Console.KeyAvailable)
                {
                    cki = Console.ReadKey();
                    if (cki.Key == ConsoleKey.LeftArrow)
                    {
                        Direccions.direcció = 'W';
                    }
                    if (cki.Key == ConsoleKey.RightArrow)
                    {
                        Direccions.direcció = 'E';
                    }
                    if (cki.Key == ConsoleKey.UpArrow)
                    {
                        Direccions.direcció = 'N';
                    }
                    if (cki.Key == ConsoleKey.DownArrow)
                    {
                        Direccions.direcció = 'S';
                    }
                    if (cki.Key == ConsoleKey.Escape)
                    {
                        final = true;
                    }

                }
                while (Fruita.durada == 0)
                {
                    PosarFruita(ref Fruita, ref cuc, ref duradafalsa, ref cucx, ref cucy);
                }

                PodrirFruita(ref Augment, ref Fruita, ref cuc, ref duradafalsa, ref cucx, ref cucy);

                MovimentCUC(ref Augment, ref cucx, ref cucy, ref cuc, ref Direccions.direcció);

                colisio = Colisions(ref cuc, ref cucx, ref cucy);

                if (!colisio)
                {
                    final = true;
                }

                System.Threading.Thread.Sleep(150);

            }

        }
        public static void pintaMarc()
        {

            Console.SetCursorPosition(1, 2);
            Console.WriteLine("╔");
            Console.SetCursorPosition(75, 2);
            Console.WriteLine("╗");
            Console.SetCursorPosition(75, 25);
            Console.WriteLine("╝");
            Console.SetCursorPosition(1, 25);
            Console.WriteLine("╚");

            for (int x = 2; x < 75; x++)
            {
                Console.SetCursorPosition(x, 2);
                Console.WriteLine("═");
            }
            for (int x = 2; x < 75; x++)
            {
                Console.SetCursorPosition(x, 25);
                Console.WriteLine("═");
            }
            for (int y = 3; y < 25; y++)
            {
                Console.SetCursorPosition(1, y);
                Console.WriteLine("║");
                Console.SetCursorPosition(75, y);
                Console.WriteLine("║");
            }
        }
        public static void PintarCuc1rPosicio(ref int cXanelles, ref int[] cucx, ref int[] cucy, ref CoordsCuc cuc)
        {
            Console.SetCursorPosition(cuc.cX, cuc.cY);
            Console.WriteLine("☻");

            for (int x = 0; x < cuc.llargada; x++)
            {
                cXanelles = cXanelles + 1;
                Console.SetCursorPosition(cXanelles, cuc.cY);
                Console.WriteLine("█");
                cucx[x] = cXanelles;
                cucy[x] = cuc.cY;
            }

        }
        public static void MovimentCUC(ref int Augment, ref int[] cucx, ref int[] cucy, ref CoordsCuc cuc, ref char direcció)
        {

            if (Augment != 0)
            {
                cuc.llargada++;
                Augment--;
            }
            for (int x = cuc.llargada; x > 0; x--)
            {

                cucx[x] = cucx[x - 1];
                cucy[x] = cucy[x - 1];
            }
            cucx[0] = cuc.cX;
            cucy[0] = cuc.cY;
            if (direcció == 'W')
            {
                Console.SetCursorPosition(cuc.cX, cuc.cY);
                Console.WriteLine("█");
                cuc.cX--;
                Console.SetCursorPosition(cuc.cX, cuc.cY);
                Console.WriteLine("☻");

            }
            if (direcció == 'E')
            {
                Console.SetCursorPosition(cuc.cX, cuc.cY);
                Console.WriteLine("█");
                cuc.cX++;
                Console.SetCursorPosition(cuc.cX, cuc.cY);
                Console.WriteLine("☻");
            }
            if (direcció == 'N')
            {
                Console.SetCursorPosition(cuc.cX, cuc.cY);
                Console.WriteLine("█");
                cuc.cY--;
                Console.SetCursorPosition(cuc.cX, cuc.cY);
                Console.WriteLine("☻");
            }
            if (direcció == 'S')
            {
                Console.SetCursorPosition(cuc.cX, cuc.cY);
                Console.WriteLine("█");
                cuc.cY++;
                Console.SetCursorPosition(cuc.cX, cuc.cY);
                Console.WriteLine("☻");
            }

            Console.SetCursorPosition(cucx[cuc.llargada], cucy[cuc.llargada]);
            Console.WriteLine(" ");

            for (int x = 0; x < cuc.llargada; x++)
            {
                Console.SetCursorPosition(cucx[x], cucy[x]);
                Console.WriteLine("█");
            }
        }
        public static bool Colisionsf(ref CoordsCuc cuc, ref fruita fruita, ref int[] cucx, ref int[] cucy)
        {
            bool minitruex = false;
            bool minitruey = false;
            //Fruita
            if (fruita.x == cuc.cX & fruita.y == cuc.cY)
            {
                return false;
            }
            for (int i = 0; i < cuc.llargada; i++)
            {
                if (fruita.x == cucx[i])
                {
                    minitruex = true;
                }
                if (fruita.y == cucy[i])
                {
                    minitruey = true;
                }
                if (minitruex == minitruey & minitruex)
                {
                    return false;
                }
            }
            return true;

        }
        public static bool Colisions(ref CoordsCuc cuc, ref int[] cucx, ref int[] cucy)
        {
            bool colisio = false;

            //Colisio Parets
            if (74 == cuc.cX || 25 == cuc.cY || 2 == cuc.cX || 2 == cuc.cY)
            {
                return false;
            }
            //Colisio Cos
            for (int i = 0; i < cuc.llargada; i++)
            {
                if (cuc.cX == cucx[i])
                {
                    colisio = true;
                    break;
                }
                if (cuc.cY == cucy[i])
                {
                    colisio = true;
                    break;
                }
                else
                {
                    return false;
                }
            }

            return colisio;

        }

        public static void PosarFruita(ref fruita fruita, ref CoordsCuc cuc, ref int duradafruita, ref int[] cucx, ref int[] cucy)
        {
            bool Comprovaciocolisio = false;
            Random rnd = new Random();

            while (!Comprovaciocolisio)
            {
                fruita.x = rnd.Next(2, 75);
                fruita.y = rnd.Next(3, 25);
                Comprovaciocolisio = Colisionsf(ref cuc, ref fruita, ref cucx, ref cucy);
            }

            fruita.valorNutritiu = 9;
            fruita.durada = 60;
            duradafruita = fruita.durada;

            //return;

        }

        public static void PodrirFruita(ref int Augment, ref fruita fruita, ref CoordsCuc cuc, ref int duradafruita, ref int[] cucx, ref int[] cucy)
        {

            if ((cuc.cX == fruita.x) & (cuc.cY == fruita.y))
            {
                Augment = Augment + fruita.valorNutritiu;
                PosarFruita(ref fruita, ref cuc, ref duradafruita, ref cucx, ref cucy);
            }

            else
            {
                Console.SetCursorPosition(fruita.x, fruita.y);
                Console.WriteLine(fruita.valorNutritiu);
                duradafruita--;

                if (duradafruita == (fruita.durada - 6))
                {

                    fruita.durada = fruita.durada - 6;
                    fruita.valorNutritiu--;

                    if (duradafruita == 0)
                    {
                        Console.SetCursorPosition(fruita.x, fruita.y);
                        Console.WriteLine(" ");
                    }
                }
            }
            //return;
        }

    }
}

Ok, I think the main problem I have here:

public static bool Colisions(ref CoordsCuc cuc, ref int[] cucx, ref int[] cucy)
{
    bool colisio = false;

    //Colisio Parets
    if (74 == cuc.cX || 25 == cuc.cY || 2 == cuc.cX || 2 == cuc.cY)
    {
        return false;
    }
    //Colisio Cos
    for (int i = 0; i < cuc.llargada; i++)
    {
        if (cuc.cX == cucx[i])
        {
            colisio = true;
            break;
        }
        if (cuc.cY == cucy[i])
        {
            colisio = true;
            break;
        }
        else
        {
            return false;
        }
    }

    return colisio;

}

Here I have mainly two problems, when pulling to the left and hitting the wall, it makes a block earlier than it should, not like in the other walls that seems to get to eat a block. And the last problem, is that the snake does not collide with itself and that is because I think it does not properly enter the if of the last function cited. Let's see if anyone can help me, thank you very much.

By the way, I think I fail a bit to have two arrays declared in main ... If someone sees some way to improve the code that leaves it out there too, again thanks and best regards!

    
asked by THR4SH3RP0L0 06.04.2017 в 13:02
source

1 answer

1

Solved, the code has stayed like this:

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

namespace Cuc
{
    class Program
    {
        public struct Coords
        {
            public int cXanelles;
        }
        public struct CoordsCuc
        {
            public int cX, cY;
            public char direcció;
            public int llargada;
        }

        public struct fruita
        {
            public int x, y, durada, augment, valorNutritiu;
        }

        static void Main(string[] args)
        {
            bool colisioP = false, colisioC = false, final = false;
            int Augment = 0;
            int duradafalsa = 0;
            int[] cucx = new int[1800];
            int[] cucy = new int[1800];

            CoordsCuc cuc = new CoordsCuc();
            cuc.cX = 37;
            cuc.cY = 12;
            cuc.llargada = 4;
            cuc.direcció = 'W';

            Coords body = new Coords();
            body.cXanelles = 37;

            fruita Fruita = new fruita();
            Fruita.durada = 0;
            Fruita.valorNutritiu = 9;
            Fruita.x = 0;
            Fruita.y = 0;
            Fruita.augment = 0;

            ConsoleKeyInfo cki;

            pintaMarc();

            PintarCuc1rPosicio(ref body.cXanelles, ref cucx, ref cucy, ref cuc);

            while (!final)
            {
                if (Console.KeyAvailable)
                {
                    cki = Console.ReadKey();
                    if (cki.Key == ConsoleKey.LeftArrow)
                    {
                        cuc.direcció = 'W';
                    }
                    if (cki.Key == ConsoleKey.RightArrow)
                    {
                        cuc.direcció = 'E';
                    }
                    if (cki.Key == ConsoleKey.UpArrow)
                    {
                        cuc.direcció = 'N';
                    }
                    if (cki.Key == ConsoleKey.DownArrow)
                    {
                        cuc.direcció = 'S';
                    }
                    if (cki.Key == ConsoleKey.Escape)
                    {
                        final = true;
                    }

                }
                while (Fruita.durada == 0)
                {
                    PosarFruita(ref Fruita, ref cuc, ref duradafalsa, ref cucx, ref cucy);
                }

                PodrirFruita(ref Fruita, ref cuc, ref duradafalsa, ref cucx, ref cucy);

                MovimentCUC(ref Fruita, ref cucx, ref cucy, ref cuc, ref cuc.direcció);

                colisioC = ColisionsC(ref cuc, ref cucx, ref cucy);
                colisioP = ColisionsP(ref cuc, ref cucx, ref cucy);

                if (!colisioC || !colisioP)
                {
                    Console.WriteLine("Has mort");
                    final = true;
                }

                System.Threading.Thread.Sleep(150);

            }

        }
        public static void pintaMarc()
        {

            Console.SetCursorPosition(1, 2);
            Console.WriteLine("╔");
            Console.SetCursorPosition(75, 2);
            Console.WriteLine("╗");
            Console.SetCursorPosition(75, 25);
            Console.WriteLine("╝");
            Console.SetCursorPosition(1, 25);
            Console.WriteLine("╚");

            for (int x = 2; x < 75; x++)
            {
                Console.SetCursorPosition(x, 2);
                Console.WriteLine("═");
            }
            for (int x = 2; x < 75; x++)
            {
                Console.SetCursorPosition(x, 25);
                Console.WriteLine("═");
            }
            for (int y = 3; y < 25; y++)
            {
                Console.SetCursorPosition(1, y);
                Console.WriteLine("║");
                Console.SetCursorPosition(75, y);
                Console.WriteLine("║");
            }
        }
        public static void PintarCuc1rPosicio(ref int cXanelles, ref int[] cucx, ref int[] cucy, ref CoordsCuc cuc)
        {
            Console.SetCursorPosition(cuc.cX, cuc.cY);
            Console.WriteLine("☻");

            for (int x = 0; x < cuc.llargada; x++)
            {
                cXanelles = cXanelles + 1;
                Console.SetCursorPosition(cXanelles, cuc.cY);
                Console.WriteLine("█");
                cucx[x] = cXanelles;
                cucy[x] = cuc.cY;
            }

        }
        public static void MovimentCUC(ref fruita fruita, ref int[] cucx, ref int[] cucy, ref CoordsCuc cuc, ref char direcció)
        {

            if (fruita.augment != 0)
            {
                cuc.llargada++;
                fruita.augment--;
            }
            for (int x = cuc.llargada; x > 0; x--)
            {

                cucx[x] = cucx[x - 1];
                cucy[x] = cucy[x - 1];
            }
            cucx[0] = cuc.cX;
            cucy[0] = cuc.cY;
            if (direcció == 'W')
            {
                Console.SetCursorPosition(cuc.cX, cuc.cY);
                Console.WriteLine("█");
                cuc.cX--;
                Console.SetCursorPosition(cuc.cX, cuc.cY);
                Console.WriteLine("☻");

            }
            if (direcció == 'E')
            {
                Console.SetCursorPosition(cuc.cX, cuc.cY);
                Console.WriteLine("█");
                cuc.cX++;
                Console.SetCursorPosition(cuc.cX, cuc.cY);
                Console.WriteLine("☻");
            }
            if (direcció == 'N')
            {
                Console.SetCursorPosition(cuc.cX, cuc.cY);
                Console.WriteLine("█");
                cuc.cY--;
                Console.SetCursorPosition(cuc.cX, cuc.cY);
                Console.WriteLine("☻");
            }
            if (direcció == 'S')
            {
                Console.SetCursorPosition(cuc.cX, cuc.cY);
                Console.WriteLine("█");
                cuc.cY++;
                Console.SetCursorPosition(cuc.cX, cuc.cY);
                Console.WriteLine("☻");
            }

            Console.SetCursorPosition(cucx[cuc.llargada], cucy[cuc.llargada]);
            Console.WriteLine(" ");

            esborraArray(cuc, ref cucx, ref cucy);

            for (int x = 0; x < cuc.llargada; x++)
            {
                Console.SetCursorPosition(cucx[x], cucy[x]);
                Console.WriteLine("█");
            }
        }
        public static bool Colisionsf(ref CoordsCuc cuc, ref fruita fruita, ref int[] cucx, ref int[] cucy)
        {
            bool trueX = false;
            bool trueY = false;

            if (fruita.x == cuc.cX & fruita.y == cuc.cY)
            {
                return false;
            }
            for (int i = 0; i < cuc.llargada; i++)
            {
                if (fruita.x == cucx[i])
                {
                    trueX = true;
                }
                if (fruita.y == cucy[i])
                {
                    trueY = true;
                }
                if (trueX == trueY & trueX)
                {
                    return false;
                }
            }
            return true;

        }
        public static bool ColisionsP(ref CoordsCuc cuc, ref int[] cucx, ref int[] cucy)
        {
            bool colisio = false;


            if (74 == cuc.cX || 25 == cuc.cY || 2 == cuc.cX || 2 == cuc.cY)
            {
                return colisio;
            }
            else
            {
                colisio = true;
            }

            return colisio;

        }

        public static bool ColisionsC(ref CoordsCuc cuc, ref int[] cucx, ref int[] cucy)
        {
            bool trueX = false;
            bool trueY = false;

            for (int i = 0; i < cuc.llargada; i++)
            {
                if (cuc.cX == cucx[i])
                {
                    trueX = true;
                }
                if (cuc.cY == cucy[i])
                {
                    trueY = true;
                }
                if (trueX == trueY & trueX)
                {
                    return false;
                }
            }

            return true;

        }

        public static void esborraArray(CoordsCuc cuc, ref int[] cucX, ref int[] cucY)
        {
            cucX[cuc.llargada] = 0;
            cucY[cuc.llargada] = 0;
        }

        public static void PosarFruita(ref fruita fruita, ref CoordsCuc cuc, ref int duradafruita, ref int[] cucx, ref int[] cucy)
        {
            bool Comprovaciocolisio = false;
            Random rnd = new Random();

            while (!Comprovaciocolisio)
            {
                fruita.x = rnd.Next(2, 75);
                fruita.y = rnd.Next(3, 25);
                Comprovaciocolisio = Colisionsf(ref cuc, ref fruita, ref cucx, ref cucy);
            }

            fruita.valorNutritiu = 9;
            fruita.durada = 60;
            duradafruita = fruita.durada;

        }

        public static void PodrirFruita(ref fruita fruita, ref CoordsCuc cuc, ref int duradafruita, ref int[] cucx, ref int[] cucy)
        {

            if ((cuc.cX == fruita.x) & (cuc.cY == fruita.y))
            {
                fruita.augment += fruita.valorNutritiu;
                PosarFruita(ref fruita, ref cuc, ref duradafruita, ref cucx, ref cucy);
            }

            else
            {
                Console.SetCursorPosition(fruita.x, fruita.y);
                Console.WriteLine(fruita.valorNutritiu);
                duradafruita--;

                if (duradafruita == (fruita.durada - 6))
                {

                    fruita.durada = fruita.durada - 6;
                    fruita.valorNutritiu--;

                    if (duradafruita == 0)
                    {
                        Console.SetCursorPosition(fruita.x, fruita.y);
                        Console.WriteLine(" ");
                    }
                }
            }
        }

    }
}

And so the collision function:

 public static bool ColisionsC(ref CoordsCuc cuc, ref int[] cucx, ref int[] cucy)
        {
            bool trueX = false;
            bool trueY = false;

            for (int i = 0; i < cuc.llargada; i++)
            {
                if (cuc.cX == cucx[i])
                {
                    trueX = true;
                }
                if (cuc.cY == cucy[i])
                {
                    trueY = true;
                }
                if (trueX == trueY & trueX)
                {
                    return false;
                }
            }

            return true;

        }
    
answered by 06.04.2017 / 16:59
source