Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

создаю игру, она почти готова. вот сайт, где я о ней узнал:
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
Сообщений: 4,460
Репутация: 1965
По умолчанию

Цитата:
Код:

                            Buttons[i].Tag1:=1;

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

Код:

// создание  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
Сообщений: 4,460
Репутация: 1965
По умолчанию

вопрос относился к коду приведенному в первом посте
Цитата:
Код:

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
Репутация: 10
По умолчанию

так, идею понял.
попробовал сделать 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
Сообщений: 4,460
Репутация: 1965
По умолчанию

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

     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
Репутация: 10
По умолчанию

так я ж писал вначале. хорошо, вот:
Код:

 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
Сообщений: 4,460
Репутация: 1965
По умолчанию

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

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

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

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

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



Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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




11:38.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru