예제 #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 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);
        }