Delphi - Egy egyszerű játék

forráskód letöltése
Mellékelt példában egy egyszerű grafikai játékot hozunk létre. A programban a TDrawGrid komponens felhasználására és Drag and Drop technikára láthatunk példát. A játék lényege abból áll, hogy a számítógép a négy lehetséges színű golyóból véletlenszerűen elrejt négyet és nekünk kell ezt próbálkozással úgy kitalálni, hogy minden próba után annyi segítséget kapunk, hogy hány golyót tettünk jó helyre és hányat rosszra, ebből persze már az is következik, hogy hányat nem találtunk el. Fontos tudni, hogy a gép egy színből többször is választhat!

A bal oldalon elhelyezkedő golyókat kell Drag and Drop-al a kék területre húznunk, majd ha megvan mind a négy, akkor az Ok gombra kattintani.

A megvalósításhoz három TDrawGrid komponenst használunk fel, mindegyik esetben az OnDrawCell esemény segítségével rajzoljuk ki az egyes cellák tartalmát.
A négy golyó képét egy TImageList komponensben tároljuk. Amikor fut az OnDrawCell esemény, akkor ennek segítségével végezzük el a kirajzolást.
procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol,
    ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
  ImageList1.Draw(DrawGrid1.Canvas, Rect.Left, Rect.Top, ARow);
end;
Amikor az egérrel valamelyik golyóra kattintunk, akkor a DrawGrid1 OnMouseMove eseményénél indítjuk el a Drag and Drop-ot. Előtte azonban a MouseToCell hívásával meghatározzuk, hogy melyik golyóra kattintott a felhasználó és ezt tároljuk az FItem globális változóba.
procedure TForm1.DrawGrid1MouseDown(Sender: TObject;
   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  col: integer;
begin
  DrawGrid1.MouseToCell(X, Y, col, FItem);
  DrawGrid1.BeginDrag(true);
end;
A golyót a DrawGrid2-re húzhatjuk és itt is csak annak az első soránál szabad elfogadnunk azt. Ezért ennél a komponensnél a DrawOver eseménynél ellenőrizzük, hogy a Drag and Drop a DrawGrid1-től származik-e és hogy az első sorban áll-e épp az egér.
procedure TForm1.DrawGrid2DragOver(Sender, Source: 
   TObject; X, Y: Integer; State: TDragState;
   var Accept: Boolean);
var
  col, row: integer;
begin
  DrawGrid2.MouseToCell(X, Y, col, row);
  Accept:=(Source is TDrawGrid) and (TDrawGrid(Source).
      Name='DrawGrid1') and (row=0) and (col<4);
end;
Ha fenti feltételnek megfelel a Drag and Drop művelet és a felhasználó elengedi az egér gombját, akkor jön létre az OnDrawDrop esemény. Itt a megfelelő színű golyót eltároljuk egy belső kétdimenziós tömbbe, ahol az összes már áthúzott golyó színét tároltuk és elvégezzük a DrawGrid2 újrarajzolását.
procedure TForm1.DrawGrid2DragDrop(Sender, Source:
     TObject; X, Y: Integer);
var
  col, row: integer;
begin
  DrawGrid2.MouseToCell(X, Y, col, row);
  if FTable[col, row]=-1 then begin
    inc(FCount);
    Label1.Caption:=IntToStr(FCount);
  end;
  FTable[col, row]:=FItem;
  DrawGrid2.Invalidate;
end;