Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];

Вниз

Нужна помощь по формам   Найти похожие ветки 

 
lstalkerl ©   (2006-05-25 01:32) [0]

У меня такая проблемма. Есть 2 формы. Сначала запускаеться 1, потом вторая. В 1 форме, есть процедрура, которая начинает выполняться сразу после запуска программы(игра Сапер), которая формирует игровое поле с помощью матрицы, назовем ее NewGame. Эта процедура использует для создания поля - NM-кол-во мин N-кол-во клеток по вертикали M-горизонтали. Моя задача состоит в том, чтобы дать возможность самому вводить кол-во мин(оно раньшше содержалось в Const NM=10). Я сделал так. В менню добавил параметр - кол-во мин, на OnClick поставил действие, чтобы запускалась 2 форма. Вторая форма состоит из Edit и Button. Из Edit она берет строку, переводит ее в integer и присваивает переменной NM, которую я удалил из const 1 формы, записал в Public второй формы. После копиляции прога выдает ошибку. Как я думаю, она сначала запускает процедуру NewGame, и при ее выполнении начинает материца, ведь NM не имеет еще никакого значения. Тогда я после слова Begin в процедуре NewGame написал form2.nm:=10, ну типо чтобы она сначала приняла значение 10, чтобы прога нормально запустилась, а потом уж если че, можно будет поменять это значение из меню -задать кол-во мин.

Вроде все....обьяснил наверно непонятно....вообщем тут исходник, кое че не сходиться(названия переменных) с вышенаписанным текстом, но суть одна и таже.

http://webfile.ru/962715

З.Ы. Просьба, кто возьметься помочь, не просто скинуть рабочую версию, а еще обьяснить, что изменили(добавили, удалили) и почему было не правильно, т.е. тыкнуть где была ошибка.


 
Rial ©   (2006-05-25 03:39) [1]

Посмотрел, не поленился, код.
Спасибо за комментарии кстати! Первый раз вижу комменты в таком количестве на русском!

Дело в том, что на момент создания 1-й формы остальные двеформы еще не созданы. А ты обращаешься к ним в OnCreate первой формы.

Вохда два:
1. Простой, но не оптимальный.
Переместить код с использованием других форм (следующих в списке создания) в OnShow, например, который в штатных (читай - простых) ситуаниях вызывается 1 раз. Для верности прописать там флаг:
OnCreate
MyFlag:=False;
OnShot
If (Not MyFlag)then begin
//Делай то, что мужно было
MyFlag:=True;
end;
2.По - моему, белее верный.
- Открываешь исходник проекта (Ctrl+F12, Имя проекта).
- Удаляешь строки
 Application.CreateForm(TForm2, Form2);
 Application.CreateForm(TForm3, Form3);
- В самом начале OnCreate первой формы пишешь:
Form2:=TForm2.Create(Application);
Form3:=TForm3.Create(Application);

А можно и
Form2:=TForm2.Create(Nil);
Form3:=TForm3.Create(Nil);

Таким образом, у тебя формы будут созданы все еще после первой, но
до обращения к ним твоих процедур.

3.Но, откровенно гороря, идея с автоматическим созданием игрового поля
сразу при загрузке мне не очень нравится. Поэтому :))  и работало это
плохо у тебя сначала.

4.
ShellExecute(h27,"open","C:\saper.doc","","C:\",SW_SHOWDEFAULT);
А почему у тебя все привязано к абсолытным путям то ?
Не надо так делать, скопируй все файлы в папку с игрой ( или ее подпапки)
и используй отновительные пути к файлам.

5.
Обзови формы как -нибудь иначе. Если будешь мутить крытую игруху,
потом могут возникнуть проблумы с именами.

6. Убей твои константы.
Пусть юзер выбирает эти параметры сам.

7. Разделайся с поганым forward.
Либо забей все процедуры в класс формы,
либо создай отдельный юнит для движка игры, и там их в разделе interface опиши.

8. Статус сделай не Int, а множество, например
TStatus=(gsBegin,gsResult,gsGame);
От путаницы застрахуешься.

9.
"k:=k+1;"     =:=        "Inc(K);"

10.
Нарисуй вначале один раз мину на Bitmap"е. (У него тоже есть Canvas).
Потом выводиуже сам рисунок.
Это ускорит многократно работу.
Так же и с остальными картинками.

11.
 if Pole[row-1,col-1] = 9 then k := k + 1;
 if Pole[row-1,col]   = 9 then k := k + 1;
 if Pole[row-1,col+1] = 9 then k := k + 1;
 if Pole[row,col-1]   = 9 then k := k + 1;
 if Pole[row,col+1]   = 9 then k := k + 1;
 if Pole[row+1,col-1] = 9 then k := k + 1;
 if Pole[row+1,col]   = 9 then k := k + 1;
 if Pole[row+1,col+1] = 9 then k := k + 1;
Создай еще два цикла.
Кстати о птичках, а как же все точки по периметру, ты их то что забыл ??

12.
В Form1.OnCrate есть код:
  Form1.ClientHeight := H*MR + 1;
  Form1.ClientWidth := W*MC + 1;
А можно просто
ClientHeight := H*MR + 1;
ClientWidth := W*MC + 1;
так как сидим в одном классе.

13. Canvas !!!

14. Блин, откуда такая прилежность в комментах и формате.
Мне бы такую :)).


 
lstalkerl ©   (2006-05-25 04:54) [2]

