гайка
Гость
|
|
« : 13-03-2012 10:04 » |
|
Тема - игра "морской бой". поле рисуется в ф-ции DrawField(object sender, PainrEventArgs e) ввиде ста квадратиков. по нажатию на один из квадратиков создается новый корабль, он должен нарисоваться там, куда мы нажали (ввиде кружочка). Поле рисуется, кружок нет. Метод рисования корабля вызывается, вполне успешно завершается, но ничего не происходит. 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 » |
|
Тут есть два варианта. Либо подписаться на отрисовку кораблей при загрузке формы и перерисовывать при добавлении корабля: ... 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); }
Либо вызывать код отрисовки вручную: if (field.AddSubmarine(i, j)) { DrawSubmarine(this, new PaintEventArgs(this.CreateGraphics(), this.ClientRectangle)); }
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
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 от Гайка »
|
Записан
|
|
|
|
Джон
просто
Администратор
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 , в этом случае ведь форма лишний раз не будет перерисовывать себя? if (field.AddSubmarine(i, j)) { DrawSubmarine(this, new PaintEventArgs(this.CreateGraphics(), this.ClientRectangle)); } Джон, слизала этот приемчик c msdn - Control.PaintДобавлено через 9 минут и 7 секунд:Всё, можете не отвечать. Изучила, поняла.
|
|
« Последнее редактирование: 13-03-2012 19:12 от гайка »
|
Записан
|
|
|
|
Джон
просто
Администратор
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
|
|
« Ответ #8 : 13-03-2012 20:21 » |
|
Не сохраняются - они просто не существуют. Это аналогично рисованию: нарисованное позже затирает нарисованное ранее. Буфер формы по сути обычный битмап.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
гайка
Гость
|
|
« Ответ #9 : 13-03-2012 20:26 » |
|
RXL, это упрощает задачу в сто раз!
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #10 : 13-03-2012 20:35 » |
|
Хм... В памяти рисунка не остаётся. Рисунок это только моментальное отображение состояния данных в момент вызова ф-ции отрисовки (OnPaint). Поэтому и идея управлять ТОЛЬКО данными. Тогда подобных проблем ваще не возникает: Примерно так: 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); } вспомогательные классы: Отрисовщик, только он знает КАК отрисовывать данные: 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; } } } контейнер данных для клетки 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 секунду:А что означает тут символ "=>" ? var fieldItem = _field.Find(o => (o.PosX == posX) && (o.PosY == posY)); Да и как вообще эту строку понять?
|
|
« Последнее редактирование: 13-03-2012 21:09 от гайка »
|
Записан
|
|
|
|
Джон
просто
Администратор
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кстати, вот тут ещё: 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 » |
|
Джон, поняла. И за отрисовщика спасибо
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #14 : 13-03-2012 21:27 » |
|
Да не за что. Собственно я только хотел показать, как лего и просто выглядят в подобном решении ф-ции OnMouseClick и OnPaint. И я, кстати, тоже за то, чтобы подобные структуры данных были самостоятельными объектами со всеми необходимыми ф-ми, о которых ты упомянула, просто ща времени нет для примера что-то такое городить. зы Да, ещё одна бочка дёгтя в ложке с мёдом. 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 от гайка »
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #16 : 13-03-2012 21:53 » |
|
Size лучше подходит для этих целей, чем enum в любом случае. Ну не нравится Size, используй Point тогда тебе и кастинг (приведение типа) не придётся делать. Да, собственно говоря, это то, что глаза резануло. А в остальном... У каждого свой стиль. Форматирование кода у тебя хорошее, код "читабельный". У меня просто свои тараканы в голове. Поскольку моя работа проходит в основном в очень интимной (in team) обстановке, мы часто просматриваем и анализируем код. Разбираться в простынях-ф-ях просто нет времени, поэтому у нас действует типа стандарт, что ф-ции должны быть маленькими, если ф-я большая, она должна вызывать кучу других маленьких ф-ций. Скорость чтение и анализа такого кода возрастает в разы. К чему я, собственно, и привык. По этой, чисто эгоистичной причине, мне сразу становится грустно, если вдруг приходится разбираиться в ф-ях которые не помещаются на страницу 27" монитора. Поэтому в твой код детально не вникал. ps а чем тебе Size не подходит?зы всё забудь всё что я про Size говорил, я ща сам глянул. Я просто уже с полгода как не сишарплю. Спутал с С++, там просто два поля целого типа. Короче для тебя Point подойдёт. или вот 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 от гайка »
|
Записан
|
|
|
|
Джон
просто
Администратор
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 темами и сотней жаждущих познаний недопрограммистов:)
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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 секунды:Ребята, можно вас попросить протестировать то, что я наваяла? Самой игры пока нет, только ввод кораблей, но при вводе очень много "подводных камней". Я могла что-нибудь упустить. От вас требуется просто запустить и пощелкать мышкой всяко-разно. Если увидите ошибку - сообщайте. Ну и любители покопаться в чужом коде - на вашей улице сегодня праздник
|
|
« Последнее редактирование: 15-03-2012 18:03 от гайка »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #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
|
|
« Ответ #24 : 15-03-2012 18:22 » |
|
Я ставил строго в порядке уменьшения: четверку, трешки, двушки. Потом после второй единички установка прекратилась. Поставил четыре двушки
|
|
« Последнее редактирование: 15-03-2012 18:25 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
гайка
Гость
|
|
« Ответ #25 : 15-03-2012 18:24 » |
|
эй, так у тебя 4 двухпалубных! понятное дело, пока не исправишь их, нельзя строить другие.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #26 : 15-03-2012 18:26 » |
|
НО! После установки 3-х единичек программа перестает позволять ставить другие. большие корабли. Это обходится так: ставим A1, A3, A2
Эмм... то есть ты поставил А1 А2 А3 и дальше никак? блин, у меня всё строится, хоть ты трести Нет-нет. 1. Я поставил три однопалубных корабля. 2. Пытаюсь поставить 3-палубный. Жму: А1 (есть), А2 (не дает), А3 (есть), А2 (есть)... Посмотри мои посты выше - я обновлял их.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
RXL
|
|
« Ответ #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
|
|
« Ответ #29 : 15-03-2012 18:33 » |
|
Хм. Повторить не удалось. Но эффект был стойкий. Думаю есть бага, связанная с инициализацией переменных по кнопке сброса.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
гайка
Гость
|
|
« Ответ #30 : 15-03-2012 18:35 » |
|
RXL, ну ладно. Спасибо и на этом. Неизвестная ошибка - тоже ошибка!
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #31 : 15-03-2012 18:36 » |
|
Мне три раза удалось повторить этот эффект, но после перезапуска программы повторить больше не получилось.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
гайка
Гость
|
|
« Ответ #32 : 15-03-2012 18:41 » |
|
RXL, по шахматным координатам А1 - это ведь в левом нижнем углу?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #33 : 15-03-2012 18:44 » |
|
Не важно. Я выразился в таких координатах, чтобы показать отношения позиций. Т.е. рассматривай это как относительные координаты.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
гайка
Гость
|
|
« Ответ #34 : 15-03-2012 18:51 » |
|
Не получается у меня эту ошибку вызвать...
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #35 : 15-03-2012 20:20 » |
|
Не отчаивайся. Напишешь новую...
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #36 : 15-03-2012 21:09 » |
|
|
ss1.gif (14.73 Кб - загружено 1438 раз.)
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "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 » |
|
Джон, обещала тебе переделанный код показать. сделала набросок: 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; } } 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); } } 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); } } 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; } } } class SeaWar//пока не дописан { Field field1; Field field2;
public SeaWar() { field1 = new Field(10); field2 = new Field(10); } } 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 от гайка »
|
Записан
|
|
|
|
Джон
просто
Администратор
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
думала, так нежелательно делать
|
|
« Последнее редактирование: 16-03-2012 19:56 от гайка »
|
Записан
|
|
|
|
Джон
просто
Администратор
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 секунд: 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(); } } enum ShipState { normal, wounded, killed } abstract class Ship { public ShipState State;
public abstract void Draw(); } class OneDeck: Ship { public Cell CEll { get; private set; } public OneDeck(Cell cell_) { CEll = cell_; }
public override void Draw() {
} } 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 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 от гайка »
|
Записан
|
|
|
|
Джон
просто
Администратор
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
Спокойный
Администратор
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
Спокойный
Администратор
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
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #48 : 01-04-2012 21:36 » |
|
Field по идее говоря должно хранить только состояние поля Т.е. матрица ячеек.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
гайка
Гость
|
|
« Ответ #49 : 01-04-2012 21:37 » |
|
ну а кто тогда будет хранить корабли?
Добавлено через 42 секунды: ну список ячеек у меня это и есть матрица
|
|
« Последнее редактирование: 01-04-2012 21:38 от гайка »
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
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
|
|
« Ответ #52 : 02-04-2012 17:11 » |
|
Гайка, сделай так, как понравится тебе!
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
гайка
Гость
|
|
« Ответ #53 : 02-04-2012 17:17 » |
|
Меня Джон вызвался проверять так что надо так, чтоб еще понравилось ему Добавлено через 1 минуту и 38 секунд:Блинский, курсовой проект по ООП, а концепции ООП продемонстрировать не получается!
|
|
« Последнее редактирование: 02-04-2012 17:19 от гайка »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #54 : 02-04-2012 19:39 » |
|
Ну почему же? С кораблями ООП вписать вполне можно. К примеру, базовый класс корабля задает интерфейс и основные алгоритмы, а дочерние классы реализуют детали, характерные для корабля конкретной конфигурации. Так можно, имея общую логику, создавать корабли хоть буквой зю.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
гайка
Гость
|
|
« Ответ #55 : 02-04-2012 19:42 » |
|
ты когда-нибудь играл в морской бой? там по правилам только прямые корабли. а вариант с базовым классом кораблей и дочерними n-палубниками я уже проехала, вон там чуть ниже всё написано, обсужно, отшлепано и выгнано
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #56 : 02-04-2012 19:43 » |
|
а концепции ООП продемонстрировать не получается Это которые?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
RXL
|
|
« Ответ #57 : 02-04-2012 19:45 » |
|
Гайка, где написано, что морской бой имеет только одну форму и никак не может быть изменен?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
гайка
Гость
|
|
« Ответ #58 : 02-04-2012 19:47 » |
|
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #59 : 02-04-2012 19:50 » |
|
варианты игрыРазмер поля можно увеличить — например, размер 16×16 или 18×18 позволяет с удобством использовать весь размер одинарного тетрадного листа. В этом случае количество фигур можно увеличить — например, как предлагал Я. И. Перельман, добавить изогнутые четырёхклеточные фигуры (по одной штуке каждого из четырёх вариантов изогнутости: квадрат 2×2, Г-образная, Т-образная и четвёртый вариант изогнутости). Тогда, в связи с увеличением численности армий и размера поля, можно увеличить количество мин (например, до трёх) и добавить в игру минный тральщик (скажем, один у каждого игрока). Минный тральщик обозначается равнобедренным треугольничком, вписанным в одну клетку, так, что основание равнобедренного треугольника совпадает с нижней стороной клетки, а противоположная основанию вершина лежит на верхней стороне клетки, деля верхнюю сторону пополам. Фантазия не имеет границ.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
гайка
Гость
|
|
« Ответ #60 : 02-04-2012 19:57 » |
|
ну не хочу я другой морской бой!!! я уже этот начала и хочу его доделать. я уже 4-й раз его переделываю!! ХВАТИТ!!!
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #61 : 02-04-2012 19:58 » |
|
А ты не торопись писать. Меньше будет переделывать.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
гайка
Гость
|
|
« Ответ #62 : 02-04-2012 20:01 » |
|
от того что я буду писать медленней вряд ли измениться качество программы. Добавлено через 58 секунд:К тому же я вишу в списке на отчисление. мне нельзя медлить
|
|
« Последнее редактирование: 02-04-2012 20:02 от гайка »
|
Записан
|
|
|
|
Джон
просто
Администратор
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
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #64 : 03-04-2012 06:10 » |
|
"Лучше меньше, да лучше" (с) В.И. Ленин
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
гайка
Гость
|
|
« Ответ #65 : 03-04-2012 07:34 » |
|
Да, кстати вот еще. метод Drag&Drop. когда его реализовываешь, нужно прописывать много событий, в каждом по 5-10 строк примерно. класс формы в итоге выглядит довольно... засранно может быть будет правильнее заставить отрисовщика этим заниматься?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #66 : 03-04-2012 07:38 » |
|
Возможно. Визуализацию надо отделять от логики. Как ранее тут уже писали - MVC.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
гайка
Гость
|
|
« Ответ #67 : 03-04-2012 07:49 » |
|
Dimka, не заметила твое сообщение. а концепции ООП продемонстрировать не получается Это которые? ну не будет наследования, и как следствие не будет полиморфизма. останется только инкапсуляция.
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #68 : 03-04-2012 08:10 » |
|
Гайка, а в ООП главное как раз инкапсуляция. Всё остальное - особенности и костыли конкретного языка. Наследование и полиморфизм у тебя и так есть, как минимум ты форму унаследовала из framework
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
гайка
Гость
|
|
« Ответ #69 : 03-04-2012 08:24 » |
|
это не я, это "Код, автоматически созданный конструктором форм Windows"
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #70 : 04-04-2012 16:14 » |
|
Гайка, мож сначала упрощённую версию реализовать )
|
|
|
Записан
|
|
|
|
гайка
Гость
|
|
« Ответ #71 : 06-04-2012 13:21 » |
|
"Грешно смеяться над больными людьми" (с) к/ф "Кавказская пленница"
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #73 : 06-04-2012 15:15 » |
|
Гайка, я не смеюсь, как я могу!
|
|
|
Записан
|
|
|
|
|