Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2014, 09:21   #1
Nikolas_555
Пользователь
 
Аватар для Nikolas_555
 
Регистрация: 16.11.2013
Сообщений: 47
Стрелка процедура выигрыша\проигрыша в игре

создаю игру, она почти готова. вот сайт, где я о ней узнал:
http://www.pvsm.ru/matematika/36819
Так вот, на форме расположен массив из SpeedButton'ов, называется Buttons:
Код:
type
   TButton1 = record
    button: TSpeedButton;
    Tag1, Tag2: integer; // доп тэги
  end;
...

var
  Form6: TForm6;
  Buttons: Array [1..81] of TButton1;
...

индексы по порядку, как показано тут:



каждому SpeedButton'у присвоил Тэг по индексу, то есть:
Код:
 buttons[i].button.Tag := i;
осталось записать процедуру выигрыша\проигрыша, вот тут и проблема.
алгоритм, как я понял, вот такой:
при нажатии на любой SpeedButton из массива Buttons, должна обрабатываться проверка, есть ли три символа в ряд. если есть, то должна прорисовываться картинка выигравшего символа на всю область.
вот что у меня получилось: (пока только для первой области 3х3, для выигрыша крестиков)
Код:
procedure TForm6.ButtonA1Click(Sender: TObject);
begin
     if (kol mod 2 <> 0) then    // в зависимости от четности\нечетности
                                              //  хода, присваивается определённая
                                              //  картинка и дополнительный Тэг. 
                           begin
                             ImageList1.GetBitMap(1,TSpeedButton(Sender).Glyph);
                             Buttons[i].Tag1:=1; 
                           end
                         else
                            Begin
                              ImageList1.GetBitMap(2,TSpeedButton(Sender).Glyph);
                              Buttons[i].Tag1:=2;
                            End;
     kol:=kol+1;   \\ kol - количество ходов.
// всего восемь выигрышных позиций, их и проверяем.
if ((buttons[1 ].Tag1=1) and (buttons[2 ].Tag1=1) and (buttons[3 ].Tag1=1)) or
   ((buttons[10].Tag1=1) and (buttons[11].Tag1=1) and (buttons[12].Tag1=1)) or
   ((buttons[19].Tag1=1) and (buttons[20].Tag1=1) and (buttons[21].Tag1=1)) or
   ((buttons[1 ].Tag1=1) and (buttons[10].Tag1=1) and (buttons[19].Tag1=1)) or
   ((buttons[2 ].Tag1=1) and (buttons[11].Tag1=1) and (buttons[20].Tag1=1)) or
   ((buttons[3 ].Tag1=1) and (buttons[12].Tag1=1) and (buttons[21].Tag1=1)) or
   ((buttons[1 ].Tag1=1) and (buttons[11].Tag1=1) and (buttons[21].Tag1=1)) or
   ((buttons[3 ].Tag1=1) and (buttons[11].Tag1=1) and (buttons[19].Tag1=1))

  then
   WIN_obl1_X; \\вызываем прорисовку выигрышной картинки крестика.
end;

procedure TForm6.WIN_obl1_X;
Begin
// X [1]
     ImagesWin[1].Picture.LoadFromFile('C:\Users\Lenovo\Downloads\Pictures\X_win_obl.bmp');
     ImagesWin[1].Visible:=True;
End;
ImagesWin - это массив картинок, при выигрыше. изначально, при создании формы:
Код:
procedure TForm6.FormCreate(Sender: TObject);
var i,j,n:integer;
 begin
  kol:=1;
//создание  ImagesWin (массива картинок)
   for N := Low(ImagesWin) to High(ImagesWin) do     // от первого компонента массива до последнего
    begin
     ImagesWin[n] := TImage.Create(Form6);
     ImagesWin[n].Parent := Form6;
     ImagesWin[n].Left := XXX[n];
     ImagesWin[n].Top := YYY[n];
     ImagesWin[n].Height := 152;
     ImagesWin[n].Width := 152;
     ImagesWin[n].Tag := n;
     ImagesWin[n].Transparent:=True;
     ImagesWin[n].Visible:=False; // сначала картинки невидимы
     ImagesWin[n].Picture:=nil;
    end;
я что-то упустил?
почему-то при выставлении крестиков в ряд ничего не происходит
Nikolas_555 вне форума Ответить с цитированием
Старый 30.05.2014, 09:32   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Код:
                            Buttons[i].Tag1:=1;
и чему же у тебя здесь равно i ?
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 30.05.2014, 09:42   #3
Nikolas_555
Пользователь
 
Аватар для Nikolas_555
 
Регистрация: 16.11.2013
Сообщений: 47
По умолчанию

