예제 #1
0
        public bool ПоставитьСлучайно(int номер)
        {
            int длина = длина_кораблей[номер];

            Program.Точка нос;
            Program.Точка шаг;
            if (rand.Next(2) == 0)
            {
                нос = new Program.Точка(rand.Next(0, азмер_моря.x - длина + 1), rand.Next(0, азмер_моря.y));
                шаг = new Program.Точка(1, 0);
            }
            else
            {
                нос = new Program.Точка(rand.Next(0, азмер_моря.x), rand.Next(0, азмер_моря.y - длина + 1));
                шаг = new Program.Точка(0, 1);
            }
            Program.Точка[] палуба = new Program.Точка[длина];
            for (int j = 0; j < длина; j++)
            {
                палуба[j] = new Program.Точка(нос.x + j * шаг.x, нос.y + j * шаг.y);
                ОчиститьОбласть(палуба[j]);
            }
            ПоставитьКорабль(номер, палуба);

            return(true);
        }
예제 #2
0
파일: Mission.cs 프로젝트: galich2/bs
        public Program.Статус Fight(out Program.Точка target)
        {
            if (modeDanger)
            {
                target = FightDanger();
            }
            else
            {
                target = FightShapes();
            }
            Program.Статус status = sea.Выстрел(target);
            switch (status)
            {
            case Program.Статус.Мимо: map[target.x, target.y] = 1; break;

            case Program.Статус.анил: map[target.x, target.y] = 2; modeDanger = true; break;

            case Program.Статус.Убил:
            case Program.Статус.Победил:
                map[target.x, target.y] = 2;
                int len = MarkKilledShip(target);
                shipLenght[len]--;
                modeDanger = false;
                break;
            }
            return(status);
        }
예제 #3
0
파일: Mission.cs 프로젝트: galich2/bs
        private void CheckShipDirection(Program.Точка ship, int sx, int sy, int lenght)
        {
            if (Map(ship.x, ship.y) != 2)
            {
                return;
            }
            if (Map(ship.x - sx, ship.y - sy) == 2)
            {
                return;
            }
            if (sx == 0)
            {
                if (Map(ship.x - 1, ship.y) == 2)
                {
                    return;
                }
                if (Map(ship.x + 1, ship.y) == 2)
                {
                    return;
                }
            }
            if (sy == 0)
            {
                if (Map(ship.x, ship.y - 1) == 2)
                {
                    return;
                }
                if (Map(ship.x, ship.y + 1) == 2)
                {
                    return;
                }
            }
            int unknown   = 0;
            int unknown_j = 0;

            for (int j = 1; j < lenght; j++)
            {
                int p = Map(ship.x + j * sx, ship.y + j * sy);
                if (p == 1)
                {
                    return;
                }
                if (p == -1)
                {
                    return;
                }
                if (p == 0)
                {
                    unknown++;
                    if (unknown == 1)
                    {
                        unknown_j = j;
                    }
                }
            }
            if (unknown >= 1)
            {
                put[ship.x + unknown_j * sx, ship.y + unknown_j * sy]++;
            }
        }
예제 #4
0
파일: Mission.cs 프로젝트: galich2/bs
        private int MarkKilledShip(Program.Точка place)
        {
            if (!sea.НаМоре(place))
            {
                return(0);
            }
            if (map[place.x, place.y] == 2)
            {
                map[place.x, place.y] = 3;
                int x, y;
                for (x = place.x - 1; x <= place.x + 1; x++)
                {
                    for (y = place.y - 1; y <= place.y + 1; y++)
                    {
                        if (Map(x, y) == 0)
                        {
                            map[x, y] = 1;
                        }
                    }
                }
                int lenght = 1;
                lenght += MarkKilledShip(new Program.Точка(place.x - 1, place.y));
                lenght += MarkKilledShip(new Program.Точка(place.x + 1, place.y));
                lenght += MarkKilledShip(new Program.Точка(place.x, place.y - 1));
                lenght += MarkKilledShip(new Program.Точка(place.x, place.y + 1));
                return(lenght);
            }

            return(0);
        }
