예제 #1
0
 // on crée la grille avec le nombre de colonnes et de ligens
 public grille()
 {
     for (int y = 0; y < horizontal; y++)
     {
         for (int x = 0; x < vertical; x++)
         {
             tab[y, x] = new cellule(y, x);
         }
     }
 }
예제 #2
0
        // on crée la grille avec le nombre de colonnes et de ligens

        public grille()
        {
            for (int y = 0; y < horizontal; y++)
            {
                for (int x = 0; x < vertical; x++)
                {
                    tab[y, x] = new cellule(y, x);
                }
            }
        }
예제 #3
0
    unsafe void generate_lab(cellule[] G, int nx, int ny)
    {
        cellule[]     T   = new cellule[nx * ny];
        System.Random rnd = new System.Random();
        int           r   = rnd.Next(0, nx * ny);

        T[0] = G[r];
        int lengthT = 1;
        int n       = nx * ny;

        List <int> GR = new List <int>();

        for (int i = 0; i < n; i++)
        {
            GR.Add(i);
        }
        GR.Remove(r);

        int dir_x = 1;
        int dir_y = 1;
        int go_x  = 1;
        int go_y  = 1;

        while (lengthT < n)
        {
            int i_target = rnd.Next(0, n - lengthT);

            i_target = GR[i_target];
            GR.Remove(i_target);
            int index_ofcc = get_closest_cell(T, G, nx, lengthT, i_target);
            if ((G[index_ofcc].x - G[i_target].x) > 0)
            {
                dir_x = -1;
            }
            if ((G[index_ofcc].y - G[i_target].y) > 0)
            {
                dir_y = -1;
            }
            if (G[i_target].x == G[index_ofcc].x)
            {
                go_x = 0;
            }
            if (G[i_target].y == G[index_ofcc].y)
            {
                go_y = 0;
            }
            create_link(T, G, nx, ny, ref lengthT, index_ofcc, i_target, dir_x, dir_y, go_x, go_y, GR, false);
            dir_x = 1;
            dir_y = 1;
            go_x  = 1;
            go_y  = 1;
        }
    }
예제 #4
0
    unsafe cellule[] generate_grille(int nx, int ny)
    {
        cellule[] G = new cellule[nx * ny];
        int       i = 0;

        for (int y = 0; y < ny; y++)
        {
            for (int x = 0; x < nx; x++)
            {
                G[i]       = new cellule();
                G[i].x     = x;
                G[i].y     = y;
                G[i].left  = null;
                G[i].right = null;

                i++;
            }
        }

        return(G);
    }
예제 #5
0
        // on ajoute un bateau selon une cellule de départ et une direction
        public bool ajoutBateau(bateau bateau, cellule cellule, direction direction)
        {
            int taille = bateau.taille;
            int x = cellule.x;
            int y = cellule.y;
            // on vérifie le placement d'un bateau en position verticale vers le bas

            switch (direction)
            {
                case direction.bas:
                    //on vérifie si il y a asser de place pour le placement du bateau
                    // la taille du bateau + la valeur de la cellule de départ ne peut dépasser la longueur totale de la colonne
                    if (y + taille <= 10)
                    {
                        // on initialise une variable bool à true
                        bool ok = true;
                        // on fait une boucle pour la taille du bateau
                        for (int i = 0; i < taille; i++)
                        {
                            if (tab[y+i, x].etat != etat.eau)
                            {
                                ok = false;
                            }
                        }

                        if (ok)
                        {
                            // on fait une boucle pour la taille du bateau
                            for (int i = 0; i < taille; i++)
                            {
                                // on place le bateau
                                tab[y+i, x].ajoutBateau(bateau);

                            }
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    }
                    else
                    {
                        return false;
                    }

                case direction.haut:
                    //la taille de vérification doit être inversée du fait qu'on remonte vers la cellule 0
                    if (y - taille >= 0)
                    {
                        bool ok = true;
                        for (int i = 0; i < taille; i++)
                        {
                            if (tab[y-i,x].etat != etat.eau)
                            {
                                ok = false;
                            }
                        }

                        if (ok)
                        {
                            for (int i = 0; i < taille; i++)
                            {
                                tab[y-i, x].ajoutBateau(bateau);

                            }
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    }
                    else
                    {
                        return false;
                    }

                case direction.gauche:
                    if (x - taille >= 0)
                    {
                        bool ok = true;
                        for (int i = 0; i < taille; i++)
                        {
                            if (tab[y, x-i].etat != etat.eau)
                            {
                                ok = false;
                            }
                        }

                        if (ok)
                        {
                            for (int i = 0; i < taille; i++)
                            {
                                tab[y, x-i].ajoutBateau(bateau);

                            }
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    }
                    else
                    {
                        return false;
                    }

                case direction.droite:
                    if (x + taille <= 10)
                    {
                        bool ok = true;
                        for (int i = 0; i < taille; i++)
                        {
                            if (tab[y, x+i].etat != etat.eau)
                            {
                                ok = false;
                            }
                        }

                        if (ok)
                        {
                            for (int i = 0; i < taille; i++)
                            {
                                tab[y, x+i].ajoutBateau(bateau);

                            }
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    }
                    else
                    {
                        return false;
                    }
                default:
                    return false;
            }
        }
예제 #6
0
        // on ajoute un bateau selon une cellule de départ et une direction
        public bool ajoutBateau(bateau bateau, cellule cellule, direction direction)
        {
            int taille = bateau.taille;
            int x      = cellule.x;
            int y      = cellule.y;

            // on vérifie le placement d'un bateau en position verticale vers le bas

            switch (direction)
            {
            case direction.bas:
                //on vérifie si il y a asser de place pour le placement du bateau
                // la taille du bateau + la valeur de la cellule de départ ne peut dépasser la longueur totale de la colonne
                if (y + taille <= 10)
                {
                    // on initialise une variable bool à true
                    bool ok = true;
                    // on fait une boucle pour la taille du bateau
                    for (int i = 0; i < taille; i++)
                    {
                        if (tab[y + i, x].etat != etat.eau)
                        {
                            ok = false;
                        }
                    }

                    if (ok)
                    {
                        // on fait une boucle pour la taille du bateau
                        for (int i = 0; i < taille; i++)
                        {
                            // on place le bateau
                            tab[y + i, x].ajoutBateau(bateau);
                        }
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                }
                else
                {
                    return(false);
                }

            case direction.haut:
                //la taille de vérification doit être inversée du fait qu'on remonte vers la cellule 0
                if (y - taille >= 0)
                {
                    bool ok = true;
                    for (int i = 0; i < taille; i++)
                    {
                        if (tab[y - i, x].etat != etat.eau)
                        {
                            ok = false;
                        }
                    }

                    if (ok)
                    {
                        for (int i = 0; i < taille; i++)
                        {
                            tab[y - i, x].ajoutBateau(bateau);
                        }
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                }
                else
                {
                    return(false);
                }

            case direction.gauche:
                if (x - taille >= 0)
                {
                    bool ok = true;
                    for (int i = 0; i < taille; i++)
                    {
                        if (tab[y, x - i].etat != etat.eau)
                        {
                            ok = false;
                        }
                    }

                    if (ok)
                    {
                        for (int i = 0; i < taille; i++)
                        {
                            tab[y, x - i].ajoutBateau(bateau);
                        }
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                }
                else
                {
                    return(false);
                }

            case direction.droite:
                if (x + taille <= 10)
                {
                    bool ok = true;
                    for (int i = 0; i < taille; i++)
                    {
                        if (tab[y, x + i].etat != etat.eau)
                        {
                            ok = false;
                        }
                    }

                    if (ok)
                    {
                        for (int i = 0; i < taille; i++)
                        {
                            tab[y, x + i].ajoutBateau(bateau);
                        }
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                }
                else
                {
                    return(false);
                }

            default:
                return(false);
            }
        }
예제 #7
0
    unsafe public void generate()
    {
        generatebutton.interactable = false;

        int nx = int.Parse(Xfield.text);
        int ny = int.Parse(Yfield.text);

        MazeSurface.localScale = new Vector3(nx, 0.2f, ny);

        MazeSurface.position = new Vector3((float)(nx % 2) / 2, MazeSurface.position.y, (float)((ny + 1) % 2) / 2);
        cellule[] G = new cellule[nx * ny];
        G = generate_grille(nx, ny);

        generate_lab(G, nx, ny);
        Vector3    SpawnPosition = new Vector3(-nx / 2, 0.5f, ny / 2);
        Vector3    nextPosition;
        int        n = nx * ny;
        GameObject tempWall;

        #region GenerateWalls
        int k = 0;
        for (int l = 0; l < nx; l++)
        {
            nextPosition = new Vector3(SpawnPosition.x + l + 0.5f, 0.5f, SpawnPosition.z + 0.5f);
            tempWall     = Instantiate(Wall, nextPosition, Quaternion.Euler(0.0f, 90.0f, 0.0f)) as GameObject;
            tempWall.transform.parent = upperWall;
        }
        for (int j = 0; j < ny; j++)
        {
            nextPosition = new Vector3(SpawnPosition.x, 0.5f, SpawnPosition.z - j);
            Instantiate(Wall, nextPosition, Quaternion.identity, leftWall);

            for (int i = 0; i < nx; i++)
            {
                if (k + nx < n)
                {
                    fixed(cellule *c1 = &G[k])
                    {
                        fixed(cellule *c2 = &G[k + nx])
                        {
                            if (!(c1->left == c2 || c1->right == c2 || c2->left == c1 || c2->right == c1))
                            {
                                nextPosition = new Vector3(SpawnPosition.x + i + 0.5f, 0.5f, SpawnPosition.z - j - 0.5f);
                                tempWall     = Instantiate(Wall, nextPosition, Quaternion.Euler(0.0f, 90.0f, 0.0f)) as GameObject;
                                tempWall.transform.parent = maze;
                            }
                        }
                    }
                }
                else
                {
                    nextPosition = new Vector3(SpawnPosition.x + i + 0.5f, 0.5f, SpawnPosition.z - j - 0.5f);
                    tempWall     = Instantiate(Wall, nextPosition, Quaternion.Euler(0.0f, 90.0f, 0.0f)) as GameObject;
                    tempWall.transform.parent = lowerWall;
                }
                if (k + 1 < n)
                {
                    fixed(cellule *c1 = &G[k])
                    {
                        fixed(cellule *c2 = &G[k + 1])
                        {
                            if (!(c1->left == c2 || c1->right == c2 || c2->left == c1 || c2->right == c1))
                            {
                                nextPosition = new Vector3(SpawnPosition.x + i + 1.0f, 0.5f, SpawnPosition.z - j);
                                if ((k + 1) % nx == 0)
                                {
                                    Instantiate(Wall, nextPosition, Quaternion.identity, rightWall);
                                }
                                else
                                {
                                    Instantiate(Wall, nextPosition, Quaternion.identity, maze);
                                }
                            }
                        }
                    }
                }
                else
                {
                    nextPosition = new Vector3(SpawnPosition.x + i + 1.0f, 0.5f, SpawnPosition.z - j);
                    Instantiate(Wall, nextPosition, Quaternion.identity, rightWall);
                }
                k++;
            }
        }
        #endregion
        #region Enter/Exit
        List <int> ids = new List <int>();
        for (int i = 0; i < 4; i++)
        {
            ids.Add(i);
        }
        System.Random rnd = new System.Random();
        int           r   = rnd.Next(0, 4);
        startPosition = removewall(ids[r], nx, ny);

        ids.Remove(ids[r]);
        r           = rnd.Next(0, 3);
        endPosition = removewall(ids[r], nx, ny);
        #endregion
        NavSurface.BuildNavMesh();
        SpawnButton.interactable = true;
    }