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

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

Тема - игра "морской бой". поле рисуется в ф-ции 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
Интересующийся

ru
Offline Offline

« Ответ #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
Технический
Администратор

ru
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 Кб - загружено 632 раз.)
« Последнее редактирование: 15-03-2012 18:03 от гайка » Записан
RXL
Технический
Администратор

ru
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
Технический
Администратор

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

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

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

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


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

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

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

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

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

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

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


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

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

ru
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
Технический
Администратор

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

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

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

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

RXL, ну ладно. Спасибо и на этом. Неизвестная ошибка - тоже ошибка!
Записан
RXL
Технический
Администратор

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

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

Мне три раза удалось повторить этот эффект, но после перезапуска программы повторить больше не получилось.
Записан

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

RXL, по шахматным координатам А1 - это ведь в левом нижнем углу?
Записан
RXL
Технический
Администратор

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

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

Не важно. Я выразился в таких координатах, чтобы показать отношения позиций. Т.е. рассматривай это как относительные координаты.
Записан

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

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

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

WWW
« Ответ #35 : 15-03-2012 20:20 » 

Не отчаивайся. Напишешь новую...  Ага
Записан

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

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

« Ответ #36 : 15-03-2012 21:09 » 

Чёт не то:

* ss1.gif (14.73 Кб - загружено 964 раз.)
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
гайка
Гость
« Ответ #37 : 16-03-2012 19:46 » 

Джон, обещала тебе переделанный код показать. сделала набросок:

