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, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TfmKorok = class(TForm)
btKilepes: TButton;
btKever: TButton;
Procedure Forgat;
procedure btKilepesClick(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClick(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure btKeverClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TGolyo=Class
Fx, Fy: Integer;
Fc: TColor;
Procedure Init(Ix, Iy: Integer; Ic: TColor);
Procedure Show;
Procedure Hide;
Function GetColor: TColor;
Procedure SetColor(C: TColor);
End;
Const Dx=125;
Dy=130;
Nr=200;
Kr=154;
Vr=120;
Gr=18;
var
fmKorok: TfmKorok;
Xk, Yk, Mx, My: Integer;
GT: Array[1..48] Of TGolyo;
Gk: Array[1..48,1..2] Of Integer;
Vp: Array[1..4,1..2] Of Integer;
Forg: Word;
implementation
{$R *.dfm}
Procedure TGolyo.Init(Ix, Iy: Integer; Ic: TColor);
Begin
Fx:= Ix; Fy:= Iy; Fc:= Ic;
End;
Procedure TGolyo.Show;
Begin
With fmKorok.Canvas Do
Begin
Pen.Color:= Fc;
Brush.Color:= Fc;
Ellipse(Fx-Gr,Fy-Gr, Fx+Gr,Fy+Gr);
End;
End;
Procedure TGolyo.Hide;
Begin
With fmKorok.Canvas Do
Begin
Pen.Color:= clBtnFace;
Brush.Color:= clBtnFace;
Ellipse(Fx-Gr,Fy-Gr, Fx+Gr,Fy+Gr);
End;
End;
Function TGolyo.GetColor: TColor;
Begin
GetColor:= Fc;
End;
Procedure TGolyo.SetColor(C: TColor);
Begin
Hide; Fc:= C; Show;
End;
procedure TfmKorok.btKilepesClick(Sender: TObject);
begin
Close;
end;
procedure TfmKorok.FormCreate(Sender: TObject);
begin
Xk:= ClientWidth Div 2;
Yk:= ClientHeight Div 2;
Randomize;
end;
procedure TfmKorok.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Mx:= X;
My:= Y;
end;
procedure TfmKorok.FormPaint(Sender: TObject);
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+Kr) Div 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(Sender: TObject);
Var I: Word;
begin
For I:= 1 To 300 Do Begin Forg:= Random(4)+1; Forgat End;
end;
procedure TfmKorok.FormClick(Sender: TObject);
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.