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

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - 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,515
По умолчанию

Цитата:
Код:
                            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,515
По умолчанию

вопрос относился к коду приведенному в первом посте
Цитата:
Код:
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,515
По умолчанию

Цитата:
в чем проблема понять не могу...
в бездумном написании кода .
прокомментируй что ты ХОЧЕШЬ сделать (именно хочешь, а не делаешь) в твоем начальном коде (см. далее)
Ведь зачем-то ты писал данный код. значит и опиши ЗАЧЕМ (для чего) ты писал данные строчки.
Цитата:
Код:
     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,515
По умолчанию

Цитата:
// присваиваем тэг крестика.
присваивать мы должны чему-то.
чему (какому) ??
программа — запись алгоритма на языке понятном транслятору
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,515
По умолчанию

Цитата:
эм... присваивается элементу массива кнопок, на который мы кликнули.
вообще-то мы щелкали не по элементу массива, а по некоторому объекту
Цитата:
на той кнопке по которой щелкнули =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