JS+
Усиленный язык сценариев для Windows
с возможностью встраивания
в ваши приложения
О языке JS+ Справочник Скачать JS+ DLL
Контакты
СПРАВОЧНИК ПО ЯЗЫКУ JS+ Содержание

Игра Пятнадцать

- примеры
Примеры на языке JS+
Реализация популярной игры "Пятнадцать" на базе визуальных компонентов TPanel и TGradient с использованием региона WinAPI.
Пример (JS+)
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+Руководство пользователя
Адрес этой страницы: https://jsplus.ru/MANUAL/JSPlus/Example/Fifteen.htm
© 2024-2025,