|
|
Реализация популярной игры "Пятнадцать" на базе визуальных компонентов TPanel и TGradient с использованием региона WinAPI.
var Size=4,Size2=Size*Size; var Cell=new Array(); var Hole=new TPoint(Size-1,Size-1); var clWin=0xB00000.toTColor();
// Главная форма frm=new TForm(); frm.Caption="JS+ - примеры Игра Пятнадцать";
// Фоновая панель bkp=new TPanel(frm); bkp.BorderStyle=bsSingle; bkp.Left=bkp.Top=10; bkp.Font.Size+=2; bkp.Color=getShiftColor(frm.Color,-16);
// Игровое поле dx=dy=80;// Размер ячейки поля for (y=i=0,d1=5,d2=10,Rnd_List=new Array();y<Size;y++) { Cell[y]=new Array(); for (x=0;x<Size;x++,i++) { // Внешняя панель ячейки otp=new TPanel(bkp); otp.BevelOuter=bvRaised; otp.Left=x*dx+x; otp.Top =y*dy+y; otp.Width =dx; otp.Height=dy;
// Внутренняя панель ячейки inp=new TPanel(otp); inp.BevelOuter=bvLowered; inp.SetBounds(d1,d1,w=otp.ClientWidth-d1*2,h=otp.ClientHeight-d1*2);
// Выпуклый градиент на внутренней панели gr1=new TGradient(inp); gr1.Align=alClient; gr1.Style=gsDiagonalLF; gr1.ColorBegin=clWhite; gr1.ColorEnd=clLtGray;
// Панель под круглый регион crp=new TPanel(inp); crp.SetBounds(d2,d2,w-=d2*2,h-=d2*2);
// Круглый регион rgn=CreateEllipticRgn(0,0,w,h); SetWindowRgn(crp.Handle,rgn,true); DeleteObject(rgn);
// Вогнутый градиент на круглой панели gr2=new TGradient(crp); gr2.Align=alClient; gr2.Style=gsDiagonalLF; gr2.ColorBegin=gr1.ColorEnd; gr2.ColorEnd=gr1.ColorBegin;
// Метка на внутренней панели lbl=Cell[y][x]=new TLabel(crp); lbl.AutoSize=false; lbl.Align=alClient; lbl.Alignment=taCenter; lbl.Layout=tlCenter; lbl.cmpTag=new TPoint(x,y); lbl.Font.Size+=2; lbl.OnMouseEnter=lbl_MouseEnter; lbl.OnMouseLeave=lbl_MouseLeave; lbl.OnClick=lbl_Click;
if (i<(Size2-1)) { while ( inArray(Rnd_List,j=Math.round((Size2-2)*Math.random())+1) ); lbl.Caption=""+(Rnd_List[i]=j); } } } otp.Visible=false;
// Подогнать размер формы под размер игрового поля bkp.ClientWidth =dx*Size+(Size-1); bkp.ClientHeight=dy*Size+(Size-1); frm.ClientWidth =bkp.Width+bkp.Left*2; frm.ClientHeight=bkp.Height+bkp.Top*2;
frm.ShowModal();
// Получить цвет ярче/темнее function getShiftColor(clr,shift) { var c;
return RGB( ((c=getRValue(clr)+shift)>255) ? 255 : (c<0) ? 0 : c, ((c=getGValue(clr)+shift)>255) ? 255 : (c<0) ? 0 : c, ((c=getBValue(clr)+shift)>255) ? 255 : (c<0) ? 0 : c); }
// Проверка элемента на вхождение в массив function inArray(in_List,val) { for (i=0,n=in_List.length;i<n;i++) if (in_List[i]==val) return true;
return false; }
// Проверка ячейки на возможность перемещения function isMovable(pnt) { var x,y;
for (x=0,y=pnt.y;x<Size;x++) if ((x==Hole.x) && (y==Hole.y)) return "x";
for (y=0,x=pnt.x;y<Size;y++) if ((x==Hole.x) && (y==Hole.y)) return "y";
return ""; }
// Обработчик события OnClick function lbl_Click(lbl) { var i,x,y,d,n,ok,inp=lbl.Parent.Parent,pnt=lbl.cmpTag;
if (lbl.Cursor!=crHandPoint) return;
inp.Parent.Visible=false; lbl_MouseLeave(lbl);
switch (isMovable(pnt)) { case "x": d=(pnt.x>Hole.x) ? 1 : -1; for (x=Hole.x,y=pnt.y;x!=pnt.x;x+=d) Cell[y][x].Caption=Cell[y][x+d].Caption; break;
case "y": d=(pnt.y>Hole.y) ? 1 : -1; for (y=Hole.y,x=pnt.x;y!=pnt.y;y+=d) Cell[y][x].Caption=Cell[y+d][x].Caption; }
Cell[Hole.y][Hole.x].Parent.Parent.Parent.Visible=true; Hole.x=pnt.x; Hole.y=pnt.y;
// Окончание игры
for (y=0,i=1;y<Size;y++) { n=(y==(Size-1)) ? (Size2-2) : (Size2-1); for (x=0;(x<Size) && (i<n);x++,i++) if (parseInt(Cell[y][x].Caption)!=i) return; }
bkp.Enabled=false;
ok=(parseInt(Cell[y-1][x].Caption)==i) ? true : false; for (y=0;y<Size;y++) for (x=0;x<Size;x++) switch (ok) { case false: Cell[y][x].Font.Color=clGray; break; case true : Cell[y][x].Font.Color=clWin; } }
// Обработчик события OnMouseEnter function lbl_MouseEnter(lbl) { if (isMovable(lbl.cmpTag)=="") return;
lbl.Font.Color=clWin; lbl.Cursor=crHandPoint; }
// Обработчик события OnMouseLeave function lbl_MouseLeave(lbl) { var inp=lbl.Parent;
if (lbl.Cursor!=crHandPoint) return;
lbl.Font.Color=inp.Font.Color; lbl.Cursor=inp.Cursor; }
|
|
JS+ | Руководство пользователя
|
|
|
|
|
|