Код:
// создание  buttons (массива кнопок)
  for I := Low(buttons) to High(buttons) do     // от первого компонента массива до последнего
    begin
     buttons[i].button := TSpeedButton.Create(Owner);
     buttons[i].button.Parent := Form6;
     buttons[i].button.Left := XX[i];
     buttons[i].button.Top := YY[i];
     buttons[i].button.Height := 34;
     buttons[i].button.Width := 34;
     buttons[i].button.Tag := i;
     buttons[i].Tag1 := 0;
     buttons[i].Tag2 := 0;
     buttons[i].button.Glyph.LoadFromFile('C:\Users\Lenovo\Downloads\Pictures\fon.bmp');
     buttons[i].button.OnClick := ButtonA1Click;
     buttons[i].button.OnMouseEnter := ButtonA1MouseEnter;
     buttons[i].button.OnMouseLeave := ButtonA1MouseLeave;
    end;
это в процедуре создания формы. i = от 1 до 81, от первого до последнего...

вроде понял, так же for'ом нужно и в процедуре клика сделать, да?

Последний раз редактировалось Nikolas_555; 30.05.2014 в 09:45.
Nikolas_555 вне форума Ответить с цитированием
Старый 30.05.2014, 09:46   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

вопрос относился к коду приведенному в первом посте
Цитата:
Код:
procedure TForm6.ButtonA1Click(Sender: TObject);
begin
     if (kol mod 2 <> 0) then    // в зависимости от четности\нечетности
                                              //  хода, присваивается определённая
                                              //  картинка и дополнительный Тэг. 
                           begin
                             ImageList1.GetBitMap(1,TSpeedButton(Sender).Glyph);
                             Buttons[i].Tag1:=1; 
                           end
                         else
                            Begin
                              ImageList1.GetBitMap(2,TSpeedButton(Sender).Glyph);
                              Buttons[i].Tag1:=2;
                            End;
при НЕиспользовании глобальных переменных для решения локальных задач
Код:
procedure ...
var
  i: innteger;
begin
   for i:=1 to ...
вас бы сразу образумил компилятор. (error: undeclared....)
а потом при использовании локальных переменных
постарался бы образумить еще раз (warning: undefined ...)

P.S/ локальные переменные облегчают написание правильных программ. если конечно же люди прислушиваются к словам компилятора. (warnning)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 30.05.2014 в 09:57.
evg_m вне форума Ответить с цитированием
Старый 30.05.2014, 09:54   #5
Nikolas_555
Пользователь
 
Аватар для Nikolas_555
 
Регистрация: 16.11.2013
Сообщений: 47
По умолчанию

так, идею понял.
попробовал сделать for'ом, переменная p.
Код:
procedure TForm6.ButtonA1Click(Sender: TObject);
var p:integer;
begin
  for p := 1 to 81 do
   begin
     if (kol mod 2 <> 0) then
                           begin
                             ImageList1.GetBitMap(1,TSpeedButton(Sender).Glyph);
                             Buttons[p].Tag1:=1;
                           end
                         else
                            Begin
                              ImageList1.GetBitMap(2,TSpeedButton(Sender).Glyph);
                              Buttons[p].Tag1:=2;
                            End;
   end;
теперь вот это работает не так, как я хочу
Код:
if ((buttons[1 ].Tag1=1) and (buttons[2 ].Tag1=1) and (buttons[3 ].Tag1=1)) or
   ((buttons[10].Tag1=1) and (buttons[11].Tag1=1) and (buttons[12].Tag1=1)) or
   ((buttons[19].Tag1=1) and (buttons[20].Tag1=1) and (buttons[21].Tag1=1)) or
   ((buttons[1 ].Tag1=1) and (buttons[10].Tag1=1) and (buttons[19].Tag1=1)) or
   ((buttons[2 ].Tag1=1) and (buttons[11].Tag1=1) and (buttons[20].Tag1=1)) or
   ((buttons[3 ].Tag1=1) and (buttons[12].Tag1=1) and (buttons[21].Tag1=1)) or
   ((buttons[1 ].Tag1=1) and (buttons[11].Tag1=1) and (buttons[21].Tag1=1)) or
   ((buttons[3 ].Tag1=1) and (buttons[11].Tag1=1) and (buttons[19].Tag1=1))

  then
   WIN_obl1_X;
end;
то есть, после первого хода, сразу появляется картинка выигрыша. в чем проблема понять не могу...