Эх....стыдно мне (((


> Спасибо за комментарии кстати! Первый раз вижу комменты
> в таком количестве на русском!



>  Блин, откуда такая прилежность в комментах и формате.


Скажу всю правду)) Делал я Сапера не сам(( С нета скачал, просто мне курсач завтра сдавать, и времени вообще нет самому писать. Просто решил немного доработать программу, если бы сам делал, то многое бы изменил...


> 3.Но, откровенно гороря, идея с автоматическим созданием
> игрового поля
> сразу при загрузке мне не очень нравится.


Угу, незнаю зачем так придумали ...


> 4.
> ShellExecute(h27,"open","C:\saper.doc","","C:\",SW_SHOWDEFAULT);
>
> А почему у тебя все привязано к абсолытным путям то ?
> Не надо так делать, скопируй все файлы в папку с игрой (
> или ее подпапки)
> и используй отновительные пути к файлам.


Не подскажешь как относительные пути сделать? А то с делфи всего 3-4 дня работаю, и то чето получаеться, потому что Паскаль более менее знаю...


> 7. Разделайся с поганым forward.
> Либо забей все процедуры в класс формы,


Я даже представления не имею что такое форвард, пытался найти в учебнике по 7 делфи, не нашел(( Кратко не расскажешь? И как забить процедуры в класс формы?


> 10.
> Нарисуй вначале один раз мину на Bitmap"е. (У него тоже
> есть Canvas).
> Потом выводиуже сам рисунок.
> Это ускорит многократно работу.


Попробую сделать, мне самому не нравиться, что по точкам все рисуеться.


> 11.
>  if Pole[row-1,col-1] = 9 then k := k + 1;
>  if Pole[row-1,col]   = 9 then k := k + 1;
>  if Pole[row-1,col+1] = 9 then k := k + 1;
>  if Pole[row,col-1]   = 9 then k := k + 1;
>  if Pole[row,col+1]   = 9 then k := k + 1;
>  if Pole[row+1,col-1] = 9 then k := k + 1;
>  if Pole[row+1,col]   = 9 then k := k + 1;
>  if Pole[row+1,col+1] = 9 then k := k + 1;
> Создай еще два цикла.
> Кстати о птичках, а как же все точки по периметру, ты их
> то что забыл ??


А зачем еще циклы? А какие точки по периметру? Туплю просто...2 сутки не сплю((


 
lstalkerl ©   (2006-05-25 04:59) [3]

Кстати, ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ ! ! ! !

з.ы. Кстати, если вдруг нужна помощь в 3д, обращайся ;) В нем я побольше разбираюсь, чем в Делфи))


 
lstalkerl ©   (2006-05-25 06:27) [4]

Попробывал сделать так как ты сказал, все, теперь формы создаються до запуска процедур. Но я немогу задать кол-во мин, ведь после запуска программы запускаеться процедура NewGame, и расставляет мины на поле, и когда я выбираю кол-во мин в опциях, то процедура еще раз не выполняеться, и мин остаеться столько, сколько стоит по умолчанию. Как можно сделать так, чобы после выполнения процедуры из 3 формы, выполнялась процедура из 1 формы?


 
lstalkerl ©   (2006-05-25 06:50) [5]

Все, усе работает)) Просто ступил...Надо было убрать NewGame из OnCreate.
Но вопрос по 4 , 7 и 11 пункту из 2 поста, так и остался.


 
lstalkerl ©   (2006-05-25 07:16) [6]

Еще вопрос. Когда запускаеться игра, мне надо, чтобы вместо поля, была Label с надписью, я сделал так

procedure TForm1.Form1Create(Sender: TObject);
var
 row,col : integer;
begin
  label1.Enabled:=true;
  label1.visible:=true;
  NM1:=10;


Т.е после запуска у меня, вместо игрового поля, Label с надписью САПЕР.Потом после нажатия Новая игра, действие передается процедуре NewGame. Как сделать, что нада в этой процедуре написать, чтобы это поле исчезло? Я пробывал так

procedure NewGame();

  var
    row,col : integer;
    n : integer;      
    k : integer;      
  begin
    label1.Enabled:=false;
    label1.visible:=false;


Но, вылазиет ошибка, как нада обьявить в NewGame label, чтобы он его рассматривал не как переменную, а как поле, т.е. работал бы с ним как в процедуре procedure TForm1.Form1Create


 
Mortem ©   (2006-05-25 08:04) [7]

Form1.label1.visible := False;

Про пути:
Я обычно делаю следующим образом:
1. Создаём строковую переменную dirRoot.
2. В OnCreate основной формы пишем
dirRoot := ExtractFileDir(ParamStr(0));
3. Ну и применяем
ShellExecute(h27, "open", dirRoot+"saper.doc", "", dirRoot, SW_SHOWDEFAULT);
При этом "saper.doc" должен лежать в директории с твоей программой.


 
Rial ©   (2006-05-25 14:48) [8]

I.
Если, кочечно, сегодня тебе сдавать, то я опоздал (спать приходится иногда, бли н!). Но все же.

Пример:
Было
procedure MyProc(...);forward;
begin
...
end;

Делаем:
1)
Type
...
  TForm1=Class(Form)
  ....
  public
    procedure MyProc(..);
...
end;

....
implementation
...
procedure TForm1.MyProc(..);
begin
...
end;

2)
Создаем новый юнит
Unit MyUnit;
interface
procedure MYProc(..);