예제 #5
0
파일: Mission.cs 프로젝트: galich2/bs
 private Program.Точка FightDanger()
 {
     InitPut();
     for (int x = 0; x < Море.азмер_моря.x; x++)
     {
         for (int y = 0; y < Море.азмер_моря.y; y++)
         {
             if (map[x, y] == 2)
             {
                 bool          longer = false;
                 Program.Точка ship   = new Program.Точка(x, y);
                 for (int lenght = shipLenght.Length - 1; lenght >= 2; lenght--)
                 {
                     if (longer || shipLenght[lenght] > 0)
                     {
                         CheckShipDirection(ship, -1, 0, lenght);
                         CheckShipDirection(ship, 1, 0, lenght);
                         CheckShipDirection(ship, 0, -1, lenght);
                         CheckShipDirection(ship, 0, 1, lenght);
                         longer = true;
                     }
                 }
             }
         }
     }
     return(RandomPut());
 }
예제 #6
0
 private void ShowCompShip(Program.Точка place, int nr)
 {
     if (mode == Mode.EditShips)
     {
         GridComp.ShowShip(place, nr);
     }
 }
예제 #7
0
 public int КартаКораблей(Program.Точка t)
 {
     if (НаМоре(t))
     {
         return(Карта_кораблей[t.x, t.y]);
     }
     return(-1);
 }
예제 #8
0
파일: SeaGrid.cs 프로젝트: galich2/bs
 public void ShowShip(Program.Точка place, int nr)
 {
     if (nr < 0)
     {
         grid[place.x, place.y].Style.BackColor = color_back;
     }
     else
     {
         grid[place.x, place.y].Style.BackColor = color_ship[nr];
     }
 }
예제 #9
0
 protected void ОчиститьОбласть(Program.Точка t)
 {
     Program.Точка p;
     for (p.x = t.x - 1; p.x <= t.x + 1; p.x++)
     {
         for (p.y = t.y - 1; p.y <= t.y + 1; p.y++)
         {
             ОчиститьТочку(p);
         }
     }
 }
예제 #10
0
 public void ОчиститьТочку(Program.Точка t)
 {
     if (!НаМоре(t))
     {
         return;
     }
     if (Карта_кораблей[t.x, t.y] == -1)
     {
         return;
     }
     УбратьКорабль(Карта_кораблей[t.x, t.y]);
 }
예제 #11
0
파일: SeaGrid.cs 프로젝트: galich2/bs
        public Program.Точка[] GetSelectedCells()
        {
            if (grid.SelectedCells.Count == 0)
            {
                return(null);
            }
            Program.Точка[] ship = new Program.Точка[grid.SelectedCells.Count];
            int             j    = 0;

            foreach (DataGridViewCell cell in grid.SelectedCells)
            {
                ship[j++] = new Program.Точка(cell.ColumnIndex, cell.RowIndex);
            }
            grid.ClearSelection();
            return(ship);
        }
예제 #12
0
        public bool ПоставитьПоТочкам(Program.Точка[] палуба)
        {
            int длина = палуба.Length;
            int номер = НайтиНомер(длина);

            if (номер < 0)
            {
                return(false);
            }
            Program.Точка лв = палуба[0];
            Program.Точка пн = палуба[0];
            for (int j = 0; j < длина; j++)
            {
                лв.x = Math.Min(лв.x, палуба[j].x);
                лв.y = Math.Min(лв.y, палуба[j].y);
                пн.x = Math.Max(пн.x, палуба[j].x);
                пн.y = Math.Max(пн.y, палуба[j].y);
            }
            if (лв.x == пн.x)
            {
                if (пн.y - лв.y + 1 != длина)
                {
                    return(false);
                }
            }
            else
            if (лв.y == пн.y)
            {
                if (пн.x - лв.x + 1 != длина)
                {
                    return(false);
                }
            }
            else
            {
                return(false);
            }
            for (int j = 0; j < длина; j++)
            {
                ОчиститьОбласть(палуба[j]);
            }
            ПоставитьКорабль(номер, палуба);
            return(true);
        }
예제 #13
0
파일: SeaGrid.cs 프로젝트: galich2/bs
 public void ShowFight(Program.Точка place, Program.Статус status)
 {
     grid[place.x, place.y].Style.BackColor = color_fight[(int)status];
 }
예제 #14
0
 private void ShowCompFight(Program.Точка place, Program.Статус status)
 {
     GridComp.ShowFight(place, status);
 }
예제 #15
0
 private void ShowUserFight(Program.Точка place, Program.Статус status)
 {
     GridUser.ShowFight(place, status);
 }
예제 #16
0
 private void ShowUserShip(Program.Точка place, int nr)
 {
     GridUser.ShowShip(place, nr);
 }