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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 4 248

/ вопрос открыт /

Приветствую, уважаемые эксперты!
как сделать проверку в игре пятнашки на выйгрыш???
а точнее подскажите что же я сделал не верно((
>>

Приложение:
  1. var
  2. Form1: TForm1;
  3. game: array[0..15] of TButton;
  4. v,row,d,i,col:integer;
  5.  
  6. implementation
  7.  
  8. {$R *.dfm}
  9.  
  10. procedure TForm1.FormCreate(Sender: TObject);
  11. Var
  12. row,col:integer;
  13. Begin
  14.  
  15. For i:=0 to 15 do
  16. Begin
  17. game[i] := TButton.Create(Pole);
  18. game[i].Parent := Form1;
  19. game[i].Width :=d ; game[i].Height :=d ;
  20. game[i].Font.Style :=pole.Font.Style ;
  21. game[i].Font.Size :=pole.Font.Size ;
  22. game[i].Caption :=inttostr(i);
  23.  
  24.  
  25. game[i].Top :=d*row;
  26. game[i].Left :=d*col;
  27. game[i].OnClick:=GameClick;
  28.  
  29. End;
  30. game[0].Caption :='';
  31. End;
  32.  
  33. procedure TForm1.GameClick(Sender:TObject);
  34. Var
  35. x0,y0,x,y,index:integer;
  36. Begin
  37.  
  38. For i:=0 to 15 do
  39. If game[i].Focused =true Then index:=i;;
  40.  
  41. x0:=game[0].left;
  42. y0:=game[0].Top;
  43.  
  44. x:=game[index].left;
  45. y:=game[index].Top;
  46.  
  47. If (x0=x) and (abs(y-y0)=d) Then
  48. Begin
  49. game[0].Left :=x; game[0].Top:=y;
  50. game[index].Left :=x0; game[index].Top:=y0;
  51. End;
  52.  
  53. If (y0=y) and (abs(x-x0)=d) Then
  54. Begin
  55. game[0].Left :=x; game[0].Top:=y;
  56. game[index].Left :=x0; game[index].Top:=y0;
  57.  
  58. End;
  59. end;
  60.  
  61.  
  62. procedure TForm1.N1Click(Sender: TObject);
  63. begin
  64. randomize ;
  65. For v:=1 to 20 Do
  66. Begin
  67. row:=random(15)+1;
  68. game[row].SetFocus ;
  69. GameClick(game[row]);
  70. End;
  71. timer1.enabled:=true;
  72. end;
  73.  
  74.  
  75.  
  76.  
  77.  
  78. procedure TForm1.Timer1Timer(Sender: TObject);
  79. begin
  80. for i := 0 to 15 do
  81. begin
  82. col:=i div 4;
  83. row:=i Mod 4;
  84.  
  85. if (game[i].Left<>Col*d)Or(game[i].Top<>Row*d)Then Exit;
  86.  
  87.  
  88. timer1.enabled:=False;
  89. end;
  90.  
  91. end.


HEJY Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: HEJY (статус: Посетитель)
Вопрос отправлен: 30 мая 2010, 21:55
Состояние вопроса: открыт, ответов: 0.


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

Всего сообщений: 2; последнее сообщение — 31 мая 2010, 15:00; участников в обсуждении: 2.
Вадим К

Вадим К (статус: Академик), 31 мая 2010, 10:39 [#1]:

Код, хотя и "хитро написанный", но более-менее правдоподобный. Единственное, что я бы не делал - это проверку по таймеру на выиграш. Лучше проверять по факту нажатия кнопки. Начните с того, что поставьте себе резервное мемо и код проверки дополните выводом логирующим - все станет на свои места.
Вот где то так
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  for i := 0 to 15  do begin
    col:=i div 4;
    row:=i Mod 4;
    Memo1.lines.add('i='+inttostr(i)+' col='+nttostr(col)+' row='+inttostr(row));
    if (game[i].Left<>Col*d)Or(game[i].Top<>Row*d)Then Exit;
 
  end;   
  Label1.Caption:='ПОБЕДА!!!';
  timer1.enabled:=False;
end;
Вывести туда нужно (и можно) побольше переменных.
Галочка "подтверждения прочтения" - вселенское зло.
HEJY

HEJY (статус: Посетитель), 31 мая 2010, 15:00 [#2]:

Спасибо помогло)))))))

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

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