예제 #1
0
파일: Game.cs 프로젝트: llgiant/csharp
    public FireResult Fire(Player player, string coords)
    {
        //        Sea currentPlayerSea = player == _player1 ? _playerOneSea : _playerTwoSea;
        Sea opponentPlayerSea = player == _player1 ? _playerTwoSea : _playerOneSea;


        if (IsFinal)
        {
            return(FireResult.GameFinished);
        }
        if (player.Type == PlayerType.None)
        {
            return(FireResult.NullPlayer);
        }
        if (player.Type == PlayerType.None)
        {
            player.Type = player.Type;
        }
        if (player.Type != player.Type)
        {
            return(FireResult.NotOrderPlayer);
        }

        FireResult playerFireResult = 0;

        if (player.Type == PlayerType.Human)
        {
            playerFireResult = opponentPlayerSea.Fire(coords);
            goto makeReturn;
        }

        int    fireCol   = 0;
        char   fireRow   = ' ';
        Cell   fireCell  = null;
        string rowLetter = "abcdefghij";

        if (_lastWoundShip.WoundCount == null)
        {
            do
            {
                fireRow  = rowLetter[Random.Next(0, 10)];
                fireCol  = Random.Next(0, 10);
                fireCell = opponentPlayerSea.Cells[fireRow + "" + fireCol];
            }while (fireCell.IsDead);

            playerFireResult = opponentPlayerSea.Fire(fireCell);
            if (playerFireResult == FireResult.Killed)
            {
                _lastWoundShip   = null;               //однопалубные корабли
                _lastWoundedCell = null;
            }
            else if (playerFireResult == FireResult.Wound)
            {
                _lastWoundedCell.Add(fireCell);

                if (fireCell.Col - 1 > 0)
                {
                    _fireCells.Add(opponentPlayerSea.Cells[fireCell.Row + "" + (fireCell.Col - 1)]);
                }
                if (fireCell.Row - 1 > 97)
                {
                    _fireCells.Add(opponentPlayerSea.Cells[fireCell.Row - 1 + "" + fireCell.Col]);
                }
                if (fireCell.Col + 1 < 107)
                {
                    _fireCells.Add(opponentPlayerSea.Cells[fireCell.Row + "" + (fireCell.Col + 1)]);
                }
                if (fireCell.Row + 1 < 10)
                {
                    _fireCells.Add(opponentPlayerSea.Cells[fireCell.Row + 1 + "" + fireCell.Col]);
                }
            }
            foreach (Ship ship in opponentPlayerSea.Ships)
            {
                if (!ship.Cells.Contains(fireCell))
                {
                    continue;
                }
                _lastWoundShip = ship;
            }
            goto makeReturn;
        }



        if (_lastWoundShip.WoundCount > 0)
        {
            if (_lastWoundShip.WoundCount == 1)
            {
                fireCell         = _fireCells[Random.Next(0, _fireCells.Count)]; _fireCells.Remove(fireCell);
                playerFireResult = opponentPlayerSea.Fire(fireCell);
                if (playerFireResult == FireResult.Killed)
                {
                    _lastWoundShip   = null;                   //однопалубные корабли
                    _lastWoundedCell = null;
                }
                else if (playerFireResult == FireResult.Wound)
                {
                    _orientation = _lastWoundShip.Orientation;
                    if (_lastWoundShip.Orientation == ShipOrientation.Horizontal)
                    {
                    }
                    if (fireCell._lastWoundedCell[_lastWoundedCell.Count - 1])
                    {
                        _lastWoundedCell.Add(fireCell);
                    }
                }
            }
            else
            {
                if (_lastWoundShip.Orientation == ShipOrientation.Horizontal)
                {
                    fireRow = _lastWoundedCell[_lastWoundedCell.Count - 1].Row;
                    fireCol = Random.Next(0, 2) == 0 ?
                              _lastWoundedCell[0].Col - 1 > 0 ? _lastWoundedCell[0].Col - 1 : _lastWoundedCell[_lastWoundedCell.Count - 1].Col + 1 :
                              _lastWoundedCell[_lastWoundedCell.Count - 1].Col + 1 < 10 ? _lastWoundedCell[_lastWoundedCell.Count - 1].Col + 1 : _lastWoundedCell[0].Col - 1;

                    fireCell = opponentPlayerSea.Cells[fireRow + "" + fireCol];
                }
                else
                {
                    fireCol = _lastWoundedCell[_lastWoundedCell.Count - 1].Col;
                    int rnd = Random.Next(0, 2);

                    if (rnd == 0)
                    {
                        if (_lastWoundedCell[_lastWoundedCell.Count - 1].Row - 1 > 96)
                        {
                            fireRow = (char)(_lastWoundedCell[_lastWoundedCell.Count - 1].Row - 1);
                        }
                        else
                        {
                            fireRow = (char)(_lastWoundedCell[_lastWoundedCell.Count - 1].Row + 1);
                        }
                    }
                    else
                    {
                    }

                    //fireRow = Random.Next(0, 2) == 0 ?
                    //	_lastWoundedCell[_lastWoundedCell.Count - 1].Row - 1 > 96 ? _lastWoundedCell[_lastWoundedCell.Count - 1].Row - 1 : _lastWoundedCell[_lastWoundedCell.Count - 1].Row + 1 :
                    //_lastWoundedCell[_lastWoundedCell.Count - 1].Row + 1 < 107 ? _lastWoundedCell[_lastWoundedCell.Count - 1].Row + 1 : _lastWoundedCell[_lastWoundedCell.Count - 1].Row - 1;

                    fireCell = opponentPlayerSea.Cells[fireRow + "" + fireCol];
                }
            }

            playerFireResult = opponentPlayerSea.Fire(fireCell);
            if (playerFireResult == FireResult.Wound)
            {
                _orientation = _lastWoundShip.Orientation;



                if (_orientation == ShipOrientation.Horizontal)
                {
                    int maxCellCol = 0;
                    foreach (Cell woundedCell in _lastWoundedCell)
                    {
                        if (fireCell.Col > woundedCell.Col)
                        {
                            maxCellCol = fireCell.Col;
                        }
                    }

                    if (fireCell.Col > _lastWoundedCell[_lastWoundedCell.Count - 1].Col)
                    {
                        _lastWoundedCell.Add(fireCell);
                    }
                    else
                    {
                        _lastWoundedCell.Insert(0, fireCell);
                    }
                }
                else
                {
                    if (fireCell.Row > _lastWoundedCell[_lastWoundedCell.Count - 1].Row)
                    {
                        _lastWoundedCell.Add(fireCell);
                    }
                    else
                    {
                        _lastWoundedCell.Insert(0, fireCell);
                    }
                }
            }



            int  prevCol = _lastWoundedCell[_lastWoundedCell.Count - 1].Col;
            char prevRaw = _lastWoundedCell[_lastWoundedCell.Count - 1].Row;
            if (prevCol < fireCell.Col || prevCol > fireCell.Col)
            {
                _orientation = ShipOrientation.Horizontal;
                if (_orientation == ShipOrientation.Horizontal)
                {
                }
            }
            else if (prevRaw < fireCell.Col || prevRaw > fireCell.Col)
            {
                _orientation = ShipOrientation.Horizontal;
            }
        }



makeFire:
        playerFireResult = opponentPlayerSea.Fire(fireCell);



makeReturn:
        if (playerFireResult == FireResult.Miss || playerFireResult == FireResult.Double || playerFireResult == FireResult.Killed || playerFireResult == FireResult.Wound)
        {
            if (_currentPlayer.Type == PlayerType.Human)
            {
                if (playerFireResult == FireResult.Miss || playerFireResult == FireResult.Double)
                {
                    CurrentPlayer = CurrentPlayer == Player1 ? Player2 : Player1;
                }
            }
            else
            {
                if (playerFireResult == FireResult.Killed)
                {
                    _lastWoundShip = null;
                }
                if (playerFireResult == FireResult.Double || playerFireResult == FireResult.Miss)
                {
                    CurrentPlayer = CurrentPlayer == Player1 ? Player2 : Player1;
                }
                if (playerFireResult == FireResult.Wound)
                {
                    _lastWoundedCell.Add(fireCell);
                }
            }


            int killedCount = 0;
            foreach (Ship ship in _playerOneSea.Ships)
            {
                if (ship.State == ShipState.Dead)
                {
                    killedCount++;
                }
            }
            if (killedCount == 10)
            {
                _isFinal = true; _winner = Player2; _loser = Player1; _lastWoundShip = null;
            }
            else
            {
                killedCount = 0;
                foreach (Ship ship in _playerTwoSea.Ships)
                {
                    if (ship.State == ShipState.Dead)
                    {
                        killedCount++;
                    }
                }
                if (killedCount == 10)
                {
                    _isFinal = true; _winner = Player1; _loser = Player2; _lastWoundShip = null;
                }
                else
                {
                    try { _loser.Type = PlayerType.None; }
                    catch (Exception e) { }
                }
            }
        }

        return(playerFireResult);
    }