Rubik körök

 

         Ez a játék két egymásba kapcsolódó körgyűrűt tartalmaz, melyben golyókat (fillezett köröket) találunk. Rendezett állapotban, a baloldaliban piros, a jobboldaliban zöld színűeket. A felső találkozási pontnál zöld színű, az alsónál piros színű golyót látunk, mintha fent a zöld golyókat tartalmazó, alul pedig a piros golyókat tartalmazó gyűrű lenne felül (azaz látható).

 

A két gyűrű közös részén a golyók az egyik gyűrűből a másikba, a golyók görgetése révén átkerülhetnek, így jöhet létre a rendezetlen állapot. A gép a keverés gomb megnyomására 300 véletlen forgatást hajt végre. A programot használónak az a feladata, hogy a rendezett állapotot újra létrehozza.

 

A forgatás egérrel lett megoldva. Az ívelt alakú nyilak végei a vezérlő pontok, a forgatási irányokat a nyilak jelzik. Szerencsés próbálkozást a rendezéshez.

 

A rendezett állapot:

 

 

         Egy kevert állapot:

 

 

         A program listája:

 

unit UKorok;

interface

uses
  Windows, MessagesSysUtilsVariantsClasses,

  GraphicsControlsFormsDialogsStdCtrls;

type
  TfmKorok = class(TForm)
    btKilepesTButton;
    btKeverTButton;
    Procedure Forgat;
    procedure btKilepesClick(SenderTObject);
    procedure FormPaint(SenderTObject);
    procedure FormCreate(SenderTObject);
    procedure FormClick(SenderTObject);
    procedure FormMouseMove(SenderTObjectShiftTShiftState; X,
      Y: Integer);
    procedure btKeverClick(SenderTObject);
  private
    Private declarations }
  public
    Public declarations }
  end;

  TGolyo=Class
    FxFy: Integer;
    FcTColor;
    Procedure Init(IxIy: Integer; IcTColor);
    Procedure Show;
    Procedure Hide;
    Function GetColorTColor;
    Procedure SetColor(C: TColor);
  End;

Const Dx=125;
      Dy=130;
      Nr=200;
      Kr=154;
      Vr=120;
      Gr=18;

var
  fmKorokTfmKorok;
  XkYkMxMy: Integer;
  GT: Array[1..48] Of TGolyo;
  GkArray[1..48,1..2] Of Integer;
  VpArray[1..4,1..2] Of Integer;
  Forg: Word;

implementation

{$R *.dfm}

Procedure TGolyo.Init(IxIy: Integer; IcTColor);
Begin
  Fx:= IxFy:= IyFc:= Ic;
End;

Procedure TGolyo.Show;
Begin
  With fmKorok.Canvas Do
  Begin
    Pen.Color:= Fc;
    Brush.Color:= Fc;
    Ellipse(Fx-Gr,Fy-GrFx+Gr,Fy+Gr);
  End;
End;

Procedure TGolyo.Hide;
Begin
  With fmKorok.Canvas Do
  Begin
    Pen.Color:= clBtnFace;
    Brush.Color:= clBtnFace;
    Ellipse(Fx-Gr,Fy-GrFx+Gr,Fy+Gr);
  End;
End;

Function TGolyo.GetColorTColor;
Begin
  GetColor:= Fc;
End;

Procedure TGolyo.SetColor(C: TColor);
Begin
  HideFc:= C; Show;
End;

procedure TfmKorok.btKilepesClick(SenderTObject);
begin
  Close;
end;

procedure TfmKorok.FormCreate(SenderTObject);
begin
  Xk:= ClientWidth Div 2;
  Yk:= ClientHeight Div 2;
  Randomize;
end;

procedure TfmKorok.FormMouseMove(SenderTObjectShiftTShiftState; X,
  Y: Integer);
begin
  Mx:= X;
  My:= Y;
end;

procedure TfmKorok.FormPaint(SenderTObject);
Var I: Word;
    R: Integer;