...
implementation
...
procedure MyProc(...);forward;
begin
...
end;

Не забыдь в модуле формы "Unit1.pas" указать в Uses модуль MyUnit.

II.
 if Pole[row-1,col-1] = 9 then k := k + 1;
if Pole[row-1,col]   = 9 then k := k + 1;
if Pole[row-1,col+1] = 9 then k := k + 1;
if Pole[row,col-1]   = 9 then k := k + 1;
if Pole[row,col+1]   = 9 then k := k + 1;
if Pole[row+1,col-1] = 9 then k := k + 1;
if Pole[row+1,col]   = 9 then k := k + 1;
if Pole[row+1,col+1] = 9 then k := k + 1;

Замени на
Var ...
  K,L:Int;
begin
...
for k:=row-1 do row+1 do
for l:=col-1 do col+1 do
 if (pole[k,l]=9)then inc(k);
...
end;

А вот по поводу точек по периметру разберь сам.
Суть в следующем: для всех точек из
[1..rowcount][1..colcount] у тебя счетается кол-во мин.
А как же 0-й (MR+1)-й столбцы, и 0-й и (MC+1)-й строки ?
Там, насколько я понял, гуляет ветер...

Нужно что - то наподобие этого:
row:=0;
While (row<=mr+1)do begin
col:=0;
While (col<=mc+1)do begin
 for k:=row-1 do row+1 do
  for l:=col-1 do col+1 do
   if (k>=0)and(K<=mr+1)and
      (l>=0)and(l<=mc+1)and
      (pole[k,l]=9)then inc(k);
 col:=col+mc+1;
end;//while col
row:=row+mr+1;
end;/*while row

Не оптимально, но работать будет.


 
Rial ©   (2006-05-25 14:48) [9]

Сори, тег забыл закрыть ....


 
Rial ©   (2006-05-25 14:56) [10]

Чем именно ты занимаешься в 3d ?
В принципе, я бы не отказался от помощи дизайнера или от неплохой озвучки для игры.



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.038 c
1-1172160963
Undertaker-wwf
2007-02-22 19:16
2007.04.22
FloatToStr и TFormatSettings - проблема с ThousandSeparator


15-1175069461
MysqlNoob
2007-03-28 12:11
2007.04.22
MySql и консоль


2-1175355079
sat
2007-03-31 19:31
2007.04.22
TChart


2-1175629090
likenoother
2007-04-03 23:38
2007.04.22
домножение


15-1174656149
Andre_s
2007-03-23 16:22
2007.04.22
Жидкокристаллические 17"





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский