06.06.2012, 13:44
|
#1
|
Новичок
Джуниор
Регистрация: 06.06.2012
Сообщений: 2
|
Размер поля в игре Пятнашки
Задание: Сделать игру Пятнашки с размером полей отдельно в меню 3*3,4*4,5*5,6*6,7*7,8*8
Размер поля NXM изменяется в описании констант, N - 1 число, M - последнее, то есть если NXM=4, то M надо менять на 16. Как это все можно сделать под каждый пункт меню, например:
3*3
NXM=3;
N=1;
M=9;
КОД:
Цитата:
unit main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
private
procedure ButClicked(Sender: TObject);
procedure CreatFishkas();
procedure KillOldFihkas();
function position(const x, y: integer): integer;
procedure victopia();
{ Private declarations }
public
{ Public declarations }
end;
type Tfish = TButton; // указываем тип наших фишек, не нравится бутон - укажите другой
const
W = 80; // ширина фишки
D = 10; // растояние между фишками
L = D + W; // растояние между "х" у фишек
NXM = 4; // размер поля 4х4
N = 1; M = 16; // размерность массива фишек
POLET = 10; POLEL = 10; //начальные позиции поля фишек на форме
prefix = 'Fishka';
var
Form1: TForm1;
btn: array[N..M] of Tfish;
sorseAr: array[N..M] of boolean;
zeroX, zeroY: integer;
XYmatrix: array[1..M, 1..2] of integer;
implementation
{$R *.dfm}
//размер формы
procedure FormSize;
begin
Form1.Width := (POLEL * 2) + (L * NXM);
Form1.Height := (L * NXM) + POLET + 50;
end;
procedure TForm1.FormCreate(Sender: TObject);
var i, ty, lx: integer;
begin
randomize; i := 0;
// заполняем массив коорденатами на которые будут случайным образом ставиться
// фишки при начале новой игры
ty := POLET; lx := POLEL;
for i := N to M do begin
XYmatrix[i, 1] := lx;
XYmatrix[i, 2] := ty;
lx := lx + L;
if i mod NXM = 0 then begin
ty := ty + L;
lx := POLEL;
end;
end;
FormSize();
end;
procedure TForm1.FormShow(Sender: TObject);
begin
CreatFishkas();
end;
// клик по пункту меню - "новая игра"
procedure TForm1.N1Click(Sender: TObject);
begin
KillOldFihkas();
FormSize();
CreatFishkas();
end;
{ сбрасывает все элементы массива в true,
массив отвечает за неповторяющиеся порядковые номера фишек
которые выбираются случайным образом
нужно при иницилизации новой игры}
function dump(): boolean;
var i: integer;
begin
i := 0;
for i := N to M do
sorseAr[i] := true; ;
end;
// непосредственно алгоритм выборки неповторяющихся значений случайным образом
function choose(): integer;
var i: integer;
begin
i := 0;
result := random(M) + 1;
while sorseAr[result] = false do
result := random(M) + 1;
sorseAr[result] := false;
end;
procedure TForm1.CreatFishkas;
// НОВАЯ ИГРА, создание игрового поля
var
i, ty, lx, ch: integer;
begin
randomize;
dump();
// But.Enabled:=false; BitBtn1.Enabled:=true; BitBtn2.Enabled:=true;
ty := POLET; lx := POLEL;
for i := N to M do begin
btn[i] := Tfish.Create(Self);
btn[i].Width := W;
btn[i].Height := W;
btn[i].Font.Size := 26;
btn[i].Font.Style := [fsBold];
ch := choose(); // получаем случайным образом число 1-16, числа не повторяются
btn[i].Left := XYmatrix[ch, 1]; // получаем коорденату Х
btn[i].Top := XYmatrix[ch, 2]; // получаем коорденату У
btn[i].Tag := ch; // в Tag будем держать текущее положение фишки
btn[i].Name := prefix + inttostr(i);
if i <> M then begin
btn[i].Caption := inttostr(i);
btn[i].OnClick := ButClicked;
end else begin // это пустая кнопка, без каптион и обработчика OnClick
btn[i].Caption := '';
zeroX := btn[i].Left; zeroY := btn[i].Top;
end;
btn[i].Parent := Self;
end;
end;
|
|
|
|