Последний раз редактировалось Nikolas_555; 30.05.2014 в 10:28.
Nikolas_555 вне форума Ответить с цитированием
Старый 30.05.2014, 11:14   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
в чем проблема понять не могу...
в бездумном написании кода .
прокомментируй что ты ХОЧЕШЬ сделать (именно хочешь, а не делаешь) в твоем начальном коде (см. далее)
Ведь зачем-то ты писал данный код. значит и опиши ЗАЧЕМ (для чего) ты писал данные строчки.
Цитата:
Код:
     if (kol mod 2 <> 0) then 
                           begin //для нечетных ходов
                             ImageList1.GetBitMap(1,TSpeedButton(Sender).Glyph); // меняем картинку на той кнопке по которой  щелкнули
                             Buttons[p].Tag1:=1; // ???????????????????????????????????????????????????
                           end
                         else
                            Begin // для четных ходов
                              ImageList1.GetBitMap(2,TSpeedButton(Sender).Glyph);
                              Buttons[p].Tag1:=2;
                            End;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 30.05.2014, 11:22   #7
Nikolas_555
Пользователь
 
Аватар для Nikolas_555
 
Регистрация: 16.11.2013
Сообщений: 47
По умолчанию

так я ж писал вначале. хорошо, вот:
Код:
 if (kol mod 2 <> 0) then 
                           begin //для нечетных ходов
                             ImageList1.GetBitMap(1,TSpeedButton(Sender).Glyph); // меняем картинку на той кнопке по которой  щелкнули, в данном случае в ImageList картинка под индексом 1 это крестик.
                             Buttons[p].Tag1:=1; // присваиваем тэг крестика.
                           end
                         else
                            Begin // для четных ходов
                              ImageList1.GetBitMap(2,TSpeedButton(Sender).Glyph); // индекс 2, картинка нолика.
                              Buttons[p].Tag1:=2; // а это будет тэг нолика.
                            End;
потом, по этим Тэгам я обращаюсь к определённым кнопкам, на которых либо крестик, либо нолик.
на пример вот тут:
Код:
if ((buttons[1 ].Tag1=1) and (buttons[2 ].Tag1=1) and (buttons[3 ].Tag1=1)) or
   ((buttons[10].Tag1=1) and (buttons[11].Tag1=1) and (buttons[12].Tag1=1)) or
   ((buttons[19].Tag1=1) and (buttons[20].Tag1=1) and (buttons[21].Tag1=1)) or
   ((buttons[1 ].Tag1=1) and (buttons[10].Tag1=1) and (buttons[19].Tag1=1)) or
   ((buttons[2 ].Tag1=1) and (buttons[11].Tag1=1) and (buttons[20].Tag1=1)) or
   ((buttons[3 ].Tag1=1) and (buttons[12].Tag1=1) and (buttons[21].Tag1=1)) or
   ((buttons[1 ].Tag1=1) and (buttons[11].Tag1=1) and (buttons[21].Tag1=1)) or
   ((buttons[3 ].Tag1=1) and (buttons[11].Tag1=1) and (buttons[19].Tag1=1))

  then
   WIN_obl1_X;
end;
то есть, 8 выигрышных позиций. три по горизонтали, три по вертикали, и две по диагонали.

Последний раз редактировалось Nikolas_555; 30.05.2014 в 11:38.
Nikolas_555 вне форума Ответить с цитированием
Старый 30.05.2014, 11:40   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
// присваиваем тэг крестика.
присваивать мы должны чему-то.
чему (какому) ??
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 30.05.2014, 11:54   #9
Nikolas_555
Пользователь
 
Аватар для Nikolas_555
 
Регистрация: 16.11.2013
Сообщений: 47
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
присваивать мы должны чему-то.
чему (какому) ??
эм... присваивается элементу массива кнопок, на который мы кликнули.
что-то не так написано в коде?

Последний раз редактировалось Nikolas_555; 30.05.2014 в 12:05.
Nikolas_555 вне форума Ответить с цитированием
Старый 30.05.2014, 12:57   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
эм... присваивается элементу массива кнопок, на который мы кликнули.
вообще-то мы щелкали не по элементу массива, а по некоторому объекту
Цитата:
на той кнопке по которой щелкнули =TSpeedButton(Sender)
так что Buttons[p] ЭТО не то где мы щелкали !!! им может быть только buttons[x].button .
а вот какой из всех этих ?!
Цитата:
и чему же у тебя здесь равно i ? (p,x, ....)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 30.05.2014 в 13:05.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему алгоритмы быстрых сортировок не дают большого выигрыша при малых размерах массивов? Proskurina Общие вопросы по программированию, компьютерный форум 9 26.12.2012 15:42
подредактировать античит к игре игре Nhl 09 (античит написан на дельфи) Viper18 Фриланс 3 03.08.2011 17:37
Найдите вероятность выигрыша для А и для В supavlova Помощь студентам 0 01.02.2011 19:24
Объекты в игре ZotaC Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 03.03.2010 21:15
Процедура в процедура в C++ Builder Ecosasha C++ Builder 2 06.06.2009 17:17