Пример #1
0
        public override Board shoot(Player opponent, Board boardOpponent)
        {
            List <SeaElement> elementPlayer = boardOpponent.SeaElementList;

            SeaElement shootable = ButtonBuffer.getPressedSeaElement(); // case ayant été cliquée

            if (shootable == null)
            {
                return(null);
            }
            if (shootable.button.Name[1] != '2')
            {
                return(null);
            }

            if (opponent.id == 2)
            {
                ButtonBuffer.setPressedSeaElement(null);
                shootable.known = true; // on révèle la case
                if (shootable.state == State.Water)
                {
                    shootable.state = State.Plouf; // raté !
                }
                if (shootable.state == State.Boat)
                {
                    for (int nboat = 0; nboat < opponent.boatList.Length; nboat++)
                    {
                        {
                            Boat currentBoat = opponent.boatList[nboat]; // on recherche le bateau à qui appartient la case que l'on a touchée
                            for (int element = 0; element < currentBoat.size; element++)
                            {
                                if ((shootable.posX == currentBoat.position[element].posX) && (shootable.posY == currentBoat.position[element].posY))
                                {
                                    int pv = currentBoat.Life();
                                    if (pv > 1)
                                    {
                                        shootable.state = State.Touched; // touché !
                                    }
                                    else
                                    {
                                        for (int element2 = 0; element2 < currentBoat.size; element2++)
                                        {
                                            currentBoat.position[element2].state = State.Sunk; // si le bateau est coulé, on change tous ses éléments en "Sunk"
                                        }
                                        shootable.state = State.Sunk;                          // coulé!
                                    }
                                }
                            }
                            opponent.boatList[nboat] = currentBoat;
                        }
                    }
                }
            }
            return(boardOpponent);
        }
Пример #2
0
        public override Board shoot(Player opponent, Board boardOpponent)
        {
            List <int> targetable = new List <int> {
            };                                        // liste des éléments sur lesquels on n'a pas encore tiré

            for (int index = 0; index < boardOpponent.SeaElementList.Count; index++)
            {
                if (boardOpponent.SeaElementList[index].state != State.Plouf && boardOpponent.SeaElementList[index].state != State.Touched && boardOpponent.SeaElementList[index].state != State.Sunk)
                {
                    targetable.Add(index);
                }
            }
            Random     random      = new Random();
            int        targetIndex = targetable[random.Next(targetable.Count)]; // on tire au hasard sur une case encore inconnue
            SeaElement target      = boardOpponent.SeaElementList[targetIndex];

            if (target.button.Name[1] != '1')
            {
                return(null);
            }

            if (target.state == State.Water)
            {
                target.state = State.Plouf;                              // raté !
            }
            else if (target.state == State.Boat)
            {
                for (int nboat = 0; nboat < opponent.boatList.Length; nboat++)
                {
                    Boat currentBoat = opponent.boatList[nboat]; // on recherche le bateau à qui appartient la case que l'on a touchée
                    for (int element = 0; element < currentBoat.size; element++)
                    {
                        if ((target.posX == currentBoat.position[element].posX) && (target.posY == currentBoat.position[element].posY))
                        {
                            int pv = currentBoat.Life();
                            if (pv > 1)
                            {
                                target.state = State.Touched; // touché !
                            }
                            else
                            {
                                for (int element2 = 0; element2 < currentBoat.size; element2++)
                                {
                                    currentBoat.position[element2].state = State.Sunk; // si le bateau est coulé, on change tous ses éléments en "Sunk"
                                }
                                target.state = State.Sunk;                             // coulé !
                            }
                        }
                    }
                }
                boardOpponent.SeaElementList[targetIndex] = target;
            }
            return(boardOpponent);
        }
Пример #3
0
        public int player; // joueur à qui appartient la grille

        // Constructeur
        public Board(int player)
        {
            for (int x = 1; x < 11; x++)
            {
                for (int y = 1; y < 11; y++)
                {
                    SeaElement createdSeaElement = new SeaElement(x, y, player, true);
                    SeaElementList.Add(createdSeaElement);
                }
            }
            this.player = player;
        }
Пример #4
0
 public static void OnClick(SeaElement clicked)
 {
     if (gameState == "place")
     {
         if (J1.place(boardJ1) != null)
         {
             element++;
             if (element == J1.boatList[nBoatsToPlace - 1].size) // si on a fini de placer le bateau
             {
                 element = 0;
                 for (int e = 0; e < J1.boatList[nBoatsToPlace - 1].size; e++)
                 {
                     J1.boatList[nBoatsToPlace - 1].position[e].state = State.Boat;
                 }
                 while (J2.place(boardJ2) == null)
                 {
                 }
                 nBoatsToPlace--;
             }
         }
         if (nBoatsToPlace == 0)
         {
             gameState = "shoot";                    // si on a placé tous les bateaux, que la partie commence !
         }
     }
     else if (gameState == "shoot")
     {
         if (J1.shoot(J2, boardJ2) != null)
         {
             if (checkFinshed()) // on regarde si le joueur 1 a fini la partie
             {
                 gameState = "finished";
                 winner    = J1;
             }
             while (J2.shoot(J1, boardJ1) == null)
             {
             }
             if (checkFinshed()) // on regarde si le joueur 2 a fini la partie
             {
                 gameState = "finished";
                 winner    = J2;
             }
         }
     }
 }
Пример #5
0
        public override Board place(Board board)
        {
            int nboat   = GameManager.getnBoatsToPlace() - 1;
            int element = GameManager.getElement();

            Boat       currentBoat = this.boatList[nboat];                // bateau que l'on place
            SeaElement target      = ButtonBuffer.getPressedSeaElement(); // case où on veut placer le bateau

            if (target == null)
            {
                return(null);
            }
            if (target.button.Name[1] != '1')
            {
                return(null);
            }
            if (target.state != State.Water)
            {
                return(null);
            }

            int[,] listInterdit = new int[10, 10];// liste d'élément incliquables
            for (int ligne = 0; ligne < 10; ligne++)
            {
                for (int colonne = 0; colonne < 10; colonne++)
                {
                    listInterdit[ligne, colonne] = 0;
                }
            }
            for (int ligne = 0; ligne < 10; ligne++)
            {
                for (int colonne = 0; colonne < 10; colonne++)
                {
                    if (board.SeaElementList.ElementAt(ligne * 10 + colonne).state == State.Boat)
                    {
                        listInterdit[ligne, colonne] = 1;
                        //ajout des cases de bord des bateaux dans la liste d'éléments interdits
                        for (int i = 0; i < 3; i++)
                        {
                            for (int j = 0; j < 3; j++)
                            {
                                if ((0 < ligne + i) && (11 > ligne + i) && (0 < colonne + j) && (11 > colonne + j))
                                {
                                    listInterdit[ligne + i - 1, colonne + j - 1] = 1;
                                }
                            }
                        }
                    }
                }
            }

            int x = target.posX - 1;
            int y = target.posY - 1;

            if (listInterdit[x, y] == 1)
            {
                return(null);
            }

            // on compte le nombre de cases valides à droite
            Boolean isValid    = true;
            int     validRight = 0;
            int     checkX     = x + 1;

            while (checkX < 10 && isValid)
            {
                if (listInterdit[checkX, y] == 1)
                {
                    isValid = false;
                }
                else
                {
                    checkX++;
                    validRight++;
                }
            }

            // on compte le nombre de cases valides à gauche
            isValid = true;
            int validLeft = 0;

            checkX = x - 1;
            while (checkX >= 0 && isValid)
            {
                if (listInterdit[checkX, y] == 1)
                {
                    isValid = false;
                }
                else
                {
                    checkX--;
                    validLeft++;
                }
            }

            // on compte le nombre de cases valides en haut
            isValid = true;
            int validUp = 0;
            int checkY  = y - 1;

            while (checkY >= 0 && isValid)
            {
                if (listInterdit[x, checkY] == 1)
                {
                    isValid = false;
                }
                else
                {
                    checkY--;
                    validUp++;
                }
            }

            // on compte le nombre de cases valides en bas
            isValid = true;
            int validDown = 0;

            checkY = y + 1;
            while (checkY < 10 && isValid)
            {
                if (listInterdit[x, checkY] == 1)
                {
                    isValid = false;
                }
                else
                {
                    checkY++;
                    validDown++;
                }
            }

            Boolean validHorizontal = (validLeft + validRight + 1) >= currentBoat.size;
            Boolean validVertical   = (validUp + validDown + 1) >= currentBoat.size;

            // s'il y a assez de place pour placer le bateau, on valide la case cliquée
            if (!validHorizontal && !validVertical)
            {
                return(null);
            }
            ButtonBuffer.setPressedSeaElement(null);
            currentBoat.position[element] = target;
            board.SeaElementList.ElementAt(x * 10 + y).state = State.Sunk;

            if (element == 0)
            {
                // on rend inclicables toutes les cases sauf celles où on peut continuer le placement du bateau
                for (int ligne = 0; ligne < 10; ligne++)
                {
                    for (int colonne = 0; colonne < 10; colonne++)
                    {
                        //rendre tous les élements de non proche en proche non clicable
                        if (listInterdit[colonne, ligne] == 1)
                        {
                            board.SeaElementList.ElementAt(colonne * 10 + ligne).clickable = false;
                        }
                        else if (ligne == y + 1 && colonne == x && validVertical)
                        {
                            board.SeaElementList.ElementAt(colonne * 10 + ligne).clickable = true;
                        }
                        else if (ligne == y - 1 && colonne == x && validVertical)
                        {
                            board.SeaElementList.ElementAt(colonne * 10 + ligne).clickable = true;
                        }
                        else if (ligne == y && colonne == x + 1 && validHorizontal)
                        {
                            board.SeaElementList.ElementAt(colonne * 10 + ligne).clickable = true;
                        }
                        else if (ligne == y && colonne == x - 1 && validHorizontal)
                        {
                            board.SeaElementList.ElementAt(colonne * 10 + ligne).clickable = true;
                        }
                        else if (ligne == y && colonne == x)
                        {
                            board.SeaElementList.ElementAt(colonne * 10 + ligne).clickable = true;
                        }
                        else
                        {
                            board.SeaElementList.ElementAt(colonne * 10 + ligne).clickable = false;
                        }
                    }
                }
            }
            else if (element == currentBoat.size - 1)
            {
                for (int ligne = 1; ligne < 11; ligne++)
                {
                    for (int colonne = 1; colonne < 11; colonne++)
                    {
                        //rendre tous les élements cliquables
                        board.SeaElementList.ElementAt((colonne - 1) * 10 + (ligne - 1)).clickable = true;
                    }
                }
            }
            else
            {
                Boolean Horizontal = true;
                int     x0         = currentBoat.position[0].posX - 1;
                int     y0         = currentBoat.position[0].posY - 1;
                if (x0 == x)
                {
                    Horizontal = false;
                }
                if (Horizontal)
                {
                    //quand on pose le 2nd élement on enlève les case cliquable de l'autre sens
                    if (element == 1)
                    {
                        if (y0 > 0)
                        {
                            board.SeaElementList.ElementAt((x0) * 10 + (y0 - 1)).clickable = false;
                        }
                        if (y0 < 9)
                        {
                            board.SeaElementList.ElementAt((x0) * 10 + (y0 + 1)).clickable = false;
                        }
                    }
                    // après avoir verifié que les prochaines cases existaient et qu'on pouvait y mettre un élément ont les rends cliquables
                    if (x > 0)
                    {
                        if (listInterdit[x - 1, y] != 1)
                        {
                            board.SeaElementList.ElementAt((x - 1) * 10 + y).clickable = true;
                        }
                    }
                    if (x < 9)
                    {
                        if (listInterdit[x + 1, y] != 1)
                        {
                            board.SeaElementList.ElementAt((x + 1) * 10 + y).clickable = true;
                        }
                    }
                }
                else
                {
                    //quand on pose le 2nd élement on enlève les case cliquable de l'autre sens
                    if (element == 1)
                    {
                        if (x0 > 0)
                        {
                            board.SeaElementList.ElementAt((x0 - 1) * 10 + (y0)).clickable = false;
                        }
                        if (x0 < 9)
                        {
                            board.SeaElementList.ElementAt((x0 + 1) * 10 + (y0)).clickable = false;
                        }
                    }
                    // après avoir verifié que les prochaines cases existaient et qu'on pouvait y mettre un élément ont les rends cliquables
                    if (y > 0)
                    {
                        if (listInterdit[x, y - 1] != 1)
                        {
                            board.SeaElementList.ElementAt(x * 10 + (y - 1)).clickable = true;
                        }
                    }
                    if (y < 9)
                    {
                        if (listInterdit[x, y + 1] != 1)
                        {
                            board.SeaElementList.ElementAt(x * 10 + (y + 1)).clickable = true;
                        }
                    }
                }
            }
            this.boatList[nboat] = currentBoat;
            return(board);
        }
Пример #6
0
 public static void setPressedSeaElement(SeaElement value)
 {
     pressedSeaElement = value;
 }