Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2 3  Все   Вниз
  Печать  
Автор Тема: Рисование на формах  (Прочитано 66135 раз)
0 Пользователей и 15 Гостей смотрят эту тему.
гайка
Гость
« : 13-03-2012 10:04 » new

Тема - игра "морской бой". поле рисуется в ф-ции DrawField(object sender, PainrEventArgs e)  ввиде ста квадратиков.
по нажатию на один из квадратиков создается новый корабль, он должен нарисоваться там, куда мы нажали (ввиде кружочка).
Поле рисуется, кружок нет. Метод рисования корабля вызывается, вполне успешно завершается, но ничего не происходит.
Код: (C#)
    public partial class Form1 : Form
    {      
        const int RectSize = 39;
        const int FieldHeight = 10;
        const int FieldWidht = 10;
        enum FieldLocation { x = 186, y = 29 };
        Field field = new Field(FieldWidht, FieldHeight);
       
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            int x = (int)FieldLocation.x;
            int y = (int)FieldLocation.y;
            int sizeX=(RectSize+1)*FieldWidht;
            int sizeY=(RectSize+1)*FieldHeight;
            if ((e.X > x) && (e.X < x + sizeX) && (e.Y > y) && (e.Y < y + sizeY))
            {
                int i = 0, j = 0;//определяем координаты корабля
                while (i < FieldWidht)
                {
                    x += RectSize + 1;
                    if (e.X < x)
                        break;
                    i++;
                }
                while (j < FieldHeight)
                {
                    y += RectSize + 1;
                    if (e.Y < y)
                        break;
                    j++;
                }
                if (field.AddSubmarine(i, j))
                {
                    this.Paint += new System.Windows.Forms.PaintEventHandler(DrawSubmarine);
                }
            }
        }

        void DrawSubmarine(object sender, PaintEventArgs e)
        {
            SolidBrush greenBr = new SolidBrush(Color.Green);

            for (int i = 0; i < FieldWidht; i++)
            {
                for (int j = 0; j < FieldHeight; j++)
                {
                    if (!field.IsNull(i, j))
                    {
                        int x = (int)FieldLocation.x + i * (RectSize + 1) + (RectSize + 1) / 4;
                        int y = (int)FieldLocation.y + j * (RectSize + 1) + (RectSize + 1) / 4;
                        e.Graphics.FillEllipse(greenBr, x, y, 30, 30);
                    }
                }
            }
        }

        void DrawField(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Pen p = new Pen(Brushes.Black, 1);
            int x = (int)FieldLocation.x;
            int y = (int)FieldLocation.y;

            g.DrawRectangle(p, x - 1, y - 1, (RectSize + 1) * FieldWidht + 1, (RectSize + 1) * FieldHeight + 1);
            for (int i = 0; i < FieldWidht; i++)
            {
                x = (int)FieldLocation.x;
                for (int j = 0; j < FieldHeight; j++)
                {
                    g.DrawRectangle(p, x, y, RectSize, RectSize);
                    x += RectSize + 1;
                }
                y += RectSize + 1;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.Paint += new System.Windows.Forms.PaintEventHandler(DrawField);
        }
    }

координаты высчитываются верно, то есть кружок не уходит за пределы экрана.
может мне надо переопределить метод OnPaint? только как именно?
Записан
arthur_fil
Гость
« Ответ #1 : 13-03-2012 12:17 » 

Тут есть два варианта. Либо подписаться на отрисовку кораблей при загрузке формы и перерисовывать при добавлении корабля:
Код: (C#)

...
if (field.AddSubmarine(i, j))
{
     this.Invalidate();
}
...

private void Form1_Load(object sender, EventArgs e)
{
     this.Paint += new System.Windows.Forms.PaintEventHandler(DrawField);
     this.Paint += new System.Windows.Forms.PaintEventHandler(DrawSubmarine);
}
Либо вызывать код отрисовки вручную:
Код: (C#)
if (field.AddSubmarine(i, j))
{
     DrawSubmarine(this, new PaintEventArgs(this.CreateGraphics(), this.ClientRectangle));
}
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 13-03-2012 16:21 » 

Гайка, Отрисовкой программа занимается по просьбе Windows. Windows же просит программу перерисовать окно, только когда оно портится (изменение размера, загораживание другими окнами, перемещение и т.п.)

В приведённом коде нет механизма, который бы сообщал Windows о том, что изображение окна неактуально и требует перерисовки.

И, как правильно заметил, но не объяснил arthur_fil, в тех местах программы, где происходит изменение данных, влияющих на содержимое окна, нужно у формы вызывать Invalidate() - т.е. портить изображение, чтобы Windows запустила перерисовку.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
гайка
Гость
« Ответ #3 : 13-03-2012 18:08 » 

О, да... после "this.Invalidate();" у меня форма перерисовалась. Раз эдак миллион. Форма почему-то перерисовывается ежесекундно, аж перед глазами мельтешит. А кружочек исчезает так быстро и так ненадолго, что глаз не успевает его заметить Улыбаюсь попробую второй вариант.

УУУУУУУУУУУУиууу!! заработало. я вызвала Invalidate перед вызовом функции рисования корабли, так что зацикливание не происходит.
Спасибо, друзья!!
« Последнее редактирование: 13-03-2012 18:11 от Гайка » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 13-03-2012 18:53 » 

Гайка, если не секрет, откуда идея такой организации отрисовки? Просто интересует момент добавки ф-ций к делегату Paint по клику мыша.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
гайка
Гость
« Ответ #5 : 13-03-2012 19:03 » 

А обязательно каждый раз полностью перерисовывать все элементы формы? Получается не очень красиво: жмешь на кнопку и всё изображение дружно моргает. Есть более эффективный метод рисования? Вот Например второй вариант, предложенный arthur_fil , в этом случае ведь форма лишний раз не будет перерисовывать себя?
Код: (C#)
if (field.AddSubmarine(i, j))
{
     DrawSubmarine(this, new PaintEventArgs(this.CreateGraphics(), this.ClientRectangle));
}

Джон, слизала этот приемчик c msdn - Control.Paint

Добавлено через 9 минут и 7 секунд:
Всё, можете не отвечать. Изучила, поняла.
« Последнее редактирование: 13-03-2012 19:12 от гайка » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 13-03-2012 19:24 » 

Моргание это полбеды.
В примере добавление хэндлера производится только один раз, при загрузке формы. А у тебя каждый раз при клике. Те в конечном итоге, при вызове Paint  у тебя будет вызываться куча ф-ций. Не есть гут. Про моргание вобще приходится молчать.
Правильней в таких случаях отделять данные от ф-ций отображения этих данных. У тебя уже есть "хранилище" всех необходимых данных. Эти данные меняются по клику мыша. После этого даётся установка на необходимость "освежить" окно - Invalidate. А вся отрисовка происходит в OnPaint.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
гайка
Гость
« Ответ #7 : 13-03-2012 19:40 » 

Джон, ты прав. Я уже изменила этот момент. оставила тот приемчик при загрузке, а в ф-цию рисования кораблика передаю новый экземпляр PaintEvenArgs.
Только вот теперь возникла небольшая загвоздка: когда мне нужно наоборот, убрать кораблик, форму придется перерисовать. Ну или другой вариант: закрасить кораблик цветом фона. и получится многослойная аппликация. мне вот что интересно. все эти нарисованные фигуры сохраняются в памяти? или можно просто перетереть один рисунок другим?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 13-03-2012 20:21 » 

Не сохраняются - они просто не существуют. Это аналогично рисованию: нарисованное позже затирает нарисованное ранее. Буфер формы по сути обычный битмап.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
гайка
Гость
« Ответ #9 : 13-03-2012 20:26 » 

RXL, это упрощает задачу в сто раз!
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 13-03-2012 20:35 » 

Хм... В памяти рисунка не остаётся. Рисунок это только моментальное отображение состояния данных в момент вызова ф-ции отрисовки (OnPaint). Поэтому и идея управлять ТОЛЬКО данными. Тогда подобных проблем ваще не возникает:

Примерно так:
Код: (C#)
        private int _fieldSize = 10;
        private List<FieldItem> _field = new List<FieldItem>();

        private void Form1_Load(object sender, EventArgs e)
        {
            for (int i = 0; i < _fieldSize; i++)
                for (int j = 0; j < _fieldSize; j++)
                    _field.Add(new FieldItem { PosX = i, PosY = j, State = FieldState.Normal });
        }

       
        #region Helpers - вспомогательные ф-ции поиска и установки статуса клетки
       
        private void SetFieldState(int posX, int posY, FieldState state)
        {
            var fieldItem = _field.Find(o => (o.PosX == posX) && (o.PosY == posY));
            if (fieldItem != null)
            {
                fieldItem.State = state;
            }
        }

        private FieldState GetFieldState(int posX, int posY)
        {
            var fieldItem = _field.Find(o => (o.PosX == posX) && (o.PosY == posY));
            if (fieldItem != null)
            {
                return fieldItem.State;
            }
            return FieldState.Normal;
        }

        #endregion

        private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            // ф-я GetFieldPosition возвращает позицию клетки в зависимости от размера поля и координат ввода
            // я за то, чтобы позиции были всё-таки 1,2,3 ... тогда графический размер ячейки не имеет значения
            // это задача отображения, их можно делать хоть 56 на 56 ;)
            var pos = GetFieldPosition(e);

            var state = GetFieldState(pos.X, pos.Y);
           
            state = FunctionXYZ(state) ...
            // установка статуса клетки: зависит от режима:

            // ввод: меняем КОРАБЛЬ на ПУСТО и ПУСТО на КОРАБЛЬ

            // игра: если КОРАБЛЬ", то меняем на ПОДБИТЫЙ КОРАБЛЬ, если ПУСТО, то меняем на МИМО

            SetFieldState(pos.X, pos.Y, state);

            this.Invalidate();
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            FieldPainter.Draw(e.Graphics, _field);
        }

вспомогательные классы:

Отрисовщик, только он знает КАК отрисовывать данные:
Код: (C#)
        public class FieldPainter
        {
            public static void Draw(Graphics graphics, List<FieldItem> field)
            {
                field.ForEach(i => DrawItem(graphics, i));
            }

            private static void DrawItem(Graphics graphics, FieldItem item)
            {
                switch(item.State)
                {
                    case FieldState.Normal:
                        ...
                        break;
                    case FieldState.Ship:
                        ...
                        break;
                    case FieldState.ShipX:
                        ...
                        break;
                    case FieldState.Missed:
                        ...
                        break;
                }
            }
       }

контейнер данных для клетки

Код: (C#)
    enum FieldState
    {
        Normal = 0,
        Ship = 1,
        ShipX = 2,
        Missed = 3
    }

    public class FieldItem
    {
        public int PosX { get; set; }
        public int PosY { get; set; }
        public FieldState State { get; set; }

    };
« Последнее редактирование: 13-03-2012 20:37 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
гайка
Гость
« Ответ #11 : 13-03-2012 21:03 » 

Джон, идея с отрисовщиком замечательная. Вот только данные о кораблях лучше хранить немного в другом виде. У меня есть класс Field, в нем несколько дополнительных ф-ций, таких как:
- проверка на правильность ввода корабля (т.е. чтобы он стоял не вплотную, чтобы корабли не были десятипалубными и т.д.)
- отслеживание, сколько еще осталось построить кораблей, чтобы можно было начать игру.
они довольно объемные и в этом классе им самое место.
Ну а данные о занятых позициях можно ввиде двумерного массива bool хранить внутри класа Field

Добавлено через 5 минут и 51 секунду:
А что означает тут символ "=>" ?
Код: (C#)
var fieldItem = _field.Find(o => (o.PosX == posX) && (o.PosY == posY));


Да и как вообще эту строку понять?
« Последнее редактирование: 13-03-2012 21:09 от гайка » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 13-03-2012 21:07 » 

Аааа ну дык, данные можно хранить где угодно и как угодно. Я ж просто про идею "правильной" отрисовки и развязки данных с "рисовальщиком".

1. Инициаллизация данных
2. Изменение данных, как реакция на действия пользователя (события мыши, клавиатуры и тд)
3. Отображение данных по команде винды - OnPaint

2 и 3 ни в коем случае не должны пересекаться или быть зависимыми друг от друга


Добавлено через 5 минут и 6 секунд:
А что означает тут символ "=>" ?

Это лямбда-оператор, а всё вместе запись тн лямбда-выражения.

Те в данном случае это означает, что (не забывай, что у меня _field - это список - List) все элементы списка будут итерироваться (каждый элемент в одной итерации находится в о) до тех пор, пока не будет обнаружен объект удовлетворяющий условию стоящему после лямбда-оператора. В данном случае это равенство позиций по Х и У.

вот тут почитай:
http://msdn.microsoft.com/ru-ru/library/bb397687.aspx

кстати, вот тут ещё:

Код: (C#)
field.ForEach(i => DrawItem(graphics, i));

Здесь просто итерация всех элементов списка с вызовом ф-ции DrawItem для каждого из них
« Последнее редактирование: 13-03-2012 22:53 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
гайка
Гость
« Ответ #13 : 13-03-2012 21:18 » 

Джон, поняла. И за отрисовщика спасибо Улыбаюсь
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #14 : 13-03-2012 21:27 » 

Да не за что. Собственно я только хотел показать, как лего и просто выглядят в подобном решении ф-ции OnMouseClick и OnPaint.

И я, кстати, тоже за то, чтобы подобные структуры данных были самостоятельными объектами со всеми необходимыми ф-ми, о которых ты упомянула, просто ща времени нет для примера что-то такое городить.

зы Да, ещё одна бочка дёгтя в ложке с мёдом. Ага

Код: (C#)
enum FieldLocation { x = 186, y = 29 };

"Расстрелять из крупнокалиберного пулемёта" (с)

Для таких целей есть прекрасный объект Size. enum всё-таки служит для других целей.
« Последнее редактирование: 13-03-2012 22:10 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
гайка
Гость
« Ответ #15 : 13-03-2012 21:37 » 

Джон, если видишь еще косяки - можешь вылить на меня целую цистерну дегтя. Я к вам прихожу именно за критикой Улыбаюсь

Добавлено через 8 минут и 37 секунд:
Почитала.
Size тоже служит для других целей!
« Последнее редактирование: 13-03-2012 21:46 от гайка » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #16 : 13-03-2012 21:53 » 

Size лучше подходит для этих целей, чем enum в любом случае. Ну не нравится Size, используй Point тогда тебе и кастинг (приведение типа) не придётся делать.

Да, собственно говоря, это то, что глаза резануло. А в остальном... У каждого свой стиль. Форматирование кода у тебя хорошее, код "читабельный". У меня просто свои тараканы в голове. Поскольку моя работа проходит в основном в очень интимной (in team) обстановке, мы часто просматриваем и анализируем код. Разбираться в простынях-ф-ях просто нет времени, поэтому у нас действует типа стандарт, что ф-ции должны быть маленькими, если ф-я большая, она должна вызывать кучу других маленьких ф-ций. Скорость чтение и анализа такого кода возрастает в разы. К чему я, собственно, и привык. По этой, чисто эгоистичной причине, мне сразу становится грустно, если вдруг приходится разбираиться в ф-ях которые не помещаются на страницу 27" монитора. Поэтому в твой код детально не вникал.

ps а чем тебе Size не подходит?

зы всё забудь всё что я про Size говорил, я ща сам глянул. Я просто уже с полгода как не сишарплю. Спутал с С++, там просто два поля целого типа. Короче для тебя Point подойдёт.

или вот

Код: (C#)
    public class FieldPosition
    {
        public int X { get; set; }
        public int Y { get; set; }
    }
« Последнее редактирование: 13-03-2012 22:06 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
гайка
Гость
« Ответ #17 : 13-03-2012 22:01 » 

Джон, Size действительно хранит пару чисел, но когда ты захочешь получить к ним доступ, эти числа будут называться не x и y, а widht и height (напомню, мне нужно всего лишь хранить координаты точки), а это может сбить с толку и заставить лишний раз думать. А думать мне и так есть над чем. Короче принцип тот же, что и в твоей интимной работе: "чем понятнее, тем лучше"

Добавлено через 2 минуты и 13 секунд:
Джон, я тебя умоляю... ради этого создавать объект с почти безграничными возможностями... вот, нашла. Point подходит идеально.
« Последнее редактирование: 13-03-2012 22:03 от гайка » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #18 : 13-03-2012 22:05 » 

Ты как-то всё быстро читаешь. Я исправлять не успеваю. Ага

зы всё забудь всё что я про Size говорил, я ща сам глянул. Я просто уже с полгода как не сишарплю. Спутал с С++, там просто два поля целого типа. Короче для тебя Point подойдёт.

Ещё раз сорри. Не со зла я это. Обычно, что в С++ назвается, например, CSize, в С# без первой С. Вот я и решил, что это нормальная Size.
« Последнее редактирование: 13-03-2012 22:09 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
гайка
Гость
« Ответ #19 : 13-03-2012 22:09 » 

Джон, ну я ж не Админ, мне не надо разрываться между 10 темами и сотней жаждущих познаний недопрограммистов:)
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #20 : 13-03-2012 22:13 » 

Не ну я пока разрываюсь только между двумя компами (один с проектом, в другом я на формуе) и ещё жутким желанием пойти покурить. И чего тебе не спится! Ага У нас уже двенадцатый час, а вас... сколько у нас ща разница... 3 часа?

ps и, кстати, на форуме больше никого нет, кроме нас.  Быть такого не может
« Последнее редактирование: 13-03-2012 22:15 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
гайка
Гость
« Ответ #21 : 13-03-2012 22:15 » 

В чат

Добавлено через 1 день, 19 часов, 48 минут и 24 секунды:
Ребята, можно вас попросить протестировать то, что я наваяла?
Самой игры пока нет, только ввод кораблей, но при вводе очень много "подводных камней". Я могла что-нибудь упустить. От вас требуется просто запустить и пощелкать мышкой всяко-разно. Если увидите ошибку - сообщайте.
Ну и любители покопаться в чужом коде - на вашей улице сегодня праздник  Отлично

* SeaWar.rar (58.03 Кб - загружено 953 раз.)
« Последнее редактирование: 15-03-2012 18:03 от гайка » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #22 : 15-03-2012 18:15 » 

Однопалубных дает поставить только два. Это если сперва расставить все остальные.

А вот если начать с однопалубных, то мне дало поставить 5!

UPD: нет, это на 5 единичек - это 4 + начало другого корабля. НО! После установки 3-х единичек программа перестает позволять ставить другие. большие корабли. Это обходится так: ставим A1, A3, A2 (шахматные координаты).

Думаю, проблема в алгоритме определения кораблей. Я бы дал ставить готовые блоки, а не "попиксельно". Это и логичнее, и нагляднее.
« Последнее редактирование: 15-03-2012 18:20 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
гайка
Гость
« Ответ #23 : 15-03-2012 18:20 » 

RXL, если начинать с меньших, он дает строить на 1 корабль больше намеренно. просто иначе, если ты построишь 4 1-палубных, то больше ты ничего не сможешь построить.
а вот первую ошибку я вызвать не могу... если начинать с больших, у меня всё правильно строится
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #24 : 15-03-2012 18:22 » 

Я ставил строго в порядке уменьшения: четверку, трешки, двушки. Потом после второй единички установка прекратилась.

Поставил четыре двушки Улыбаюсь


* seabattle-bug1.png (2.66 Кб - загружено 2701 раз.)
« Последнее редактирование: 15-03-2012 18:25 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
гайка
Гость
« Ответ #25 : 15-03-2012 18:24 » 

эй, так у тебя 4 двухпалубных! понятное дело, пока не исправишь их, нельзя строить другие.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #26 : 15-03-2012 18:26 » 

НО! После установки 3-х единичек программа перестает позволять ставить другие. большие корабли. Это обходится так: ставим A1, A3, A2
Эмм... то есть ты поставил А1 А2  А3 и дальше никак? блин, у меня всё строится, хоть ты трести

Нет-нет.
1. Я поставил три однопалубных корабля.
2. Пытаюсь поставить 3-палубный. Жму: А1 (есть), А2 (не дает), А3 (есть), А2 (есть)...


Посмотри мои посты выше - я обновлял их.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #27 : 15-03-2012 18:28 » 

Попробуй все же установку готовых кораблей - это для пользователя будет быстрее и удобнее.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
гайка
Гость
« Ответ #28 : 15-03-2012 18:31 » 

1. Я поставил три однопалубных корабля.
2. Пытаюсь поставить 3-палубный. Жму: А1 (есть), А2 (не дает), А3 (есть), А2 (есть)...
куда ты поставил однопалубные? Я попробовала, у меня как всегда всё в порядке.

Добавлено через 1 минуту и 51 секунду:
Попробуй все же установку готовых кораблей - это для пользователя будет быстрее и удобнее.
Нууу... я этот вариант рассматривала и решила, что так было бы неинтересно Улыбаюсь Алгоритм был бы совсем уж простым Улыбаюсь это игра - моё задание по ООП.
« Последнее редактирование: 15-03-2012 18:32 от гайка » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #29 : 15-03-2012 18:33 » 

Хм. Повторить не удалось. Но эффект был стойкий. Думаю есть бага, связанная с инициализацией переменных по кнопке сброса.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1] 2 3  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines