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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.01.2010, 13:15   #1
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
Смущение Игра "Пары" - не могу найти ошибку

Всем доброго времени суток.

Пишу простенькую игру - "Пары". Из шести картинок необходимо открыть парные друг за другом. И тогда они исчезнут. Игра заканчивается, когда картинок не остаётся.

Код:
var
  frmMain      : TfrmMain;
  imgArray     : array[1..6] of TImage;
  iTag1, iTag2 : integer;
  ImgCount     : integer;

implementation

{$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);
var
  i : integer;
begin
  ImgCount := 6;
  imgArray[1] := imgPic1;
  imgArray[2] := imgPic2;
  imgArray[3] := imgPic3;
  imgArray[4] := imgPic4;
  imgArray[5] := imgPic5;
  imgArray[6] := imgPic6;
  imgPic1.Tag := 1;
  imgPic2.Tag := 3;
  imgPic3.Tag := 3;
  imgPic4.Tag := 2;
  imgPic5.Tag := 1;
  imgPic6.Tag := 2;
  imgPic1.Height:=64;
  imgPic1.Width :=64;
  imgPic1.Top := 24;
  imgPic1.Left := 32;
  for i := 1 to ImgCount do
  begin
    imgArray[i].Picture.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Data/4.jpg');
  end;
end;

{Эта процедура общая для всех шести картинок}
procedure TfrmMain.imgPic1Click(Sender: TObject);
var
  i : integer;
begin
  try
    if iTag1=0 then
    begin
      iTag1 := (Sender as TImage).Tag;
      (Sender as TImage).Picture.LoadFromFile(ExtractFilePath(Application.ExeName)
                                              + 'Data/' + IntToStr((Sender as TImage).Tag) + '.jpg');
    end else
    begin
      iTag2 := (Sender as TImage).Tag;
      (Sender as TImage).Picture.LoadFromFile(ExtractFilePath(Application.ExeName)
                                              + 'Data/' + IntToStr((Sender as TImage).Tag) + '.jpg');
    end;
    if iTag1 = iTag2 then
    begin
      for i := 1 to ImgCount do
      begin
        if imgArray[i].Tag = iTag2 then
          if imgArray[i]<>nil then
            imgArray[i].Free;
      end;
      iTag1 := 0;
      iTag2 := 0;
      Exit;
    end else
    begin
      if (iTag1<>0) and (iTag2<>0) then
      begin
        for i := 1 to ImgCount do
        {begin
          if imgArray[i].Tag = iTag1 then
          begin}
           // if imgArray[i]<>nil then
              imgArray[i].Picture.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Data/4.jpg');
          //end;
        //end;
        iTag1 := 0;
        iTag2 := 0;
      end;
    end;
  except
  end;
end;
Первая пара одинаковых картинок удаляется хорошо, а потом начиниются глюки. Поэтому прошу помочь исправить этот касяк.

И у меня ещё есть два вопроса, первый - как объявить массив картинок, потому что вот так не получается:

Код:
imgArray[1..6] : array of TImage = (imgPic1, imgPic2, imgPic3, imgPic4, imgPic5, imgPic6);
И второй вопрос, как можно картинки загружать рандомно, но так чтобы они не повторялись, т.е. есть 6 Image'й и нужно в них загрузить три картинки, так чтобы получилось три пары.

Заранее спасибо.

Вот исходник:
Вложения
Тип файла: rar Game.rar (23.8 Кб, 19 просмотров)
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 31.01.2010, 14:44   #2
Merkator
Читаю Кормена
Пользователь
 
Аватар для Merkator
 
Регистрация: 28.12.2008
Сообщений: 46
По умолчанию

1) Мне не очень нравится эта строчка:
Цитата:
Сообщение от Marsel737 Посмотреть сообщение
Код:
    imgArray[i].Picture.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Data/4.jpg');
В Delphi 2009 и выше функция возвращает полный путь т.е. с
$PATH$\Name.exe
Мне пришлось переписывать эту часть для работы.

2) Для рандомной загрузки картинок в массив попробуй так:
Код:
//Path - переменная типа string где хранится путь до игры
procedure RandomSet;
var
  i,k:integer;
  x:string;
  z:integer;
  c:char;
begin
  z:=1;//номер раздаваемой пары
  x:='123456';//некая служебная строка
  randomize;
  repeat
    k:=random(length(x));
    c:=x[k];
    Delete(x,k,1);
    imgArray[i].Picture.LoadFromFile(Path + 'Data/'+inttostr(z)+'.jpg'); 
    //в принципе можно это делать в цикле от 1 до 2  но мне кажется так легче
    k:=random(length(x));
    c:=x[k];
    Delete(x,k,1);
    imgArray[ord(c)-48].Picture.LoadFromFile(Path + 'Data/'+inttostr(z)+'.jpg'); 
    inc(z);
  until length(x)=0;
end;
Надеюсь верно понял задание. Этот код распределил картинки по картам.
Вам же необходимо его переписать, что бы не выводить а сохранять пути картинок.
-Массив картинок я объявлял также как и вы. Как это не прискорбно но другого способа я не нашел.
-Попробуйте при клике проверять равенство битмапов, или же в код распределения картинок рандомно добавьте еще один массив и в него сохраняйте какой карте соответствует какая картинка и при их равенстве удаляете эти картинки (img.hide; ) иначе просто снова меняете их картинки на рубашки.
Merkator вне форума Ответить с цитированием
Старый 31.01.2010, 15:02   #3
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

Merkator, тебе эта строчка зря не нравится, ведь она выводит полный путь каталога программы, в этом можно легко убедиться, при помощи такого кода:

Код:
procedure TfrmMain.Button1Click(Sender: TObject);
begin
  Label1.Caption := ExtractFilePath(Application.ExeName);
end;
За рандомный вывод картинок спасибо, попытаюсь разобрать пример.
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 31.01.2010, 15:25   #4
Merkator
Читаю Кормена
Пользователь
 
Аватар для Merkator
 
Регистрация: 28.12.2008
Сообщений: 46
По умолчанию

Упс не заметил ExtractFilePath.. я всегда использую самописную функцию и загоняю туда Application.exename;
Спасибо, познал нечто новое.
Merkator вне форума Ответить с цитированием
Старый 31.01.2010, 16:51   #5
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

На счёт второго вопроса:
Создаём массив из шести элементов: (1, 1, 2, 2, 3, 3)
И пишем функцию (сейчас переустанавливаю Delphi, поэтому проверить нет возможности - могу быть опечаточки):

Код:
ints:array[1..6] of integer = (1, 1, 2, 2, 3, 3);
N:=6;
used:=0;
for i:=1 to 6 do
begin
  cur:=random(N-used)+1;
  imgArray[i]:=img[ints[cur]];  //img - массив из трёх картинок
  tmp:=ints[cur];
  ints[cur]:=ints[N-used];
  ints[N-used]:=tmp;  //эту строку можно не писать
  used:=used-1;
end;

Последний раз редактировалось TwiX; 31.01.2010 в 18:34.
TwiX вне форума Ответить с цитированием
Старый 31.01.2010, 17:24   #6
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

TwiX, что значит массив из трёх картинок?

Код:
img : array[1..3] of TImage; //??
и что такое ints?
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 31.01.2010, 18:35   #7
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

В этот массив ты подгружаешь три разные картинки.
Код:
ints:array[1..6] of integer = (1, 1, 2, 2, 3, 3);
поправил
TwiX вне форума Ответить с цитированием
Старый 31.01.2010, 18:50   #8
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

TwiX, у меня картинка загружается в зависимости от тега картинки. Я тег присваиваю при создании:

Код:
  imgPic1.Tag := 1;
  imgPic2.Tag := 3;
  imgPic3.Tag := 3;
  imgPic4.Tag := 2;
  imgPic5.Tag := 1;
  imgPic6.Tag := 2;
А теперь я хочу сделать чтоб тег давался рандомно, но так чтобы не повторялся. А в твоём коде я уже запутался и там нет присваивания тега картинке.

П.с. код который я выкладывал в первом посте я уже сам подправил, поэтому вопрос с касяком отпадает. Остаётся только сдлеть рандомный тег.

РЕ:

Вот он, код для неповторяющегося рандома, нашол на форуме.

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  a,i:byte;
  m:set of byte;
begin
  m:=[];
  randomize;
  for i:=1 to 3 do
  begin
    repeat
    a:=random(3)+1;
    until not (a in m);
    include(m,a);
    Label1.Caption := Label1.Caption + IntToStr(a) + ' ';
  end;
end;
Вообщем-то тему можно закрывать, всем откликнувшимся спасибо.
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли

Последний раз редактировалось Marsel737; 31.01.2010 в 20:49.
Marsel737 вне форума Ответить с цитированием
Старый 31.01.2010, 21:04   #9
Deamonig
Форумчанин
 
Аватар для Deamonig
 
Регистрация: 19.09.2009
Сообщений: 166
По умолчанию

Не знаю поможет или нет, но вот сделал свою версию игры с рандомной загрузкой картинок и + если нажмеш на одну и ту же ничего не будет. В заголовке игры пишется по очереди какая картинка грузилась. Делал как то говорится по ламмерски Можно было б вместо case`в сделать Image:array [1..6] of TImage, но когда подумал об этом уже не стал переделывать. В общем главное что работает.
Вложения
Тип файла: rar Game.rar (25.6 Кб, 36 просмотров)
Deamonig вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Freelance Plazza. не могу найти кнопку "place bid" olecka777 WordPress и другие CMS 0 08.07.2009 19:40
Помогите пожайлуста найти, кто человек "вконтакте", зная его "мэйл" Аксюнька1990 Помощь студентам 1 12.06.2009 06:16
PHP(или другой язык): Получить все пары "имя" -> "значение" переданные методом POST KingOfNothing PHP 4 12.04.2009 14:06
"Суммирование рядов смешанного типа" Найти ошибку! maliyusha Паскаль, Turbo Pascal, PascalABC.NET 4 25.12.2008 20:19