begin
  With Canvas Do
  Begin
    With Pen Do
    Begin
      Color:= clWhite;
      Width:= 2;
    End;
    Arc(Xk-Dx-Nr,Yk-Nr,Xk-Dx+NR,Yk+Nr,Xk,Yk,Xk,Yk);
    Arc(Xk+Dx-Nr,Yk-Nr,Xk+Dx+NR,Yk+Nr,Xk,Yk,Xk,Yk);
    Arc(Xk-Dx-Kr,Yk-Kr,Xk-Dx+KR,Yk+Kr,Xk,Yk,Xk,Yk);
    Arc(Xk+Dx-Kr,Yk-Kr,Xk+Dx+KR,Yk+Kr,Xk,Yk,Xk,Yk);
    With Pen Do
    Begin
      Color:= clBlue;
      Width:= 6;
    End;
    Arc(Xk-Dx-Vr,Yk-Vr,Xk-Dx+Vr,Yk+Vr,Xk-Dx-Vr,Yk-Vr,Xk-Dx-Vr,Yk+Vr);
    Vp[1,1]:= Xk-Dx-Vr+35;     //bal -
    Vp[1,2]:= Yk-85;
    MoveTo(Xk-Dx-Vr+35,Yk-85); LineTo(Xk-Dx-Vr+35,Yk-65);
    MoveTo(Xk-Dx-Vr+35,Yk-85); LineTo(Xk-Dx-Vr+15,Yk-80);
    Vp[2,1]:= Xk-Dx-Vr+35;     //bal +
    Vp[2,2]:= Yk+85;
    MoveTo(Xk-Dx-Vr+35,Yk+85); LineTo(Xk-Dx-Vr+35,Yk+65);
    MoveTo(Xk-Dx-Vr+35,Yk+85); LineTo(Xk-Dx-Vr+15,Yk+80);
    Arc(Xk+Dx-Vr,Yk-Vr,Xk+Dx+Vr,Yk+Vr,Xk+Dx+Vr,Yk+Vr,Xk+Dx+Vr,Yk-Vr);
    Vp[3,1]:= Xk+Dx+Vr-35;     //jobb +
    Vp[3,2]:= Yk-85;
    MoveTo(Xk+Dx+Vr-35,Yk-85); LineTo(Xk+Dx+Vr-35,Yk-65);
    MoveTo(Xk+Dx+Vr-35,Yk-85); LineTo(Xk+Dx+Vr-15,Yk-80);
    Vp[4,1]:= Xk+Dx+Vr-35;     //jobb -
    Vp[4,2]:= Yk+85;
    MoveTo(Xk+Dx+Vr-35,Yk+85); LineTo(Xk+Dx+Vr-35,Yk+65);
    MoveTo(Xk+Dx+Vr-35,Yk+85); LineTo(Xk+Dx+Vr-15,Yk+80);
  End;

  For I:= 1 To 48 Do GT[I]:= TGolyo.Create;
  R:= (Nr+KrDiv 2;
  For I:= 1 To 24 Do With GT[I] Do
  Begin
    Gk[I,1]:= Xk-Dx+Round(R*Sin(I*360/24*Pi/180));
    Gk[I,2]:= Yk+Round(R*Cos(I*360/24*Pi/180));
    Init(Gk[I,1],Gk[I,2], clRed);
    If I<>9 Then Show;
  End;
  For I:= 25 To 48 Do With GT[I] Do
  Begin
    Gk[I,1]:= Xk+Dx+Round(R*Sin(I*360/24*Pi/180));
    Gk[I,2]:= Yk+Round(R*Cos(I*360/24*Pi/180));
    Init(Gk[I,1],Gk[I,2], clGreen);
    If I<>45 Then Show;
  End;
end;

procedure TfmKorok.Forgat;
Var I: Word;
    P: TColor;
Begin
  Case Forg Of
    1: Begin
         P:= GT[10].GetColor;
         For I:= 10 To 24 Do GT[I].SetColor(GT[I+1].GetColor);
         GT[24].SetColor(GT[1].GetColor);
         For I:= 1 To 7 Do GT[I].SetColor(GT[I+1].GetColor);
         GT[8].SetColor(GT[39].GetColor);
         GT[39].SetColor(P);
       End;
    2: Begin
         P:= GT[8].GetColor;
         For I:= 8 DownTo 2 Do GT[I].SetColor(GT[I-1].GetColor);
         GT[1].SetColor(GT[24].GetColor);
         For I:= 24 DownTo 11 Do GT[I].SetColor(GT[I-1].GetColor);
         GT[10].SetColor(GT[39].GetColor);
         GT[39].SetColor(P);
       End;
    3: Begin
         P:= GT[44].GetColor;
         For I:= 44 DownTo 26 Do GT[I].SetColor(GT[I-1].GetColor);
         GT[25].SetColor(GT[48].GetColor);
         For I:= 48 DownTo 47 Do GT[I].SetColor(GT[I-1].GetColor);
         GT[46].SetColor(GT[3].GetColor);
         GT[3].SetColor(P);
       End;
    4: Begin
         P:= GT[46].GetColor;
         For I:= 46 To 47 Do GT[I].SetColor(GT[I+1].GetColor);
         GT[48].SetColor(GT[25].GetColor);
         For I:= 25 To 43 Do GT[I].SetColor(GT[I+1].GetColor);
         GT[44].SetColor(GT[3].GetColor);
         GT[3].SetColor(P);
       End;
  End;
End;

procedure TfmKorok.btKeverClick(SenderTObject);
Var I: Word;
begin
  For I:= 1 To 300 Do Begin Forg:= Random(4)+1; Forgat End;
end;

procedure TfmKorok.FormClick(SenderTObject);
Var I: Word;
begin
  Forg:= 0;
  For I:= 1 To 4 Do If Sqrt(Sqr(Vp[I,1]-Mx)+Sqr(Vp[I,2]-My))<16 Then
  Begin Forg:= I; Break End;
  Forgat;
end;

end
.