Код: (C#)
    enum CellState { Empty, Ship, Wounded, Missed };

    class Cell
    {
        public int X { get; private set; }
        public int Y { get; private set; }
        public CellState State { get; private set; }

        public Cell(int x, int y)
        {
            X = x;
            Y = y;
            State = CellState.Empty;
        }

        public void ChangeState(CellState newState)
        {
            State = newState;
        }
    }
Код: (C#)
    enum SubmarineState { Normal, Wounded, Killed };
   
    class Submarine
    {
        public List<Cell> Cells { get; private set; }
        public SubmarineState State { get; private set; }

        public Submarine(List<Cell> cellList)
        {
            Cells = cellList;
            foreach (Cell c in Cells)
                c.ChangeState(CellState.Ship);
            State = SubmarineState.Normal;
        }

        public void ChangeState(SubmarineState newState)
        {
            State = newState;
        }

        public void ChangeCells(List<Cell> cellList)
        {
            foreach (Cell c in Cells)
                c.ChangeState(CellState.Empty);
            Cells = cellList;
            foreach (Cell c in Cells)
                c.ChangeState(CellState.Ship);
        }
    }
Код: (C#)
    class Field
    {
        public List<Cell> Cells { get; private set; }
        public List<Submarine> Subs { get; private set; }
        public int FieldSize { get; private set; }
       

        public Field(int size)
        {
            Cells = new List<Cell>();
            FieldSize=size;
            for (int i = 0; i < FieldSize; i++)
                for (int j = 0; j < FieldSize; j++)
                    Cells.Add(new Cell(i, j));
            Subs = new List<Submarine>();
        }

        public void AddSubmarine(List<Point> points)
        {
            List<Cell> list =new List<Cell>();
            foreach(Point p in points)
                list.Add(Cells[p.X+p.Y*10]);
            Submarine sub=new Submarine(list);
            Subs.Add(sub);
        }
    }
Код: (C#)
    class Painter
    {
        public static void Draw(Graphics g, Field field, Point locatoin, int rectSize)
        {
            int x = locatoin.X;
            int y = locatoin.Y;
            int size = rectSize * field.FieldSize;

            g.DrawRectangle(Pens.Black, x, y, size, size);
            foreach (Cell c in field.Cells)
                DrawCell(g, c, locatoin ,rectSize);
        }

        static void DrawCell(Graphics g, Cell c, Point location, int size)
        {
            int x = location.X + size * c.X;
            int y = location.Y + size * c.Y;

            g.DrawRectangle(Pens.Black, x, y, size, size);
            switch (c.State)
            {
                case CellState.Empty:                  
                    g.FillRectangle(SystemBrushes.Control, x + 1, y + 1, size - 1, size - 1);
                    break;
                case CellState.Ship:
                    g.FillRectangle(Brushes.Green, x + 1, y + 1, size - 1, size - 1);
                    break;
                case CellState.Wounded:
                    g.FillRectangle(Brushes.Red, x + 1, y + 1, size - 1, size - 1);
                    break;
                case CellState.Missed:
                    g.FillEllipse(Brushes.White, x + size / 4, y + size / 4, size / 4, size / 4);
                    break;
            }
        }
    }
Код: (C#)
    class SeaWar//пока не дописан
    {
        Field field1;
        Field field2;

        public SeaWar()
        {
            field1 = new Field(10);
            field2 = new Field(10);
        }
    }
Код: (C#)
    public partial class Form1 : Form
    {
        SeaWar seaWar;
       
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            seaWar = new SeaWar();
        }
    }

Добавлено через 3 минуты и 41 секунду:
теперь надо откуда-то вызывать отрисовщика. вот только хрен знает откуда
« Последнее редактирование: 16-03-2012 19:50 от гайка » Записан
Джон
просто
Администратор

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

« Ответ #38 : 16-03-2012 19:53 » 

Ща подожди.

1. ChangeState(CellState newState) выбрасывай, она не нужна, у тебя уже есть public State только убери private от set

Добавлено через 22 секунды:
а есть у тебя этот код в файле каком-нить?
« Последнее редактирование: 16-03-2012 19:54 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
гайка
Гость
« Ответ #39 : 16-03-2012 19:55 » 

конечно.

Добавлено через 1 минуту и 14 секунд:
1. ChangeState(CellState newState) выбрасывай, она не нужна, у тебя уже есть public State только убери private от set
думала, так нежелательно делать

* Sea_war.rar (24.37 Кб - загружено 451 раз.)
« Последнее редактирование: 16-03-2012 19:56 от гайка » Записан
Джон
просто
Администратор

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

« Ответ #40 : 16-03-2012 20:04 » 

Не всё, стоп. Отставить. Ты просто переформатировала немного код. А по сути всё те же ф-ции упакованные в классы. Просто их больше стало.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
гайка
Гость
« Ответ #41 : 16-03-2012 20:06 » 

Джон, вот теперь я окончательно перестала понимать, что от меня требуется!

Добавлено через 13 дней, 48 минут и 45 секунд:
Код: (C#)
    class Field
    {
        public List<Cell> Cells { get; private set; }
        public List<Ship> Ships { get; private set; }

        public Field()
        {
            Cells = new List<Cell>();
            Ships = new List<Ship>();
        }

        public void AddShip(List<Point> points_)
        {
            List<Cell> list_ = new List<Cell>();
            foreach (Point p in points_)
            {
                list_.Add(Cells.Find(o => (o.X == p.X) && (o.Y == p.Y)));
            }
            switch (list_.Count)
            {
                case 1:
                    OneDeck ship1_ = new OneDeck(list_[0]);
                    Ships.Add(ship1_);
                    break;
                case 2:
                    TwoDeck ship2_ = new TwoDeck(list_);
                    Ships.Add(ship2_);
                    break;
                case 3:
                    ThreeDeck ship3_ = new ThreeDeck(list_);
                    Ships.Add(ship3_);
                    break;
                case 4:
                    FourDeck ship4_ = new FourDeck(list_);
                    Ships.Add(ship4_);
                    break;
            }
        }

        public void Draw()
        {
            foreach (Cell c in Cells)
                c.Draw();
        }
    }

Код: (C#)
    enum ShipState { normal, wounded, killed }
    abstract class Ship
    {
        public ShipState State;

        public abstract void Draw();
    }

Код: (C#)
    class OneDeck: Ship
    {
        public Cell CEll { get; private set; }
       
        public OneDeck(Cell cell_)
        {
            CEll = cell_;
        }

        public override void Draw()
        {

        }
    }

Код: (C#)
    class TwoDeck:Ship
    {
        public List<Cell> Cells { get; private set; }

        public TwoDeck(List<Cell> cells_)
        {
            Cells = cells_;
        }
       
        public override void Draw()
        {
           
        }
    }
аналогично class ThreeDeck: Ship и class FourDeck: Ship

Код: (C#)
    enum CellState { fill, free, wounded, missed }
   
    class Cell
    {
        public int X { get; private set; }
        public int Y { get; private set; }
        public CellState State { get; private set; }

        public void Draw()
        {

        }
    }
« Последнее редактирование: 29-03-2012 20:54 от гайка » Записан
Джон
просто
Администратор

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

« Ответ #42 : 29-03-2012 21:10 » 

Ф-я AddShip должна добалять корабль, а не список точек. У тебя есть объект Ship, он должен передаваться в ф-ю. А инече эта ф-я  делает не то, на что указывает её имя. Она ещё что-то ищет... А почему?

2. Чем у тебя классы OneDeck, TwoDeck отличаются? Тем что у первого просто Cell, а у остальных List<Cell>? А если в списке только одна ячейка? Можно же так сделать, тогда List<Cell> можно поместить в базовый класс.
« Последнее редактирование: 29-03-2012 21:21 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
гайка
Гость
« Ответ #43 : 01-04-2012 11:28 » 

2. Чем у тебя классы OneDeck, TwoDeck отличаются? Тем что у первого просто Cell, а у остальных List<Cell>? А если в списке только одна ячейка? Можно же так сделать, тогда List<Cell> можно поместить в базовый класс.
1) они будут отличаться отрисовкой
2) что-то кардинально изменится от этого?

Добавлено через 4 часа, 5 минут и 14 секунд:
В общем, у меня выходит так: я перемещаю список ячеек в базовый класс и все корабли становятся по сути одинаковыми (т.к. в ф-ции Draw они все делают одно и то же: перебирают все ячейки из своего списка и для каждой ячейки вызывают метод Draw)
В итоге, я могу просто удалить все корабли кроме базового и переместить весь функционал в него. Прощай полиморфизм, до встречи, наследование. Фак.
« Последнее редактирование: 01-04-2012 15:33 от гайка » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #44 : 01-04-2012 15:33 » 

Собственно я бы не разбивал бы на 4 класса разновидности кораблей. Это все одна сушность. А если скажем бужет 5 палубный корабль, это добавлять еше 1 класс?

PS. На кораблях полиморфизм как бы не нужен. У них одно и тоже поведение и сушность.
« Последнее редактирование: 01-04-2012 15:35 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
гайка
Гость
« Ответ #45 : 01-04-2012 18:46 » 

это была Женина идея, она вроде бы действительно логично звучала: изначально рассчитывалось, что они будут иметь разные методы отрисовки, но когда дошло до практики, оказалось, что все они, заразо, одинаковые.
Кстати в той монстро-функции свич выглядит немного не так как должен: можно было создать одну переменную типа Ship и в зависимости от количества клеток инициализировать ее как объект n-палубного корабля. ну да ладно, уже не важно....
Пожалуй, я не буду прикручивать сюда то, что никак не лепится. у меня уже созрел новый коварный план  :Улыбаюсь
« Последнее редактирование: 01-04-2012 19:19 от Гайка » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #46 : 01-04-2012 19:07 » 

 С ума сойти... Коварная ты наша Улыбаюсь
« Последнее редактирование: 01-04-2012 19:17 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
гайка
Гость
« Ответ #47 : 01-04-2012 21:21 » 

У меня есть класс Game, его экземпляр хранит в себе очередь из игроков.
Экземпляр Player хранит интовое количество баллов и игровое поле.
Field хранит список кораблей и список ячеек.
Каждый корабль также имеет список ячеек и показатель состояния корабля (нормальный, подстреленный убитый).
Ячейка, последняя в этой пищевой цепочке, хранит 2 координаты и индикатор состояния (пустая, заполненная, подстреленная и missed - мимо).
еще есть класс-отрисовщик Painter, который пока не умеет рисовать.
Так вот... в чем соль. когда я перетаскиваю мышкой корабль в поле, к кому из них мне в первую очередь обращаться?
нужно:
1) переконвертировать координаты мышки в обычные координаты ячейки (какой класс по логике должен этим заниматься?)
2) послать эти координаты куда-то (видимо в класс Game, а там сказать, что в поле текущего игрока поступил новый корабль)

Добавлено через 2 минуты и 35 секунд:
Finch, у нас есть 20 минут на решение этой задачи. я знаю, что ты здесь :Улыбаюсь
« Последнее редактирование: 01-04-2012 21:24 от гайка » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #48 : 01-04-2012 21:36 » 

Field по идее говоря должно хранить только состояние поля Улыбаюсь Т.е. матрица ячеек.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
гайка
Гость
« Ответ #49 : 01-04-2012 21:37 » 

ну а кто тогда будет хранить корабли?

Добавлено через 42 секунды:
ну список ячеек у меня это и есть матрица
« Последнее редактирование: 01-04-2012 21:38 от гайка » Записан
Dimka
Деятель
Команда клуба

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

« Ответ #50 : 02-04-2012 06:00 » 

В рамках MVC можно представить клетку 2-3 классами. Один - собственно клетка с её логическими координатами и состоянием (модель). Другой (или два) - отображение клетки на экране (с экранными координатами), отрисовкой (представление) и обработкой событий мыши в соответствующей экранной области (контроллер).

Активизированная мышью "текущая" клетка может уведомлять об этом Field, а Field будет предоставлять пользователям "текущую" клетку и событие её замены на другую клетку. Эту инфраструктуру можно нагружать разной логикой. В частности размещение корабля: при смене текущей клетки пересобрать список клеток корабля. После этого отрисовка перемещённого корабля произойдёт сама собой.
Записан

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

нет, Дим, структуру я переделывать не буду. Советов много, а руки у меня 2 всего. и после каждого совета начинать всё заново не хочется. нужно что-нибудь придумать из уже сложившейся ситуации

Добавлено через 6 минут и 38 секунд:
Ладно ребят, я почитала все ваши рекомендации (все что тут и все, что в чате) и решила, что больше вас мучить морским боем не буду. Иначе дружной семьей мы будем делать его вечно Улыбаюсь всегда найдется тот, кому что-то не понравится.
« Последнее редактирование: 02-04-2012 17:03 от гайка » Записан
RXL
Технический
Администратор

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

WWW
« Ответ #52 : 02-04-2012 17:11 » 

Гайка, сделай так, как понравится тебе! Улыбаюсь
Записан

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

Меня Джон вызвался проверять Улыбаюсь так что надо так, чтоб еще понравилось ему Отлично

Добавлено через 1 минуту и 38 секунд:
Блинский, курсовой проект по ООП, а концепции ООП продемонстрировать не получается!
« Последнее редактирование: 02-04-2012 17:19 от гайка » Записан
RXL
Технический
Администратор

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

WWW
« Ответ #54 : 02-04-2012 19:39 » 

Ну почему же? С кораблями ООП вписать вполне можно. К примеру, базовый класс корабля задает интерфейс и основные алгоритмы, а дочерние классы реализуют детали, характерные для корабля конкретной конфигурации. Так можно, имея общую логику, создавать корабли хоть буквой зю.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
гайка
Гость
« Ответ #55 : 02-04-2012 19:42 » 

ты когда-нибудь играл в морской бой? Улыбаюсь там по правилам только прямые корабли. а вариант с базовым классом кораблей и дочерними n-палубниками я уже проехала, вон там чуть ниже всё написано, обсужно, отшлепано и выгнано Улыбаюсь
Записан
Dimka
Деятель
Команда клуба

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

« Ответ #56 : 02-04-2012 19:43 » 

Цитата: Гайка
а концепции ООП продемонстрировать не получается
Это которые?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

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

WWW
« Ответ #57 : 02-04-2012 19:45 » 

Гайка, где написано, что морской бой имеет только одну форму и никак не может быть изменен? Улыбаюсь
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
гайка
Гость
« Ответ #58 : 02-04-2012 19:47 » 

вот тут  Что, съел?
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #59 : 02-04-2012 19:50 » 

варианты игры
Цитата
Размер поля можно увеличить — например, размер 16×16 или 18×18 позволяет с удобством использовать весь размер одинарного тетрадного листа. В этом случае количество фигур можно увеличить — например, как предлагал Я. И. Перельман, добавить изогнутые четырёхклеточные фигуры (по одной штуке каждого из четырёх вариантов изогнутости: квадрат 2×2, Г-образная, Т-образная и четвёртый вариант изогнутости). Тогда, в связи с увеличением численности армий и размера поля, можно увеличить количество мин (например, до трёх) и добавить в игру минный тральщик (скажем, один у каждого игрока). Минный тральщик обозначается равнобедренным треугольничком, вписанным в одну клетку, так, что основание равнобедренного треугольника совпадает с нижней стороной клетки, а противоположная основанию вершина лежит на верхней стороне клетки, деля верхнюю сторону пополам.

Фантазия не имеет границ.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
гайка
Гость
« Ответ #60 : 02-04-2012 19:57 » 

ну не хочу я другой морской бой!!!  Не надо я уже этот начала и хочу его доделать. я уже 4-й раз его переделываю!! ХВАТИТ!!!  Для глухих
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #61 : 02-04-2012 19:58 » 

А ты не торопись писать. Меньше будет переделывать.
Записан

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

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

Добавлено через 58 секунд:
К тому же я вишу в списке на отчисление. мне нельзя медлить  Жаль
« Последнее редактирование: 02-04-2012 20:02 от гайка » Записан
Джон
просто
Администратор

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

« Ответ #63 : 02-04-2012 21:19 » 

Дык "не торопись писать" и "медленно писать" это ж абсолютно разные вещи.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Dimka
Деятель
Команда клуба

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

« Ответ #64 : 03-04-2012 06:10 » 

"Лучше меньше, да лучше" (с) В.И. Ленин
Записан

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

Да, кстати вот еще. метод Drag&Drop. когда его реализовываешь,  нужно прописывать много событий, в каждом по 5-10 строк примерно. класс формы в итоге выглядит довольно... засранно Улыбаюсь может быть будет правильнее заставить отрисовщика этим заниматься?
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #66 : 03-04-2012 07:38 » 

Возможно.
Визуализацию надо отделять от логики. Как ранее тут уже писали - MVC.
Записан

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

Dimka, не заметила твое сообщение.
Цитата: Гайка
а концепции ООП продемонстрировать не получается
Это которые?
ну не будет наследования, и как следствие не будет полиморфизма. останется только инкапсуляция.
Записан
Dimka
Деятель
Команда клуба

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

« Ответ #68 : 03-04-2012 08:10 » 

Гайка, а в ООП главное как раз инкапсуляция. Всё остальное - особенности и костыли конкретного языка. Улыбаюсь

Наследование и полиморфизм у тебя и так есть, как минимум ты форму унаследовала из framework Ага
Записан

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

это не я, это "Код, автоматически созданный конструктором форм Windows" Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #70 : 04-04-2012 16:14 » 

Гайка, мож сначала упрощённую версию реализовать )


* 655281_rechnoj-boj[1].jpg (22.2 Кб - загружено 1004 раз.)
Записан

гайка
Гость
« Ответ #71 : 06-04-2012 13:21 » 

"Грешно смеяться над больными людьми" (с) к/ф "Кавказская пленница" Ага
Записан
Джон
просто
Администратор

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

« Ответ #72 : 06-04-2012 14:15 » 

Лёшик, ты бы ещё лужный бой предложил: размер поля 1х1. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #73 : 06-04-2012 15:15 » 

Гайка, я не смеюсь, как я могу!
Записан

Страниц: 1 2 3 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines