Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 420

/ вопрос решён /

Здравствуйте!
Подскажите пожалуйста в чем может быть ошибка.
на форме есть 36 изображений. по клику на них они открываются(в зависимости от выбора или по 2 или по три)
когда открыто кол-во К(2 или 3) необходимо осуществить проверку, одинаковые открыт или нет.
как поняла из работы программы, картинки открываются разные, значит в масивы заносятся разные названия картинок и номера тех по которым щелкнули, однако после проверки на "одинаковость" прграмма переходит в ту часть программы, которая для одинаковых картинок, даже если они были разными.

Приложение:
  1. var
  2. Form1: TForm1;
  3. kol:2..40;
  4. mas:array[1..36]of string[10]; {massiv kartinok}
  5. v:array[1..3]of string[10]; {imea vibrannih kartinok}
  6. n:array[1..3]of byte; {nomera vibrannih kartinok}
  7. vibor:byte; {skoliko uje vibrali [0..3]}
  8. k:byte;{po skoliko otkrivati [dva ili tri]}
  9. time:word; {vremea ojidania polse klika po kartinke}
  10. stop:word; {chislo ugadannih par kartinok}
  11. sek,min,mesto:integer;
  12. sek1,min1:string;
  13.  
  14. procedure TForm1.ImageClick(Sender: TObject);
  15. var para:integer;
  16. begin
  17. with (sender as Timage) do
  18. Picture.LoadFromFile('foto\'+mas[tag]+'.bmp'); //pokajem chto igrok vibral
  19. inc(vibor); // uvelichivaem vibor na 1
  20. v[vibor]:=mas[tag]; // imea kartinki
  21. n[vibor]:=tag; //nomer kartinki kuda shelknul igrok
  22. Form1.Refresh; //pererisovka
  23. sleep(time); //jdem zadannoe vremea
  24. if vibor=k then check;
  25. // if vibor=k then Check; //proveream
  26. end;
  27.  
  28. Procedure TForm1.Check; {poroveream odinakovie li kartinki}
  29. var flag: boolean;
  30. i, j: byte;
  31. qw, kolprob: integer;
  32. prom: Tplayer;
  33. Stroka, slovo: string;
  34. stfile:textfile;
  35. begin
  36. flag:=true;
  37. for i:=1 to k-1 do
  38. begin
  39. if (v[i]<>v[i+1]) then
  40. begin
  41. flag:=false; {raznie!}
  42. break;
  43. end;
  44. end;
  45.  
  46. if flag then
  47. begin {pravilino ugadal}
  48. for i:=1 to k do
  49. TImage(FindComponent('Image'+IntToStr(n[i]))).Picture.LoadFromFile('foto\null.bmp');
  50. stop:=stop+k; //uvelichim chislo ugadannih
  51. end
  52. else
  53. begin {ne pravilino ugadal}
  54. for i:=1 to k do
  55. TImage(FindComponent('Image'+IntToStr(n[i]))).Picture.LoadFromFile('foto\0.bmp');
  56. end;
  57. vibor:=0;


MerryJane Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задала: MerryJane (статус: Посетитель)
Вопрос отправлен: 17 июня 2011, 13:26
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 35; последнее сообщение — 17 июня 2011, 17:33; участников в обсуждении: 3.

Страницы: [1] [2] [Следующая »]

min@y™

min@y™ (статус: Доктор наук), 17 июня 2011, 13:35 [#1]:

Вопрос написан по-русски, но почему комментарии в коде транслитом-то?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
MerryJane

MerryJane (статус: Посетитель), 17 июня 2011, 13:39 [#2]:

аа исправить забыла)= потому что программу что бы сдать переношу с компа домашнего на вузовский и русский язык вопросами становится
Gooddy

Gooddy (статус: 3-ий класс), 17 июня 2011, 13:50 [#3]:

Честно, при всём желании не могу разобраться. Код слишком спагетти, всё таки лучше переписать.
Чисти код! Чисти код! Чисти код!
min@y™

min@y™ (статус: Доктор наук), 17 июня 2011, 13:51 [#4]:

Цитата (MerryJane):

потому что программу что бы сдать переношу с компа домашнего на вузовский и русский язык вопросами становится

На вузовском компе windows китайский?
Дам несколько бесплатных советов.
1. Для того, чтобы понять как себя ведёт программа во время выполнения, и, самое главное, почему, в delphi есть отладчик, воспользуйся им.
2. Форматируй код нормально и пиши побольше комментариев, иначе никто его читать не будет. Код пишется для человека, а не для компа.
3. Количество глобальных переменных должно всегда стремиться к нулю! Чем их меньше, тем быстрее локализовывать ошибки времени выполнения.
4. Имена идентификаторов должны быть осмысленными (нести смысловую нагрузку), а не быть одно- или двух буквеными, типа a, b, с, х, у, й, z и т.д. Так программу легче анализировать. Также, не используй имена компонентов и модулей, которые назначаются им по умолчанию (Form1, Button2, Unit100500). Давай им осмысленные имена.
5. Разбивай общую задачу на подзадачи, которые, в свою очередь, тоже разбивай на более мелкие отдельные блоки, которые оформляй в виде функций, желательно независимых друг от друга.

Теперь по делу. Скажи мне, что у тебя делает метод TForm1.Check()? Я нихрена не понял не то что его работу, а вообще смысл.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
MerryJane

MerryJane (статус: Посетитель), 17 июня 2011, 13:52 [#5]:

я моу все объяснить(= что во всех процедурах делается, честно!)
Gooddy

Gooddy (статус: 3-ий класс), 17 июня 2011, 13:55 [#6]:

min@y™:
2. Комментарии нужны для плохого кода. Хороший код сам себе и блок-схема и комментарий.

С остальным согласен.
Чисти код! Чисти код! Чисти код!
min@y™

min@y™ (статус: Доктор наук), 17 июня 2011, 13:55 [#7]:

Кстати, 36 картинок - это колода карт, да?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Gooddy

Gooddy (статус: 3-ий класс), 17 июня 2011, 13:56 [#8]:

min@y™: не, просто картинки.
Чисти код! Чисти код! Чисти код!
min@y™

min@y™ (статус: Доктор наук), 17 июня 2011, 13:57 [#9]:

Цитата (Gooddy):

Комментарии нужны для плохого кода. Хороший код сам себе и блок-схема и комментарий.
С остальным согласен.

Когда начнёшь писать серьёзные программы, тогда поймёшь, что был неправ.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
MerryJane

MerryJane (статус: Посетитель), 17 июня 2011, 14:00 [#10]:

В первом цикле for проверяет, одинаковые ли картинки были открыты, и возвращает в зависимости от этого значение переменной flag( =false если разные. проверяет по именам картинок хранящихся в массиве V.

дальше если картинки открыты одинаковые он меняет их изображения на изображение null(просто серый квадрат цвета фона. типа убраны с формы). и увеличивает кол-во угаданных картинок на k(это по скольку картинок открывать по три или по две) . когда кол-во угаданных станет равно кол-ву всего картинок программа выведет сообщение "игра окончена"
если открыты разные картинки то они"закрываются" загружается картинка "рубашка "их. вот
min@y™

min@y™ (статус: Доктор наук), 17 июня 2011, 14:03 [#11]:

Цитата (MerryJane):

я моу все объяснить(= что во всех процедурах делается, честно!)

Для начала объясни, что долна делать программа вцелом. Потом вместе попытаемся разбить её на подзадачи и подподзадачи. Судя по коду, проект надо грохнуть и написать заново. Пару часов времени у меня ещё есть.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 17 июня 2011, 14:07 [#12]:

Цитата (MerryJane):

В первом цикле for проверяет, одинаковые ли картинки были открыты

Как производится проверка на то, что картинки одинаковые? Это ж самое главное! Что является критерием идентичности картинок и как этот критерий задаётся до проверок?

Отдели, наконец, зёрна от плевел, а мух - от котлет.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
MerryJane

MerryJane (статус: Посетитель), 17 июня 2011, 14:07 [#13]:

http://i073.radikal.ru/1106/c9/20341217047b.bmp вот как форма выглядит
MerryJane

MerryJane (статус: Посетитель), 17 июня 2011, 14:09 [#14]:

if (v[i]<>v[i+1]) then < вот разные картинки
begin
flag:=false;
MerryJane

MerryJane (статус: Посетитель), 17 июня 2011, 14:10 [#15]:

имена сравнивает у картинок имена записаны в массив
min@y™

min@y™ (статус: Доктор наук), 17 июня 2011, 14:20 [#16]:

Да понял я. Ну пройдись в отладчике по этому циклу и посмотри значения переменных. У тебя там явная ошибка, т.к. до присваивания flag:=false выполнения не доходит, цикл кончается и flag остаётся равным True.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
MerryJane

MerryJane (статус: Посетитель), 17 июня 2011, 14:21 [#17]:

если так значит v заолнен одинаковыми именами)=
MerryJane

MerryJane (статус: Посетитель), 17 июня 2011, 14:26 [#18]:

да действительно v[i] всегда равно v[i+1] а значит что в процедуре imageClick дело)+
MerryJane

MerryJane (статус: Посетитель), 17 июня 2011, 14:29 [#19]:

v[vibor]:=mas[tag]; // imea kartinki
n[vibor]:=tag;

vibor считается а tag всегда ноль.
min@y™

min@y™ (статус: Доктор наук), 17 июня 2011, 14:30 [#20]:

Цитата (MerryJane):

если так значит v заолнен одинаковыми именами)=

Или пустыми строками.

Включу телепатор.
Судя по скриншоту, программа является тренажёром зрительной памяти. Перед игрой все каринки открываются, а юзер должен запомнить, где находятся одинаковые картинки, а потом их последовательно открывать. Одинаковые картинки - это либо 18 пар, либо 12 троек? Выграл, когда последовательно открыл все одинаковые картинки, да? Я правильно понял?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:59
Выполнено за 0.02 сек.