init
This commit is contained in:
commit
17e7a7bf2c
179
15.pas
Normal file
179
15.pas
Normal file
@ -0,0 +1,179 @@
|
||||
// Игра в 15
|
||||
uses GraphABC,ABCObjects,ABCButtons;
|
||||
|
||||
const
|
||||
/// размер поля
|
||||
n = 4;
|
||||
/// размер фишки
|
||||
sz = 100;
|
||||
/// зазор между фишками
|
||||
zz = 10;
|
||||
/// отступ от левого и правого краев
|
||||
x0 = 20;
|
||||
/// отступ от верхнего и нижнего краев
|
||||
y0 = 20;
|
||||
|
||||
var
|
||||
p: array [1..n,1..n] of SquareABC;
|
||||
digits: array [1..n*n-1] of integer;
|
||||
|
||||
MeshButton: ButtonABC;
|
||||
StatusRect: RectangleABC;
|
||||
|
||||
EmptyCellX,EmptyCellY: integer;
|
||||
MovesCount: integer;
|
||||
EndOfGame: boolean; // True если все фишки стоят на своих местах
|
||||
|
||||
// Поменять местами две фишки
|
||||
procedure Swap(var p,p1: SquareABC);
|
||||
begin
|
||||
PABCSystem.Swap(p,p1);
|
||||
var i := p.Left;
|
||||
p.Left := p1.Left;
|
||||
p1.Left := i;
|
||||
i := p.Top;
|
||||
p.Top := p1.Top;
|
||||
p1.Top := i;
|
||||
end;
|
||||
|
||||
// Определить, являются ли клетки соседями
|
||||
function Sosedi(x1,y1,x2,y2: integer): boolean;
|
||||
begin
|
||||
Result := (abs(x1-x2)=1) and (y1=y2) or (abs(y1-y2)=1) and (x1=x2)
|
||||
end;
|
||||
|
||||
// Заполнить вспомогательный массив цифр
|
||||
procedure FillDigitsArr;
|
||||
begin
|
||||
for var i:=1 to n*n-1 do
|
||||
digits[i] := i;
|
||||
end;
|
||||
|
||||
// Перемешать вспомогательный массив цифр. Количество обменов должно быть четным
|
||||
procedure MeshDigitsArr;
|
||||
var x: integer;
|
||||
begin
|
||||
for var i:=1 to n*n-1 do
|
||||
begin
|
||||
repeat
|
||||
x := Random(15)+1;
|
||||
until x<>i;
|
||||
Swap(digits[i],digits[x]);
|
||||
end;
|
||||
if n mod 2=0 then
|
||||
Swap(digits[1],digits[2]); // количество обменов должно быть четным
|
||||
end;
|
||||
|
||||
// Заполнить двумерный массив фишек. Вместо пустой ячейки - белая фишка с числом 0
|
||||
procedure Fill15ByDigitsArr;
|
||||
begin
|
||||
Swap(p[EmptyCellY,EmptyCellX],p[n,n]); // Переместить пустую фишку в правый нижний угол
|
||||
EmptyCellX := n;
|
||||
EmptyCellY := n;
|
||||
var i := 1;
|
||||
for var y:=1 to n do
|
||||
for var x:=1 to n do
|
||||
begin
|
||||
if x*y=n*n then exit;
|
||||
p[y,x].Number := digits[i];
|
||||
i += 1;
|
||||
end;
|
||||
end;
|
||||
|
||||
// Перемешать массив фишек
|
||||
procedure Mesh15;
|
||||
begin
|
||||
MeshDigitsArr;
|
||||
Fill15ByDigitsArr;
|
||||
MovesCount := 0;
|
||||
EndOfGame := False;
|
||||
StatusRect.Text := 'Количество ходов: '+IntToStr(MovesCount);
|
||||
StatusRect.Color := RGB(200,200,255);
|
||||
end;
|
||||
|
||||
// Создать массив фишек
|
||||
procedure Create15;
|
||||
begin
|
||||
EmptyCellX := n;
|
||||
EmptyCellY := n;
|
||||
for var x:=1 to n do
|
||||
for var y:=1 to n do
|
||||
begin
|
||||
p[y,x] := new SquareABC(x0+(x-1)*(sz+zz),y0+(y-1)*(sz+zz),sz,clMoneyGreen);
|
||||
p[y,x].BorderColor := clGreen;
|
||||
p[y,x].BorderWidth := 2;
|
||||
p[y,x].TextScale := 0.7;
|
||||
end;
|
||||
p[EmptyCellY,EmptyCellX].Color := clWhite;
|
||||
p[EmptyCellY,EmptyCellX].BorderColor := clWhite;
|
||||
FillDigitsArr;
|
||||
MeshDigitsArr;
|
||||
Fill15ByDigitsArr;
|
||||
end;
|
||||
|
||||
// Проверить, все ли фишки стоят на своих местах
|
||||
function IsSolution: boolean;
|
||||
var x,y,i: integer;
|
||||
begin
|
||||
Result:=True;
|
||||
i:=1;
|
||||
for y:=1 to n do
|
||||
for x:=1 to n do
|
||||
begin
|
||||
if p[y,x].Number<>i then
|
||||
begin
|
||||
Result:=False;
|
||||
break;
|
||||
end;
|
||||
Inc(i);
|
||||
if i=n*n then i:=0;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure MouseDown(x,y,mb: integer);
|
||||
begin
|
||||
if EndOfGame then // Если все фишки на своих местах, то не реагировать на мышь и ждать нажатия кнопки "Перемешать"
|
||||
exit;
|
||||
if ObjectUnderPoint(x,y)=nil then // Eсли мы щелкнули не на объекте, то не реагировать на мышь
|
||||
exit;
|
||||
var fx := (x-x0) div (sz+zz) + 1; // Вычислить координаты на доске для ячейки, на которой мы щелкнули мышью
|
||||
var fy := (y-y0) div (sz+zz) + 1;
|
||||
if (fx>n) or (fy>n) then
|
||||
exit;
|
||||
if Sosedi(fx,fy,EmptyCellX,EmptyCellY) then // Если ячейка соседствует с пустой, то поменять их местами
|
||||
begin
|
||||
Swap(p[EmptyCellY,EmptyCellX],p[fy,fx]);
|
||||
EmptyCellX := fx;
|
||||
EmptyCellY := fy;
|
||||
Inc(MovesCount);
|
||||
StatusRect.Text := 'Количество ходов: ' + IntToStr(MovesCount);
|
||||
if IsSolution then
|
||||
begin
|
||||
StatusRect.Text := 'Победа! Сделано ходов: ' + IntToStr(MovesCount);
|
||||
StatusRect.Color := RGB(255,200,200);
|
||||
EndOfGame := True;
|
||||
end
|
||||
end;
|
||||
end;
|
||||
|
||||
begin
|
||||
SetSmoothingOff;
|
||||
Window.Title := 'Игра в 15';
|
||||
Window.IsFixedSize := True;
|
||||
SetWindowSize(2*x0+(sz+zz)*n-zz,2*y0+(sz+zz)*n-zz+90);
|
||||
|
||||
EndOfGame := False;
|
||||
Create15;
|
||||
|
||||
MeshButton := ButtonABC.Create((WindowWidth-200) div 2,2*y0+(sz+zz)*n-zz,200,'Перемешать',clLightGray);
|
||||
MeshButton.OnClick := Mesh15;
|
||||
StatusRect := new RectangleABC(0,WindowHeight-40,WindowWidth,40,RGB(200,200,255));
|
||||
StatusRect.TextVisible := True;
|
||||
StatusRect.Text := 'Количество ходов: '+IntToStr(MovesCount);
|
||||
StatusRect.BorderWidth := 2;
|
||||
StatusRect.BorderColor := RGB(80,80,255);
|
||||
|
||||
MovesCount := 0;
|
||||
|
||||
OnMouseDown := MouseDown;
|
||||
end.
|
96
Animals/Animals.pas
Normal file
96
Animals/Animals.pas
Normal file
@ -0,0 +1,96 @@
|
||||
// Самообучающаяся игра "Угадай животное".
|
||||
// Старайтесь на вопрос "Чем отличается" вводить самый общий ответ
|
||||
// Например: "Чем отличается чиж от ежа" - "Умеет летать"
|
||||
type
|
||||
TNode = class
|
||||
s: string;
|
||||
left,right: TNode;
|
||||
constructor(s: string);
|
||||
begin
|
||||
Self.s := s;
|
||||
left := nil;
|
||||
right := nil;
|
||||
end;
|
||||
end;
|
||||
|
||||
var f: text;
|
||||
|
||||
/// Сохранить дерево в файл
|
||||
procedure SaveToFile(p: TNode);
|
||||
begin
|
||||
if p=nil then
|
||||
begin
|
||||
writeln(f,'');
|
||||
exit
|
||||
end;
|
||||
writeln(f,p.s);
|
||||
SaveToFile(p.left);
|
||||
SaveToFile(p.right);
|
||||
end;
|
||||
|
||||
/// Загрузить дерево из файла
|
||||
function LoadFromFile: TNode;
|
||||
var
|
||||
s: string;
|
||||
p: TNode;
|
||||
begin
|
||||
readln(f,s);
|
||||
if s='' then
|
||||
begin
|
||||
Result := nil;
|
||||
exit
|
||||
end;
|
||||
p := new TNode(s);
|
||||
p.left := LoadFromFile;
|
||||
p.right := LoadFromFile;
|
||||
Result := p;
|
||||
end;
|
||||
|
||||
var
|
||||
p,p1,p2,root: TNode;
|
||||
x: integer;
|
||||
s,q: string;
|
||||
|
||||
begin
|
||||
writeln('Загадайте животное');
|
||||
assign(f, 'animals_data.txt');
|
||||
if not FileExists('animals_data.txt') then
|
||||
root := new TNode('Собака')
|
||||
else
|
||||
begin
|
||||
reset(f);
|
||||
root := loadfromfile;
|
||||
close(f);
|
||||
end;
|
||||
|
||||
p := root;
|
||||
while p.left<>nil do
|
||||
begin
|
||||
write(p.s+'? (0 - Нет, 1 - Да): ');
|
||||
readln(x);
|
||||
if x=1 then
|
||||
p := p.left
|
||||
else
|
||||
p := p.right
|
||||
end;
|
||||
|
||||
write('Это '+p.s+'? (0 - Нет, 1 - Да): ');
|
||||
readln(x);
|
||||
if x=1 then
|
||||
writeln('Я угадала!')
|
||||
else
|
||||
begin
|
||||
write('Я проиграла. Что это за животное? ');
|
||||
readln(s);
|
||||
write('Введите вопрос, отличающий это животное от '+p.s+': ');
|
||||
readln(q);
|
||||
p1 := new TNode(s);
|
||||
p2 := new TNode(p.s);
|
||||
p.s := q;
|
||||
p.left := p1;
|
||||
p.right := p2;
|
||||
end;
|
||||
Rewrite(f);
|
||||
SaveToFile(root);
|
||||
Close(f);
|
||||
end.
|
175
Animals/animals_data.txt
Normal file
175
Animals/animals_data.txt
Normal file
@ -0,0 +1,175 @@
|
||||
Это птица
|
||||
Не летает
|
||||
Домашняя птица
|
||||
Курица
|
||||
|
||||
|
||||
Не имеет перьев
|
||||
Пингвин
|
||||
|
||||
|
||||
Страус
|
||||
|
||||
|
||||
Очень маленькая птица
|
||||
Живет в клетке
|
||||
Попугай
|
||||
|
||||
|
||||
Как яйцо
|
||||
Пингвин
|
||||
|
||||
|
||||
Колибри
|
||||
|
||||
|
||||
Каркает
|
||||
Ворона
|
||||
|
||||
|
||||
Поет
|
||||
Соловей
|
||||
|
||||
|
||||
Дятел
|
||||
|
||||
|
||||
Она мяукает
|
||||
ест людей
|
||||
Пантера
|
||||
|
||||
|
||||
Кошка
|
||||
|
||||
|
||||
Это большое животное
|
||||
Это рыба
|
||||
Не хищное
|
||||
Имеет усы
|
||||
Сом
|
||||
|
||||
|
||||
Дельфин
|
||||
|
||||
|
||||
Акула
|
||||
|
||||
|
||||
Она хрюкает
|
||||
Оно дикое
|
||||
Кабан
|
||||
|
||||
|
||||
Свинья
|
||||
|
||||
|
||||
Это человекообразное
|
||||
Оно разумное
|
||||
Смотрит Аниме
|
||||
Анимешник
|
||||
|
||||
|
||||
человек
|
||||
|
||||
|
||||
Горилла
|
||||
|
||||
|
||||
Ест людей
|
||||
Царь зверей
|
||||
Лев
|
||||
|
||||
|
||||
Имеет шерсть
|
||||
Имеет пятнистую шкуру
|
||||
Пантера
|
||||
|
||||
|
||||
Тигр
|
||||
|
||||
|
||||
Крокодил
|
||||
|
||||
|
||||
Имеет большую пасть
|
||||
Имеет рог на носу
|
||||
Носорог
|
||||
|
||||
|
||||
Длинный нос
|
||||
Слон
|
||||
|
||||
|
||||
Бегемот
|
||||
|
||||
|
||||
Имеет длинную шею
|
||||
Жираф
|
||||
|
||||
|
||||
Дает молоко
|
||||
В китае?
|
||||
Панда
|
||||
|
||||
|
||||
корова
|
||||
|
||||
|
||||
Спит зимой
|
||||
Медведь
|
||||
|
||||
|
||||
Слон
|
||||
|
||||
|
||||
Имеет длинные уши
|
||||
Заяц
|
||||
|
||||
|
||||
Ползает по кухне
|
||||
Ткет паутину
|
||||
Паук
|
||||
|
||||
|
||||
Боится кошки
|
||||
Мышь
|
||||
|
||||
|
||||
Гавкает
|
||||
Собака
|
||||
|
||||
|
||||
Таракан
|
||||
|
||||
|
||||
Живет в лесу
|
||||
Нападает на людей
|
||||
Волк
|
||||
|
||||
|
||||
Лиса
|
||||
|
||||
|
||||
Квакает
|
||||
Лягушка
|
||||
|
||||
|
||||
За ней охотится кошка
|
||||
Мышь
|
||||
|
||||
|
||||
Блеет
|
||||
Козел
|
||||
|
||||
|
||||
Имеет рога
|
||||
Баран
|
||||
|
||||
|
||||
Грызёт всё
|
||||
Хомяк
|
||||
|
||||
|
||||
Собака
|
||||
|
||||
|
318
Battle.pas
Normal file
318
Battle.pas
Normal file
@ -0,0 +1,318 @@
|
||||
uses GraphABC;
|
||||
|
||||
const types = 3; //число типов рыб минус 1
|
||||
rmax = 4; //радиус всех рыб
|
||||
CanEat = rmax; //максимальное расстояние при поедании
|
||||
eps = 0.00001; //необходимо при операциях с данными real
|
||||
epsustupi = 0.1; //насколько значима иерархия среди хищников
|
||||
strahkraj = 3; //во сколько раз жертвы боятся края меньше, чем хищников
|
||||
ustupi = CanEat*10; //насколько значима иерархия среди хищников
|
||||
BkColor = clBlack; //Фон
|
||||
Height = 600; //Высота графического окна
|
||||
Width = 780; //Ширина графического окна
|
||||
xmin = 10; //
|
||||
ymin = 10; //Минимальные и максимальные значения координат,
|
||||
xmax = Width - 100; //которые могут принимать рыбы
|
||||
ymax = Height - 140; //
|
||||
|
||||
Type
|
||||
fishtype = class //Описание одной стаи
|
||||
c : color;
|
||||
public
|
||||
CanRazm, MaxKol, Kol, MaxLife, MinFood: integer;
|
||||
//цвет, размножение, макс. кол-во, текущее кол-во, макс. жизнь,
|
||||
//сколько хищнику нужно есть для размножения
|
||||
Speed, See: real; //Нормальная скорость и зрение в пикселях
|
||||
constructor create(ac:color; aCanRazm, aMaxKol, aMaxLife, aMinFood:integer; aSpeed, aSee: real);
|
||||
begin
|
||||
c:= ac; CanRazm:= aCanRazm; MaxKol:= aMaxKol; Kol:= 1;
|
||||
MaxLife:= aMaxLife; MinFood:= aMinFood; Speed:= aSpeed; See:= aSee
|
||||
end;
|
||||
procedure ShowKol(y: integer); //отобразить текущее кол-во
|
||||
var s: string;
|
||||
begin
|
||||
SetFontColor(c);
|
||||
TextOut(xmax + 20, y, ' ');
|
||||
s := IntToStr(kol);
|
||||
TextOut(xmax + 20, y, s);
|
||||
end;
|
||||
end;
|
||||
|
||||
var opisanie: array[0..types] of fishtype; //данные для всех стай
|
||||
|
||||
Type
|
||||
fish = class
|
||||
x, y, r, dx0, dy0: real; //текущие координаты, радиус и предыдущий шаг
|
||||
tip, life, razm, status, food: integer;
|
||||
//razm - время с момента последнего размножения,
|
||||
//status - состояние - спокойное или возбуждённое
|
||||
next, prev: fish; //двусвязный циклический список
|
||||
constructor Create(ax, ay, ar: real; atip: integer; aprev, anext: fish);
|
||||
begin
|
||||
x:= ax; y:= ay; r:= ar; tip:= atip; prev:= aprev; next:= anext;
|
||||
life:= 0; razm:= 0; dx0:= random; dy0:= random; status:= 1; food:= 0;
|
||||
end;
|
||||
procedure show;
|
||||
begin
|
||||
SetPenColor(opisanie[tip].c);
|
||||
circle(round(x), round(y), round(r))
|
||||
end;
|
||||
procedure hide;
|
||||
begin
|
||||
SetPenColor(BkColor);
|
||||
circle(round(x), round(y), round(r))
|
||||
end;
|
||||
procedure Destroy;
|
||||
begin
|
||||
hide;
|
||||
opisanie[tip].kol:= opisanie[tip].kol - 1;
|
||||
opisanie[tip].ShowKol(tip*40 + 20);
|
||||
end;
|
||||
procedure moveto(dx, dy: real);
|
||||
begin
|
||||
hide;
|
||||
x:= x + dx; y:= y + dy;
|
||||
if x > xmax then x:= xmax;
|
||||
if x < xmin then x:= xmin;
|
||||
if y > ymax then y:= ymax;
|
||||
if y < ymin then y:= ymin;
|
||||
show
|
||||
end;
|
||||
|
||||
procedure MakeDeti(var mama, StartAkula, KonAkula, StartKilka, KonKilka : fish);
|
||||
//произвести потомство
|
||||
var d: fish;
|
||||
begin
|
||||
razm:= 0;
|
||||
food:= 0;
|
||||
d:= fish.create(x, y, r, tip, mama, next);
|
||||
next.prev:= d;
|
||||
next:= d;
|
||||
if mama = KonAkula then KonAkula:= d;
|
||||
if mama = KonKilka then KonKilka:= d;
|
||||
opisanie[tip].kol:= opisanie[tip].kol + 1;
|
||||
opisanie[tip].ShowKol(tip*40 + 20);
|
||||
end;
|
||||
|
||||
procedure step(var ribka, StartAkula, KonAkula, StartKilka, KonKilka : fish);
|
||||
//Здесь алгоритмы для рыб
|
||||
var
|
||||
dx, dy, d, dx2, dy2, dmin: real;
|
||||
t, trup, found: fish;
|
||||
FoundOhot: boolean;
|
||||
begin
|
||||
status:= 1; //Нормальное состояние
|
||||
dx:= 0; dy:= 0;
|
||||
if tip > 0 then
|
||||
begin //Начало алгоритма для жертв
|
||||
t:= StartAkula;
|
||||
if t<>nil then
|
||||
repeat //Ищем всех хищников в поле видимости
|
||||
d:= sqrt((x - t.x)*(x - t.x) + (y - t.y)*(y - t.y));
|
||||
if d < opisanie[tip].See then
|
||||
begin
|
||||
if d < eps then d:= eps;
|
||||
dx2:= (x - t.x)/(d*d);
|
||||
dy2:= (y - t.y)/(d*d);
|
||||
dx:= dx + dx2;
|
||||
dy:= dy + dy2;
|
||||
status:= 2; //Возбуждённое состояние
|
||||
end;
|
||||
t:= t.next
|
||||
until t = KonAkula.next;
|
||||
//И обратим внимание на края:
|
||||
if x - xmin < opisanie[tip].See then dx:= dx + 1/((x - xmin + eps)*strahkraj);
|
||||
if xmax - x < opisanie[tip].See then dx:= dx + 1/((x - xmax - eps)*strahkraj);
|
||||
if y - ymin < opisanie[tip].See then dy:= dy + 1/((y - ymin + eps)*strahkraj);
|
||||
if ymax - y < opisanie[tip].See then dy:= dy + 1/((y - ymax - eps)*strahkraj);
|
||||
d:= sqrt(dx*dx + dy*dy);
|
||||
if d < eps then
|
||||
begin
|
||||
dx:= 2*status*random()*opisanie[tip].Speed - status*opisanie[tip].Speed;
|
||||
dy:= 2*status*random()*opisanie[tip].Speed - status*opisanie[tip].Speed
|
||||
end
|
||||
else
|
||||
begin
|
||||
dx:= status*opisanie[tip].Speed*dx/d;
|
||||
dy:= status*opisanie[tip].Speed*dy/d
|
||||
end
|
||||
end
|
||||
else {tip = 0}
|
||||
begin //Начало алгоритма для хищников
|
||||
dmin:= 11000;
|
||||
t:= StartAkula;
|
||||
while t<>ribka do //Проверяем всех выше по иерархии
|
||||
begin
|
||||
|
||||
d:= sqrt((x - t.x)*(x - t.x) + (y - t.y)*(y - t.y));
|
||||
if (d < dmin) and (abs(dx0 - t.dx0) < epsustupi) and
|
||||
(abs(dy0 - t.dy0) < epsustupi) then dmin:= d;
|
||||
|
||||
t:= t.next
|
||||
end;
|
||||
FoundOhot:= dmin < ustupi;
|
||||
dmin:= 11000;
|
||||
found:= nil;
|
||||
t:= StartKilka;
|
||||
if (t<>nil) and (life > 100) and not FoundOhot then
|
||||
repeat
|
||||
|
||||
d:= sqrt((x - t.x)*(x - t.x) + (y - t.y)*(y - t.y));
|
||||
if d < dmin then
|
||||
begin
|
||||
dmin:= d;
|
||||
found:= t //found - ближайшая жертва
|
||||
end;
|
||||
t:= t.next
|
||||
until t = KonKilka.next;
|
||||
if (found <> nil) and (dmin < opisanie[tip].See) then
|
||||
begin
|
||||
status:= 2; //Возбуждённое состояние
|
||||
dx:= found.x - x;
|
||||
dy:= found.y - y;
|
||||
if dmin < CanEat + status*opisanie[tip].Speed then
|
||||
begin //Поедание
|
||||
found.next.prev:= found.prev;
|
||||
found.prev.next:= found.next;
|
||||
if (found = StartKilka) and (found = KonKilka) then
|
||||
begin
|
||||
//StartKilka:= nil;
|
||||
//KonKilka:= nil
|
||||
end;
|
||||
if found = StartKilka then
|
||||
StartKilka:= StartKilka.next;
|
||||
if found = KonKilka then
|
||||
KonKilka:= KonKilka.prev;
|
||||
found.destroy;
|
||||
found := nil;
|
||||
food:= food + 1
|
||||
end
|
||||
end
|
||||
else
|
||||
if (x <= xmin) or (x >= xmax) or (y <= ymin) or (y >= ymax) then
|
||||
begin
|
||||
dx:= 2*status*random()*opisanie[tip].Speed - status*opisanie[tip].Speed;
|
||||
dy:= 2*status*random()*opisanie[tip].Speed - status*opisanie[tip].Speed
|
||||
end
|
||||
else
|
||||
begin
|
||||
dx:= dx0; dy:= dy0 //Повтор предыдущего шага - патрулирование
|
||||
end;
|
||||
d:= sqrt(dx*dx + dy*dy);
|
||||
if d > eps then
|
||||
begin
|
||||
dx:= status*opisanie[tip].Speed*dx/d;
|
||||
dy:= status*opisanie[tip].Speed*dy/d;
|
||||
end
|
||||
end;
|
||||
//Начало алгоритма для всех рыб
|
||||
moveto(dx, dy);
|
||||
dx0:= dx; dy0:= dy;
|
||||
life:= life + 1; razm:= razm + 1;
|
||||
if opisanie[tip].Kol >= opisanie[tip].MaxKol then Razm:= 0;
|
||||
if (razm > opisanie[tip].CanRazm) and (food >= opisanie[tip].minfood) then
|
||||
MakeDeti(ribka, StartAkula, KonAkula, StartKilka, KonKilka);
|
||||
if life > opisanie[tip].MaxLife then //Смерть от старости
|
||||
begin
|
||||
trup:= ribka; ribka:= ribka.prev;
|
||||
trup.next.prev:= trup.prev;
|
||||
trup.prev.next:= trup.next;
|
||||
if trup = StartKilka then
|
||||
StartKilka:= StartKilka.next;
|
||||
if trup = KonKilka then
|
||||
KonKilka:= KonKilka.prev;
|
||||
if trup = StartAkula then
|
||||
StartAkula:= StartAkula.next;
|
||||
if trup = KonAkula then
|
||||
KonAkula:= KonAkula.prev;
|
||||
if trup = trup.next then ribka:= nil;
|
||||
if trup <> nil then
|
||||
trup.destroy;
|
||||
trup := nil;
|
||||
end
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
function getAllCount:integer;
|
||||
var i,c:integer;
|
||||
begin
|
||||
c:=0;
|
||||
for i:=0 to types do
|
||||
c:=c+opisanie[i].Kol;
|
||||
getAllCount:=c;
|
||||
end;
|
||||
|
||||
var i: integer;
|
||||
p, q, StartAkula, StartKilka, KonAkula, KonKilka, tek: fish;
|
||||
|
||||
begin
|
||||
SetSmoothing(False);
|
||||
SetWindowSize(Width, Height);
|
||||
SetWindowLeft(200);
|
||||
SetWindowTop(50);
|
||||
SetWindowCaption('Битва за жизнь');
|
||||
SetFontSize(7);
|
||||
SetFontName('Arial');
|
||||
SetBrushColor(BkColor);
|
||||
FillRectangle(0, 0, Width, Height);
|
||||
SetFontColor(clWhite);
|
||||
TextOut(10, ymax + 20, 'Автор программы - Иванов С.О. e-mail: ssyy@yandex.ru');
|
||||
TextOut(10, ymax + 20+1*18, 'Программа моделирует поведение нескольких стай рыб. Справа - количества рыб в текущий');
|
||||
TextOut(10, ymax + 20+2*18, 'момент времени. Изменяя параметры в коде программы, можно влиять на ход битвы.');
|
||||
TextOut(10, ymax + 20+3*18, 'По умолчанию: красные - хищники, поедают любых рыб из других стай, не плодятся,');
|
||||
TextOut(10, ymax + 20+4*18, 'пока не поели; синие - жертвы, самые медленные, но быстрее всех плодятся; зелёные - жертвы,');
|
||||
TextOut(10, ymax + 20+5*18, 'быстрее синих, но плодятся медленнее; желтые - самые быстрые среди жертв, но желтых мало.');
|
||||
SetFontSize(12);
|
||||
StartAkula:= nil;
|
||||
StartKilka:= nil;
|
||||
KonAkula:= nil;
|
||||
KonKilka:= nil;
|
||||
|
||||
//c - цвет.
|
||||
//CanRazm - минимальное количество ходов отдельно взятой рыбы между двумя
|
||||
// её последовательными размножениями.
|
||||
//MaxKol - максимально допустимое количество рыб данного вида.
|
||||
//Kol - количество рыб данного вида в текущий момент времени.
|
||||
//MaxLife - максимальная продолжительность жизни.
|
||||
// После того, как рыба сделает больше шагов, чем это число, она умирает.
|
||||
//MinFood - минимальное количество съеденных жертв, необходимое для размножения
|
||||
// (только для хищников; для жертв это количество принято за -1).
|
||||
//Speed - нормальная скорость. Максимальная скорость рыбы в 2 раза больше этого числа.
|
||||
//See - радиус обзора - как далеко видит рыба.
|
||||
|
||||
//c, CanRazm, MaxKol, MaxLife, MinFood, Speed, See
|
||||
opisanie[3]:= fishtype.create(clYellow, 300, 15, 1500, -1, 0.99, 50);
|
||||
opisanie[2]:= fishtype.create(clGreen, 150, 50, 1500, -1, 0.9, 50);
|
||||
opisanie[1]:= fishtype.create(clBlue, 30, 50, 500, -1, 0.7, 35);
|
||||
opisanie[0]:= fishtype.create(clRed, 1000, 40, 5000, 1, 1, 500);
|
||||
SetPenColor(clWhite);
|
||||
rectangle(round(xmin - rmax - 1), round(ymin - rmax - 1),
|
||||
round(xmax + rmax + 1), round(ymax + rmax + 1));
|
||||
//Теперь нужно построить первоначальный список
|
||||
q:= fish.create(xmin + 10, ymax - 10, rmax, 0, nil, nil);
|
||||
p:= fish.create(xmin + 10, ymin + 10, rmax, 1, q, q);
|
||||
q.next:= p; q.prev:= p;
|
||||
StartAkula:= q; KonAkula:= q;
|
||||
StartKilka:= p; KonKilka:= p;
|
||||
p:= fish.create(xmax - 10, ymin + 10, rmax, 2, KonKilka, StartAkula);
|
||||
StartAkula.prev:= p;
|
||||
KonKilka.next:= p; KonKilka:= p;
|
||||
p:= fish.create(xmax - 10, ymax - 10, rmax, 3, KonKilka, StartAkula);
|
||||
StartAkula.prev:= p;
|
||||
KonKilka.next:= p; KonKilka:= p;
|
||||
for i:= 0 to types do opisanie[i].ShowKol(i*40 + 20);
|
||||
//И все ходят по очереди, пока хоть кто-то жив.
|
||||
tek:= StartKilka;
|
||||
//i:=0;c:=getallcount;LockDrawing;
|
||||
repeat
|
||||
tek:= tek.next;
|
||||
tek.step(tek, StartAkula, KonAkula, StartKilka, KonKilka);
|
||||
{i:=i+1;
|
||||
if i>=c then begin
|
||||
i:=0;c:=getallcount;
|
||||
Redraw;
|
||||
end;}
|
||||
until (tek = nil);
|
||||
|
||||
end.
|
228
BookWorm/BookWormABCNET.pas
Normal file
228
BookWorm/BookWormABCNET.pas
Normal file
@ -0,0 +1,228 @@
|
||||
uses GraphABC,ABCObjects,ABCButtons,Events;
|
||||
|
||||
const
|
||||
/// Примерная частота повторяемости букв
|
||||
freqcharstr='аааааааааааааааааааааааааабббббввввввввггггдддддддееееееееееееееееееееежжззззииииииииииииииииииийккккккккккккккклллллллллллммммммнннннннннннннннннооооооооооооооооооооооооппппппппрррррррррррррррррссссссссссссстттттттттттттттууууууффххцццчччшшщыыьььььэюяяяя';
|
||||
|
||||
const
|
||||
MaxWordLen = 12;
|
||||
scorehits: array [1..MaxWordLen] of integer = (0,1,2,4,7,11,16,22,29,37,46,56);
|
||||
|
||||
type
|
||||
MySquareABC = class(SquareABC) end;
|
||||
|
||||
var
|
||||
/// Доска с буквами
|
||||
MainBoard: ObjectBoardABC;
|
||||
/// Доска высоты 1 для размещения слова
|
||||
WordBoard: ObjectBoardABC;
|
||||
/// Номер первого незанятого символа на доске WordBoard
|
||||
cur: integer;
|
||||
/// Количество ходов
|
||||
moves: integer;
|
||||
/// Очки
|
||||
score: integer;
|
||||
/// Прямоугольник для отображения информации
|
||||
Status: RectangleABC;
|
||||
|
||||
/// Существует ли такое слово (все слова хранятся в файле words.txt)
|
||||
function WordExists(s: string): boolean;
|
||||
var
|
||||
f: text;
|
||||
str: string;
|
||||
begin
|
||||
s := LowerCase(s);
|
||||
Result := False;
|
||||
assign(f,'words.txt');
|
||||
reset(f);
|
||||
while not eof(f) do
|
||||
begin
|
||||
readln(f,str);
|
||||
if s=str then
|
||||
begin
|
||||
Result := True;
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
close(f);
|
||||
end;
|
||||
|
||||
procedure MyMouseDown(x,y,mb: integer);
|
||||
begin
|
||||
// Нажата левая мышь
|
||||
if mb=1 then
|
||||
begin
|
||||
if cur>WordBoard.DimX then
|
||||
exit;
|
||||
var ob := ObjectUnderPoint(x,y);
|
||||
if (ob is MySquareABC) and ob.Visible then
|
||||
begin
|
||||
var ob1 := WordBoard[cur,1];
|
||||
ob1.Visible := True;
|
||||
ob1.Text := ob.Text;
|
||||
Inc(cur);
|
||||
ob.Visible := False;
|
||||
var s := '';
|
||||
for var i:=1 to cur-1 do
|
||||
s := s + WordBoard[i,1].Text;
|
||||
if WordExists(s) then
|
||||
WordBoard.Color := clYellow
|
||||
else WordBoard.Color := clSkyBlue
|
||||
end;
|
||||
end
|
||||
else
|
||||
// Нажата правая мышь
|
||||
begin
|
||||
for var xx:=1 to cur-1 do
|
||||
WordBoard[xx,1].Visible := False;
|
||||
for var xx:=1 to MainBoard.DimX do
|
||||
for var yy:=1 to MainBoard.DimY do
|
||||
MainBoard[xx,yy].Visible:=True;
|
||||
cur := 1;
|
||||
WordBoard.Color := clSkyBlue
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Обработчик кнопки "Новая игра"
|
||||
procedure BtNewClick;
|
||||
begin
|
||||
score := 0;
|
||||
moves := 0;
|
||||
Status.Text := 'Ходов: '+IntToStr(moves)+' Очков: '+IntToStr(score);
|
||||
MyMouseDown(1,1,2);
|
||||
for var xx:=1 to MainBoard.DimX do
|
||||
for var yy:=1 to MainBoard.DimY do
|
||||
MainBoard[xx,yy].Text := UpCase(freqcharstr[Random(255)+1]);
|
||||
end;
|
||||
|
||||
/// Обработчик кнопки "Сказать слово"
|
||||
procedure BtWordClick;
|
||||
begin
|
||||
if WordBoard.Color<>clYellow then
|
||||
exit;
|
||||
Inc(score,scorehits[cur-1]);
|
||||
Inc(moves);
|
||||
for var xx:=1 to cur-1 do
|
||||
WordBoard[xx,1].Visible:=False;
|
||||
for var xx:=1 to MainBoard.DimX do
|
||||
for var yy:=1 to MainBoard.DimY do
|
||||
if not MainBoard[xx,yy].Visible then
|
||||
begin
|
||||
MainBoard[xx,yy].Visible:=True;
|
||||
MainBoard[xx,yy].Text:=UpCase(freqcharstr[Random(255)+1]);
|
||||
end;
|
||||
cur := 1;
|
||||
WordBoard.Color := clSkyBlue;
|
||||
Status.Text := 'Ходов: '+IntToStr(moves)+' Очков: '+IntToStr(score);
|
||||
end;
|
||||
|
||||
/// Обработчик кнопки "Подсказка"
|
||||
procedure BtPleaseClick;
|
||||
var
|
||||
f: text;
|
||||
str,maxstr: string;
|
||||
arr,work: array ['а'..'я'] of integer;
|
||||
maxlen: integer;
|
||||
|
||||
function CanConstructWord(s: string): boolean;
|
||||
begin
|
||||
work := arr;
|
||||
Result := True;
|
||||
for var i:=1 to Length(s) do
|
||||
begin
|
||||
Dec(work[s[i]]);
|
||||
if work[s[i]]<0 then
|
||||
begin
|
||||
Result := False;
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
begin // BtPleaseClick
|
||||
maxlen := 0;
|
||||
maxstr := '';
|
||||
for var c:='а' to 'я' do
|
||||
arr[c]:=0;
|
||||
|
||||
for var xx:=1 to MainBoard.DimX do
|
||||
for var yy:=1 to MainBoard.DimY do
|
||||
Inc(arr[LowCase(MainBoard[xx,yy].Text[1])]);
|
||||
|
||||
assign(f,'words.txt');
|
||||
reset(f);
|
||||
while not eof(f) do
|
||||
begin
|
||||
readln(f,str);
|
||||
if CanConstructWord(str) and (Length(str)>maxlen) and (Length(str)<=MaxWordLen) then
|
||||
begin
|
||||
maxlen := Length(str);
|
||||
maxstr := str;
|
||||
end;
|
||||
end;
|
||||
close(f);
|
||||
|
||||
writeln(maxstr);
|
||||
end;
|
||||
|
||||
procedure InitWindow;
|
||||
begin
|
||||
SetWindowSize(640,480);
|
||||
Window.IsFixedSize := True;
|
||||
Window.Title := 'Знай русские слова!';
|
||||
Brush.Color := clMoneyGreen;
|
||||
FillRect(0,0,WindowWidth,WindowHeight);
|
||||
end;
|
||||
|
||||
procedure InitGameVars;
|
||||
begin
|
||||
cur := 1;
|
||||
moves := 0;
|
||||
score := 0;
|
||||
end;
|
||||
|
||||
procedure InitButtons;
|
||||
begin
|
||||
var btword := new ButtonABC(70,410,180,30,'Сказать слово',clGray);
|
||||
var btnew := new ButtonABC(280,410,100,30,'Заново',clLightGray);
|
||||
var btplease := new ButtonABC(410,410,160,30,'Подсказка',clGray);
|
||||
|
||||
// Привязка обработчиков к кнопкам
|
||||
btword.OnClick := BtWordClick;
|
||||
btnew.OnClick := BtNewClick;
|
||||
btplease.OnClick := BtPleaseClick;
|
||||
end;
|
||||
|
||||
|
||||
procedure InitInterface;
|
||||
begin
|
||||
Status := new RectangleABC(70,350,500,30,clSkyBlue);
|
||||
Status.Text := 'Ходов: 0 Очков: 0';
|
||||
WordBoard := new ObjectBoardABC(20,40,MaxWordLen,1,50,50,clSkyBlue);
|
||||
MainBoard := new ObjectBoardABC(220,120,4,4,50,50,clMoneyGreen);
|
||||
MainBoard.BorderColor := clGreen;
|
||||
//MainBoard.Bordered := False;
|
||||
|
||||
for var x:=1 to WordBoard.DimX do
|
||||
begin
|
||||
WordBoard[x,1] := new SquareABC(0,0,WordBoard.CellSizeX-6,clWhite);
|
||||
WordBoard[x,1].Visible := False;
|
||||
end;
|
||||
for var x:=1 to MainBoard.DimX do
|
||||
for var y:=1 to MainBoard.DimY do
|
||||
begin
|
||||
MainBoard[x,y] := new MySquareABC(0,0,MainBoard.CellSizeX-6,clWhite);
|
||||
MainBoard[x,y].Text := UpCase(freqcharstr[Random(freqcharstr.Length)+1]);
|
||||
end;
|
||||
end;
|
||||
|
||||
begin
|
||||
SetConsoleIO;
|
||||
|
||||
InitWindow;
|
||||
InitGameVars;
|
||||
InitInterface;
|
||||
InitButtons;
|
||||
|
||||
OnMouseDown := MyMouseDown;
|
||||
end.
|
14842
BookWorm/words.txt
Normal file
14842
BookWorm/words.txt
Normal file
File diff suppressed because it is too large
Load Diff
3110
Chess3D/bishop.obj
Normal file
3110
Chess3D/bishop.obj
Normal file
File diff suppressed because it is too large
Load Diff
164
Chess3D/board.obj
Normal file
164
Chess3D/board.obj
Normal file
@ -0,0 +1,164 @@
|
||||
# Blender3D v245 OBJ File: chess2.blend
|
||||
# www.blender3d.org
|
||||
v -6.000000 6.000000 0.000000
|
||||
v -8.000000 6.000000 0.000000
|
||||
v -8.000001 8.000000 0.000000
|
||||
v -6.000000 7.999999 0.000000
|
||||
v -6.000000 3.999999 0.000000
|
||||
v -8.000000 3.999999 0.000000
|
||||
v -8.000000 1.999999 0.000000
|
||||
v -6.000000 2.000000 0.000000
|
||||
v -6.000000 -2.000000 0.000000
|
||||
v -8.000000 -2.000001 0.000000
|
||||
v -8.000000 -0.000001 0.000000
|
||||
v -6.000000 -0.000001 0.000000
|
||||
v -5.999999 -4.000001 0.000000
|
||||
v -8.000000 -4.000000 0.000000
|
||||
v -8.000000 -6.000000 0.000000
|
||||
v -6.000000 -6.000000 0.000000
|
||||
v -3.999999 -8.000000 0.000000
|
||||
v -6.000000 -8.000000 0.000000
|
||||
v -6.000000 -6.000000 0.000000
|
||||
v -3.999999 -6.000001 0.000000
|
||||
v -3.999999 -2.000001 0.000000
|
||||
v -6.000000 -2.000000 0.000000
|
||||
v -6.000000 -4.000000 0.000000
|
||||
v -4.000000 -4.000000 0.000000
|
||||
v -4.000000 -0.000000 0.000000
|
||||
v -6.000000 -0.000000 0.000000
|
||||
v -6.000000 2.000000 0.000000
|
||||
v -4.000000 1.999999 0.000000
|
||||
v -4.000000 5.999999 0.000000
|
||||
v -6.000000 6.000000 0.000000
|
||||
v -6.000000 4.000000 0.000000
|
||||
v -4.000000 4.000000 0.000000
|
||||
v -0.000000 4.000000 0.000000
|
||||
v -2.000000 4.000000 0.000000
|
||||
v -2.000000 6.000000 0.000000
|
||||
v 0.000000 6.000000 0.000000
|
||||
v 0.000000 2.000000 0.000000
|
||||
v -2.000000 2.000000 0.000000
|
||||
v -2.000000 -0.000000 0.000000
|
||||
v 0.000000 0.000000 0.000000
|
||||
v 0.000000 -4.000000 0.000000
|
||||
v -2.000000 -4.000000 0.000000
|
||||
v -2.000000 -2.000000 0.000000
|
||||
v 0.000001 -2.000000 0.000000
|
||||
v 0.000001 -6.000000 0.000000
|
||||
v -2.000000 -6.000000 0.000000
|
||||
v -1.999999 -8.000000 0.000000
|
||||
v 0.000001 -8.000000 0.000000
|
||||
v -2.000000 -6.000000 0.000000
|
||||
v -4.000000 -6.000000 0.000000
|
||||
v -4.000000 -4.000000 0.000000
|
||||
v -1.999999 -4.000000 0.000000
|
||||
v -2.000000 -0.000001 0.000000
|
||||
v -4.000000 -0.000000 0.000000
|
||||
v -4.000000 -2.000000 0.000000
|
||||
v -2.000000 -2.000000 0.000000
|
||||
v -2.000000 2.000000 0.000000
|
||||
v -4.000000 2.000000 0.000000
|
||||
v -4.000000 4.000000 0.000000
|
||||
v -2.000000 3.999999 0.000000
|
||||
v -2.000000 8.000000 0.000000
|
||||
v -4.000000 8.000000 0.000000
|
||||
v -4.000000 6.000000 0.000000
|
||||
v -2.000000 6.000000 0.000000
|
||||
v 6.000000 6.000000 0.000000
|
||||
v 4.000000 6.000000 0.000000
|
||||
v 3.999999 8.000000 0.000000
|
||||
v 6.000000 8.000000 0.000000
|
||||
v 6.000000 4.000000 0.000000
|
||||
v 4.000000 4.000000 0.000000
|
||||
v 4.000000 2.000000 0.000000
|
||||
v 6.000000 2.000000 0.000000
|
||||
v 6.000000 -2.000000 0.000000
|
||||
v 4.000000 -2.000000 0.000000
|
||||
v 4.000000 0.000000 0.000000
|
||||
v 6.000000 -0.000000 0.000000
|
||||
v 6.000001 -4.000000 0.000000
|
||||
v 4.000000 -4.000000 0.000000
|
||||
v 4.000000 -6.000000 0.000000
|
||||
v 6.000000 -6.000000 0.000000
|
||||
v 8.000001 -8.000000 0.000000
|
||||
v 6.000000 -8.000000 0.000000
|
||||
v 6.000000 -6.000000 0.000000
|
||||
v 8.000000 -6.000000 0.000000
|
||||
v 8.000000 -2.000000 0.000000
|
||||
v 6.000000 -2.000000 0.000000
|
||||
v 6.000000 -4.000000 0.000000
|
||||
v 8.000000 -3.999999 0.000000
|
||||
v 8.000000 0.000001 0.000000
|
||||
v 6.000000 0.000000 0.000000
|
||||
v 6.000000 2.000000 0.000000
|
||||
v 8.000000 2.000000 0.000000
|
||||
v 8.000000 6.000000 0.000000
|
||||
v 6.000000 6.000000 0.000000
|
||||
v 6.000000 4.000000 0.000000
|
||||
v 8.000000 4.000000 0.000000
|
||||
v 4.000000 4.000000 0.000000
|
||||
v 2.000000 4.000000 0.000000
|
||||
v 2.000000 6.000000 0.000000
|
||||
v 4.000000 6.000000 0.000000
|
||||
v 4.000000 2.000000 0.000000
|
||||
v 2.000000 2.000000 0.000000
|
||||
v 2.000000 0.000000 0.000000
|
||||
v 4.000000 0.000000 0.000000
|
||||
v 4.000000 -4.000000 0.000000
|
||||
v 2.000000 -4.000000 0.000000
|
||||
v 2.000000 -2.000000 0.000000
|
||||
v 4.000000 -2.000000 0.000000
|
||||
v 4.000001 -6.000000 0.000000
|
||||
v 2.000000 -6.000000 0.000000
|
||||
v 2.000001 -8.000000 0.000000
|
||||
v 4.000000 -8.000000 0.000000
|
||||
v 2.000000 -6.000000 0.000000
|
||||
v 0.000000 -6.000000 0.000000
|
||||
v 0.000000 -4.000000 0.000000
|
||||
v 2.000001 -4.000000 0.000000
|
||||
v 2.000000 -0.000000 0.000000
|
||||
v 0.000000 0.000000 0.000000
|
||||
v 0.000000 -2.000000 0.000000
|
||||
v 2.000000 -2.000000 0.000000
|
||||
v 2.000000 2.000000 0.000000
|
||||
v -0.000000 2.000000 0.000000
|
||||
v -0.000000 4.000000 0.000000
|
||||
v 2.000000 4.000000 0.000000
|
||||
v 2.000000 8.000000 0.000000
|
||||
v -0.000001 8.000000 0.000000
|
||||
v -0.000000 6.000000 0.000000
|
||||
v 2.000000 6.000000 0.000000
|
||||
usemtl Material.001
|
||||
s off
|
||||
f 1 4 3 2
|
||||
f 6 7 8 5
|
||||
f 11 10 9 12
|
||||
f 14 15 16 13
|
||||
f 30 31 32 29
|
||||
f 27 26 25 28
|
||||
f 22 23 24 21
|
||||
f 19 18 17 20
|
||||
f 62 63 64 61
|
||||
f 59 58 57 60
|
||||
f 54 55 56 53
|
||||
f 51 50 49 52
|
||||
f 35 34 33 36
|
||||
f 38 39 40 37
|
||||
f 43 42 41 44
|
||||
f 46 47 48 45
|
||||
f 126 127 128 125
|
||||
f 123 122 121 124
|
||||
f 118 119 120 117
|
||||
f 115 114 113 116
|
||||
f 99 98 97 100
|
||||
f 102 103 104 101
|
||||
f 107 106 105 108
|
||||
f 110 111 112 109
|
||||
f 67 66 65 68
|
||||
f 70 71 72 69
|
||||
f 75 74 73 76
|
||||
f 78 79 80 77
|
||||
f 94 95 96 93
|
||||
f 91 90 89 92
|
||||
f 86 87 88 85
|
||||
f 83 82 81 84
|
181
Chess3D/game2.pas
Normal file
181
Chess3D/game2.pas
Normal file
@ -0,0 +1,181 @@
|
||||
uses Graph3D;
|
||||
|
||||
type
|
||||
FigureColor = (Black,White);
|
||||
FigureKind = (BishopK, HorseK, KingK, PownK, QueenK, RockK);
|
||||
|
||||
var
|
||||
BlackC := GrayColor(60);
|
||||
WhiteC := Colors.White;
|
||||
delay := 1000;
|
||||
|
||||
type ChessFigure = class
|
||||
f: FileModelT;
|
||||
public
|
||||
color: FigureColor;
|
||||
k: FigureKind;
|
||||
x,y: integer;
|
||||
constructor Create(kk: FigureKind; cc: FigureColor);
|
||||
function MoveTo(xx,yy: integer): ChessFigure;
|
||||
function AnimMoveTo(xx,yy: integer): ChessFigure;
|
||||
procedure Destroy;
|
||||
begin
|
||||
f.Destroy;
|
||||
end;
|
||||
end;
|
||||
|
||||
var a := new ChessFigure[8,8];
|
||||
|
||||
constructor ChessFigure.Create(kk: FigureKind; cc: FigureColor);
|
||||
begin
|
||||
color := cc;
|
||||
var c := cc=Black ? BlackC : WhiteC;
|
||||
case kk of
|
||||
bishopK: f := FileModel3D(4,14,0,'bishop.obj',c);
|
||||
horseK : f := FileModel3D(2,14,0,'horse.obj',c);
|
||||
kingK : f := FileModel3D(6,14,0,'king.obj',c);
|
||||
pownK : f := FileModel3D(0,12,0,'pawn.obj',c);
|
||||
queenK : f := FileModel3D(8,14,0,'queen.obj',c);
|
||||
rockK : f := FileModel3D(0,14,0,'rook.obj',c);
|
||||
end;
|
||||
k := kk;
|
||||
end;
|
||||
|
||||
function ChessFigure.MoveTo(xx,yy: integer): ChessFigure;
|
||||
begin
|
||||
a[y,x] := nil;
|
||||
if a[yy,xx]<>nil then
|
||||
a[yy,xx].Destroy;
|
||||
a[yy,xx] := Self;
|
||||
var dx := xx - x;
|
||||
var dy := yy - y;
|
||||
f.MoveOn(-dx*2,-dy*2,0);
|
||||
(x,y) := (xx,yy);
|
||||
Result := Self;
|
||||
end;
|
||||
|
||||
function ChessFigure.AnimMoveTo(xx,yy: integer): ChessFigure;
|
||||
begin
|
||||
var dx := xx - x;
|
||||
var dy := yy - y;
|
||||
f.AnimMoveOn(-dx*2,-dy*2,0,delay/1000).WhenCompleted(procedure -> begin
|
||||
a[y,x] := nil;
|
||||
if a[yy,xx]<>nil then
|
||||
a[yy,xx].Destroy;
|
||||
a[yy,xx] := Self;
|
||||
end
|
||||
).Begin;
|
||||
(x,y) := (xx,yy);
|
||||
Result := Self;
|
||||
end;
|
||||
|
||||
function Bishop(x,y: integer; c: FigureColor) := ChessFigure.Create(FigureKind.BishopK,c).MoveTo(x,y);
|
||||
function Horse(x,y: integer; c: FigureColor) := ChessFigure.Create(FigureKind.HorseK,c).MoveTo(x,y);
|
||||
function King(x,y: integer; c: FigureColor) := ChessFigure.Create(FigureKind.KingK,c).MoveTo(x,y);
|
||||
function Queen(x,y: integer; c: FigureColor) := ChessFigure.Create(FigureKind.QueenK,c).MoveTo(x,y);
|
||||
function Rock(x,y: integer; c: FigureColor) := ChessFigure.Create(FigureKind.RockK,c).MoveTo(x,y);
|
||||
function Pown(x,y: integer; c: FigureColor) := ChessFigure.Create(FigureKind.PownK,c).MoveTo(x,y);
|
||||
|
||||
procedure InitScene;
|
||||
begin
|
||||
var d := 7;
|
||||
for var c := 'A' to 'H' do
|
||||
begin
|
||||
var t := Text3D(d,8.5,0,c,0.5);
|
||||
t.UpDirection := v3d(0,-1,0);
|
||||
d -= 2;
|
||||
end;
|
||||
d := 7;
|
||||
for var c := '1' to '8' do
|
||||
begin
|
||||
var t := Text3D(8.3,d,0,c,0.5);
|
||||
t.UpDirection := v3d(0,-1,0);
|
||||
d -= 2;
|
||||
end;
|
||||
View3D.ShowGridLines := False;
|
||||
FileModel3D(0,0,0,'board.obj',GrayColor(100));
|
||||
end;
|
||||
|
||||
procedure StartupPosition;
|
||||
begin
|
||||
Rock(0,0,White);
|
||||
Horse(1,0,White);
|
||||
Bishop(2,0,White);
|
||||
King(3,0,White);
|
||||
Queen(4,0,White);
|
||||
Bishop(5,0,White);
|
||||
Horse(6,0,White);
|
||||
Rock(7,0,White);
|
||||
for var i:=0 to 7 do
|
||||
Pown(i,1,White);
|
||||
|
||||
Rock(0,7,Black);
|
||||
Horse(1,7,Black);
|
||||
Bishop(2,7,Black);
|
||||
King(3,7,Black);
|
||||
Queen(4,7,Black);
|
||||
Bishop(5,7,Black);
|
||||
Horse(6,7,Black);
|
||||
Rock(7,7,Black);
|
||||
for var i:=0 to 7 do
|
||||
Pown(i,6,Black);
|
||||
end;
|
||||
|
||||
procedure Turn(x,y,x1,y1: integer);
|
||||
begin
|
||||
if a[y,x]=nil then
|
||||
begin
|
||||
Println('>',y,x);
|
||||
exit;
|
||||
end;
|
||||
|
||||
//Print(a[y,x],a[y1,x1]);
|
||||
a[y,x].AnimMoveTo(x1,y1);
|
||||
|
||||
//Println('->',a[y,x],a[y1,x1]);
|
||||
Sleep(delay);
|
||||
end;
|
||||
|
||||
procedure TurnB(s1,s2: string);
|
||||
begin
|
||||
//Println(s1,s2);
|
||||
Turn(Ord(s1[1])-Ord('a'),s1[2].ToDigit-1,Ord(s2[1])-Ord('a'),s2[2].ToDigit-1);
|
||||
end;
|
||||
|
||||
procedure Turns(s: string);
|
||||
begin
|
||||
var ss := s.ToWords.Batch(3).SelectMany(d->d.ToArray[1:]);
|
||||
var i := 0;
|
||||
foreach var d in ss do
|
||||
begin
|
||||
var p := Pos('-',d);
|
||||
var p1 := d[:p];
|
||||
if Length(p1)=3 then
|
||||
p1 := p1[2:];
|
||||
var p2 := d[p+1:];
|
||||
if Length(p2)=3 then
|
||||
p2 := p2[2:];
|
||||
if (p1 = '0') and (p2 = '0') then
|
||||
begin
|
||||
if i mod 2 = 0 then
|
||||
begin
|
||||
TurnB('e1','g1');
|
||||
TurnB('h1','f1');
|
||||
end
|
||||
else
|
||||
begin
|
||||
TurnB('e8','g8');
|
||||
TurnB('h8','f8');
|
||||
end
|
||||
end
|
||||
else TurnB(p1,p2);
|
||||
i += 1;
|
||||
end;
|
||||
end;
|
||||
|
||||
begin
|
||||
InitScene;
|
||||
StartupPosition;
|
||||
//Turns('1. c2-c4 g7-g6 2. e2-e4 Cf8-g7 3. d2-d4 d7-d6 4. Kb1-c3 Kg8-f6 5. Kg1-f3 0-0 6. Cf1-e2 e7-e5 7. Cc1-e3 Kf6-g4 8. Ce3-g5 f7-f6 9. Cg5-h4 g6-g5 10. Ch4-g3 Kg4-h6');
|
||||
Turns('1. e2-e4 e7-e5 2. f1-c4 g8-f6 3. d2-d4 e5-d4 4. g1-f3 d7-d5 5. e4-d5 f8-b4 6. c2-c3 d8-e7');
|
||||
end.
|
2557
Chess3D/horse.obj
Normal file
2557
Chess3D/horse.obj
Normal file
File diff suppressed because it is too large
Load Diff
1463
Chess3D/king.obj
Normal file
1463
Chess3D/king.obj
Normal file
File diff suppressed because it is too large
Load Diff
2406
Chess3D/pawn.obj
Normal file
2406
Chess3D/pawn.obj
Normal file
File diff suppressed because it is too large
Load Diff
2214
Chess3D/queen.obj
Normal file
2214
Chess3D/queen.obj
Normal file
File diff suppressed because it is too large
Load Diff
1542
Chess3D/rook.obj
Normal file
1542
Chess3D/rook.obj
Normal file
File diff suppressed because it is too large
Load Diff
56
DeleteByMouse.pas
Normal file
56
DeleteByMouse.pas
Normal file
@ -0,0 +1,56 @@
|
||||
uses ABCObjects,GraphABC;
|
||||
|
||||
const CountSquares = 20;
|
||||
|
||||
var
|
||||
/// Текущая цифра
|
||||
CurrentDigit: integer;
|
||||
/// Количество ошибок
|
||||
Mistakes: integer;
|
||||
/// Строка информации
|
||||
StatusRect: RectangleABC;
|
||||
|
||||
/// Вывод информационной строки
|
||||
procedure DrawStatusText;
|
||||
begin
|
||||
if CurrentDigit<=CountSquares then
|
||||
StatusRect.Text := 'Удалено квадратов: ' + IntToStr(CurrentDigit-1) + ' Ошибок: ' + IntToStr(Mistakes)
|
||||
else StatusRect.Text := 'Игра окончена. Время: ' + IntToStr(Milliseconds div 1000) + ' с. Ошибок: ' + IntToStr(Mistakes);
|
||||
end;
|
||||
|
||||
/// Обработчик события мыши
|
||||
procedure MyMouseDown(x,y,mb: integer);
|
||||
begin
|
||||
var ob := ObjectUnderPoint(x,y);
|
||||
if (ob<>nil) and (ob is RectangleABC) then
|
||||
if ob.Number=CurrentDigit then
|
||||
begin
|
||||
ob.Destroy;
|
||||
Inc(CurrentDigit);
|
||||
DrawStatusText;
|
||||
end
|
||||
else
|
||||
begin
|
||||
ob.Color := clRed;
|
||||
Inc(Mistakes);
|
||||
DrawStatusText;
|
||||
end;
|
||||
end;
|
||||
|
||||
begin
|
||||
Window.Title := 'Игра: удали все квадраты по порядку';
|
||||
Window.IsFixedSize := True;
|
||||
for var i:=1 to CountSquares do
|
||||
begin
|
||||
var x := Random(WindowWidth-50);
|
||||
var y := Random(WindowHeight-100);
|
||||
var ob := RectangleABC.Create(x,y,50,50,clMoneyGreen);
|
||||
ob.Number := i;
|
||||
end;
|
||||
StatusRect := RectangleABC.Create(0,Window.Height-40,Window.Width,40,Color.LightSteelBlue);
|
||||
CurrentDigit := 1;
|
||||
Mistakes := 0;
|
||||
DrawStatusText;
|
||||
// Установка обработчиков
|
||||
OnMouseDown := MyMouseDown;
|
||||
end.
|
238
KillThem.pas
Normal file
238
KillThem.pas
Normal file
@ -0,0 +1,238 @@
|
||||
uses ABCObjects,GraphABC,Timers;
|
||||
|
||||
const
|
||||
clPlayer = Color.BurlyWood;
|
||||
|
||||
var
|
||||
kLeftKey,kRightKey: boolean;
|
||||
kSpaceKey: integer;
|
||||
/// Игрок
|
||||
Player: RectangleABC;
|
||||
/// Таймер движения врагов
|
||||
t: Timer;
|
||||
/// Флаг конца игры
|
||||
EndOfGame: boolean;
|
||||
/// Количество неигровых объектов
|
||||
StaticObjectsCount: integer;
|
||||
/// Счетчик выигрышей
|
||||
Wins: integer;
|
||||
/// Счетчик проигрышей
|
||||
Falls: integer;
|
||||
/// Информационная строка
|
||||
InfoString: RectangleABC;
|
||||
/// Сообщение в начале игры
|
||||
NewGame: RoundRectABC;
|
||||
|
||||
type
|
||||
KeysType = (kLeft,kRight);
|
||||
|
||||
/// Класс пули
|
||||
Pulya = class(CircleABC)
|
||||
public
|
||||
constructor Create(x,y: integer);
|
||||
procedure Move; override;
|
||||
end;
|
||||
|
||||
/// Класс врага
|
||||
Enemy = class(RectangleABC)
|
||||
public
|
||||
constructor Create(x,y,w: integer);
|
||||
procedure Move; override;
|
||||
end;
|
||||
|
||||
constructor Pulya.Create(x,y: integer);
|
||||
begin
|
||||
inherited Create(x,y,5,clRed);
|
||||
dx := 0;
|
||||
dy := -5;
|
||||
end;
|
||||
|
||||
procedure Pulya.Move;
|
||||
begin
|
||||
inherited Move;
|
||||
if Top<0 then
|
||||
Visible := False;
|
||||
for var j:=StaticObjectsCount to Objects.Count-1 do
|
||||
// При столкновении пуля и объект становятся невидимыми
|
||||
if (Objects[j]<>Self) and Intersect(Objects[j]) then
|
||||
begin
|
||||
Objects[j].Visible := False;
|
||||
Visible := False;
|
||||
end;
|
||||
end;
|
||||
|
||||
constructor Enemy.Create(x,y,w: integer);
|
||||
begin
|
||||
inherited Create(x,y,w,20,clRandom);
|
||||
if Random(2)=0 then
|
||||
dx := 5
|
||||
else dx := -5;
|
||||
dy := 0;
|
||||
end;
|
||||
|
||||
procedure Enemy.Move;
|
||||
begin
|
||||
if Random(2)<>0 then
|
||||
Exit;
|
||||
if Random(10)=0 then
|
||||
dy := 5;
|
||||
if (Left<0) or (Left+Width>Window.Width) or (Random(30)=0) then
|
||||
dx := -dx;
|
||||
inherited Move;
|
||||
if dy<>0 then
|
||||
dy := 0;
|
||||
if Top>Window.Height-50 then
|
||||
EndOfGame := True;
|
||||
end;
|
||||
|
||||
/// Количество врагов
|
||||
function NumberOfEnemies: integer;
|
||||
begin
|
||||
Result := 0;
|
||||
for var i:=0 to Objects.Count-1 do
|
||||
if Objects[i] is Enemy then
|
||||
Result += 1;
|
||||
end;
|
||||
|
||||
/// Создание игрока и врагов
|
||||
procedure CreateObjects;
|
||||
begin
|
||||
Player := new RectangleABC(280,WindowHeight-30,100,20,clPlayer);
|
||||
for var i:=1 to 100 do
|
||||
begin
|
||||
var r1 := new Enemy(Random(WindowWidth-50),40+Random(10),50);
|
||||
r1.TextVisible := True;
|
||||
r1.Number := i;
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Разрушение игрока и врагов
|
||||
procedure DestroyObjects;
|
||||
begin
|
||||
for var i:=Objects.Count-1 downto StaticObjectsCount do
|
||||
Objects[i].Destroy;
|
||||
end;
|
||||
|
||||
/// Перемещение врагов
|
||||
procedure MoveObjects;
|
||||
begin
|
||||
for var i:=StaticObjectsCount+1 to Objects.Count-1 do
|
||||
Objects[i].Move;
|
||||
end;
|
||||
|
||||
/// Удаление уничтоженных объектов
|
||||
procedure DestroyKilledObjects;
|
||||
begin
|
||||
for var i:=ObjectsCount-1 downto StaticObjectsCount+1 do
|
||||
if not Objects[i].Visible then
|
||||
Objects[i].Destroy;
|
||||
end;
|
||||
|
||||
/// Обработчик нажатия клавиши
|
||||
procedure KeyDown(Key: integer);
|
||||
begin
|
||||
case Key of
|
||||
vk_Left: kLeftKey := True;
|
||||
vk_Right: kRightKey := True;
|
||||
vk_Space: if kSpaceKey=2 then kSpaceKey := 1;
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Обработчик отжатия клавиши
|
||||
procedure KeyUp(Key: integer);
|
||||
begin
|
||||
case Key of
|
||||
vk_Left: kLeftKey := False;
|
||||
vk_Right: kRightKey := False;
|
||||
vk_Space: kSpaceKey := 2;
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Изменение информационной строки
|
||||
procedure ChangeInfoString;
|
||||
begin
|
||||
InfoString.Text := 'Врагов: '+IntToStr(NumberOfEnemies)+' Побед: '+IntToStr(Wins)+' Поражений: '+IntToStr(Falls);
|
||||
end;
|
||||
|
||||
/// Обработчик нажатия символьной клавиши
|
||||
procedure KeyPress(Key: char);
|
||||
begin
|
||||
if (Key in ['G','П','g','п']) and EndOfGame then
|
||||
begin
|
||||
NewGame.Visible := False;
|
||||
EndOfGame := False;
|
||||
t.Start;
|
||||
CreateObjects;
|
||||
kSpaceKey := 2;
|
||||
kLeftKey := False;
|
||||
kRightKey := False;
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Обработчик отжатия мыши
|
||||
procedure MouseUp(x,y,mb: integer);
|
||||
begin
|
||||
if NewGame.PTInside(x,y) then
|
||||
KeyPress('G');
|
||||
end;
|
||||
|
||||
/// Обработчик таймера
|
||||
procedure TimerProc;
|
||||
begin
|
||||
if kLeftKey and (Player.Left>0) then
|
||||
Player.MoveOn(-10,0);
|
||||
if kRightKey and (Player.Left+Player.Width<WindowWidth) then
|
||||
Player.MoveOn(10,0);
|
||||
if kSpaceKey=1 then
|
||||
begin
|
||||
new Pulya(Player.Left+Player.Width div 2,Player.Top-10);
|
||||
kSpaceKey := 0;
|
||||
end;
|
||||
MoveObjects;
|
||||
DestroyKilledObjects;
|
||||
RedrawObjects;
|
||||
ChangeInfoString;
|
||||
var n := NumberOfEnemies;
|
||||
// Страховка от случая, когда процедура таймера выполняется одновременно в нескольких потоках
|
||||
if n=0 then
|
||||
EndOfGame := True;
|
||||
if EndOfGame then
|
||||
begin
|
||||
if t.Enabled=False then Exit;
|
||||
t.Stop;
|
||||
if n>0 then
|
||||
Falls += 1
|
||||
else Wins += 1;
|
||||
NewGame.Visible := True;
|
||||
DestroyObjects;
|
||||
ChangeInfoString;
|
||||
RedrawObjects;
|
||||
end;
|
||||
end;
|
||||
|
||||
begin
|
||||
Window.Title := 'Стрелялка';
|
||||
Window.IsFixedSize := True;
|
||||
ClearWindow(clBlack);
|
||||
LockDrawingObjects;
|
||||
EndOfGame := True;
|
||||
InfoString := new RectangleABC(0,0,Window.Width,38,Color.DarkBlue);
|
||||
InfoString.Bordered := False;
|
||||
InfoString.FontColor := clWhite;
|
||||
InfoString.TextScale := 0.9;
|
||||
|
||||
var zz := 100;
|
||||
NewGame := new RoundRectABC(zz,200,400,200,30,Color.Violet);
|
||||
NewGame.Center := Window.Center;
|
||||
NewGame.Text := 'G - Новая игра';
|
||||
StaticObjectsCount := Objects.Count;
|
||||
ChangeInfoString;
|
||||
RedrawObjects;
|
||||
|
||||
OnKeyDown := KeyDown;
|
||||
OnKeyPress := KeyPress;
|
||||
OnKeyUp := KeyUp;
|
||||
OnMouseUp := MouseUp;
|
||||
|
||||
t := new Timer(1,TimerProc);
|
||||
end.
|
318
Life.pas
Normal file
318
Life.pas
Normal file
@ -0,0 +1,318 @@
|
||||
// Игра "Жизнь" на торе
|
||||
// Оптимизация хешированием по равномерной сетке
|
||||
uses GraphABC;
|
||||
|
||||
const
|
||||
/// Ширина клетки
|
||||
w = 4;
|
||||
/// Количество клеток по ширине
|
||||
m = 300;
|
||||
/// Количество клеток по высоте
|
||||
n = 220;
|
||||
/// Отступ поля от левой границы окна
|
||||
x0 = 1;
|
||||
/// Отступ поля от верхней границы окна
|
||||
y0 = 21;
|
||||
mm = m + 1;
|
||||
nn = n + 1;
|
||||
/// Количество клеток сетки по горизонтали
|
||||
mk = 15;
|
||||
/// Количество клеток сетки по вертикали
|
||||
nk = 10;
|
||||
|
||||
var
|
||||
a,b,sosedia,sosedib: array [0..nn,0..mm] of byte;
|
||||
obnovA,obnovB: array [1..nk,1..mk] of boolean;
|
||||
CountCells: integer;
|
||||
obn: boolean;
|
||||
gen: integer;
|
||||
hn,hm: integer;
|
||||
|
||||
/// Нарисовать ячейку
|
||||
procedure DrawCell(i,j: integer);
|
||||
begin
|
||||
DrawInBuffer := False;
|
||||
SetBrushColor(clBlack);
|
||||
FillRectangle(x0+(j-1)*w,y0+(i-1)*w,x0+j*w-1,y0+i*w-1);
|
||||
DrawInBuffer := True;
|
||||
end;
|
||||
|
||||
/// Стереть ячейку
|
||||
procedure ClearCell(i,j: integer);
|
||||
begin
|
||||
DrawInBuffer := False;
|
||||
SetBrushColor(clWhite);
|
||||
FillRectangle(x0+(j-1)*w,y0+(i-1)*w,x0+j*w-1,y0+i*w-1);
|
||||
DrawInBuffer := True;
|
||||
end;
|
||||
|
||||
/// Нарисовать все изменившиеся ячейки
|
||||
procedure DrawConfiguration;
|
||||
begin
|
||||
for var i:=1 to n do
|
||||
for var j:=1 to m do
|
||||
begin
|
||||
var bb := b[i,j];
|
||||
if a[i,j]<>bb then
|
||||
if bb=1 then DrawCell(i,j)
|
||||
else ClearCell(i,j);
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Нарисовать все ячейки
|
||||
procedure DrawConfigurationFull;
|
||||
begin
|
||||
for var i:=1 to n do
|
||||
for var j:=1 to m do
|
||||
if b[i,j]=1 then DrawCell(i,j)
|
||||
else ClearCell(i,j);
|
||||
end;
|
||||
|
||||
/// Нарисовать поле
|
||||
procedure DrawField;
|
||||
begin
|
||||
Pen.Color := clLightGray;
|
||||
for var i:=0 to m do
|
||||
begin
|
||||
if i mod hm = 0 then
|
||||
Pen.Color := clGray
|
||||
else Pen.Color := clLightGray;
|
||||
Line(x0+i*w-1,y0,x0+i*w-1,y0+n*w);
|
||||
end;
|
||||
for var i:=0 to n do
|
||||
begin
|
||||
if i mod hn = 0 then
|
||||
Pen.Color := clGray
|
||||
else Pen.Color := clLightGray;
|
||||
Line(x0,y0+i*w-1,x0+m*w,y0+i*w-1);
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Увеличить массив соседей для данной клетки
|
||||
procedure IncSosedi(i,j: integer);
|
||||
var i1,i2,j1,j2: integer;
|
||||
begin
|
||||
if i=1 then i1:=n else i1:=i-1;
|
||||
if i=n then i2:=1 else i2:=i+1;
|
||||
if j=1 then j1:=m else j1:=j-1;
|
||||
if j=m then j2:=1 else j2:=j+1;
|
||||
SosediB[i1,j1] += 1;
|
||||
SosediB[i1,j] += 1;
|
||||
SosediB[i1,j2] += 1;
|
||||
SosediB[i,j1] += 1;
|
||||
SosediB[i,j2] += 1;
|
||||
SosediB[i2,j1] += 1;
|
||||
SosediB[i2,j] += 1;
|
||||
SosediB[i2,j2] += 1;
|
||||
end;
|
||||
|
||||
/// Уменьшить массив соседей для данной клетки
|
||||
procedure DecSosedi(i,j: integer);
|
||||
var i1,i2,j1,j2: integer;
|
||||
begin
|
||||
if i=1 then i1:=n else i1:=i-1;
|
||||
if i=n then i2:=1 else i2:=i+1;
|
||||
if j=1 then j1:=m else j1:=j-1;
|
||||
if j=m then j2:=1 else j2:=j+1;
|
||||
SosediB[i1,j1] -= 1;
|
||||
SosediB[i1,j] -= 1;
|
||||
SosediB[i1,j2] -= 1;
|
||||
SosediB[i,j1] -= 1;
|
||||
SosediB[i,j2] -= 1;
|
||||
SosediB[i2,j1] -= 1;
|
||||
SosediB[i2,j] -= 1;
|
||||
SosediB[i2,j2] -= 1;
|
||||
end;
|
||||
|
||||
/// Поставить ячейку в клетку (i,j)
|
||||
procedure SetCell(i,j: integer);
|
||||
begin
|
||||
if b[i,j]=0 then
|
||||
begin
|
||||
b[i,j] := 1;
|
||||
obn := True;
|
||||
IncSosedi(i,j);
|
||||
end;
|
||||
CountCells += 1;
|
||||
end;
|
||||
|
||||
/// Убрать ячейку из клетки (i,j)
|
||||
procedure UnSetCell(i,j: integer);
|
||||
begin
|
||||
if b[i,j]=1 then
|
||||
begin
|
||||
b[i,j] := 0;
|
||||
obn := True;
|
||||
DecSosedi(i,j);
|
||||
end;
|
||||
CountCells -= 1;
|
||||
end;
|
||||
|
||||
/// Инициализировать массивы и конфигурацию поля
|
||||
procedure Init;
|
||||
var
|
||||
xc := n div 2;
|
||||
yc := m div 2;
|
||||
begin
|
||||
for var i:=0 to n+1 do
|
||||
for var j:=0 to m+1 do
|
||||
b[i,j] := 0;
|
||||
a := b;
|
||||
SosediB := b;
|
||||
SosediA := SosediB;
|
||||
for var ik:=1 to nk do
|
||||
for var jk:=1 to mk do
|
||||
obnovB[ik,jk] := True;
|
||||
obnovA := obnovB;
|
||||
CountCells := 0;
|
||||
|
||||
SetCell(xc,yc);
|
||||
SetCell(xc,yc+1);
|
||||
SetCell(xc,yc+2);
|
||||
SetCell(xc-1,yc+2);
|
||||
SetCell(xc+1,yc+1);
|
||||
end;
|
||||
|
||||
/// Обработать ячейку
|
||||
procedure ProcessCell(i,j: integer);
|
||||
begin
|
||||
case SosediA[i,j] of
|
||||
0..1,4..9:
|
||||
if b[i,j]=1 then
|
||||
begin
|
||||
b[i,j] := 0;
|
||||
obn := True;
|
||||
DecSosedi(i,j);
|
||||
ClearCell(i,j);
|
||||
Dec(CountCells);
|
||||
end;
|
||||
3: if b[i,j]=0 then
|
||||
begin
|
||||
b[i,j] := 1;
|
||||
obn := True;
|
||||
IncSosedi(i,j);
|
||||
DrawCell(i,j);
|
||||
Inc(CountCells);
|
||||
end;
|
||||
end; {case}
|
||||
end;
|
||||
|
||||
/// Перейти к следующему поколению
|
||||
procedure NextGen;
|
||||
begin
|
||||
for var ik:=1 to nk do
|
||||
begin
|
||||
for var jk:=1 to mk do
|
||||
begin
|
||||
obn := False;
|
||||
var ifirst := (ik-1)*hn+1;
|
||||
var ilast := (ik-1)*hn+hn;
|
||||
var jfirst := (jk-1)*hm+1;
|
||||
var jlast := (jk-1)*hm+hm;
|
||||
if obnovA[ik,jk] then
|
||||
begin
|
||||
for var i:=ifirst to ilast do
|
||||
for var j:=jfirst to jlast do
|
||||
ProcessCell(i,j);
|
||||
end
|
||||
else
|
||||
begin
|
||||
var ik1,jk1,ik2,jk2: integer;
|
||||
if ik=1 then ik1:=nk else ik1:=ik-1;
|
||||
if ik=nk then ik2:=1 else ik2:=ik+1;
|
||||
if jk=1 then jk1:=mk else jk1:=jk-1;
|
||||
if jk=mk then jk2:=1 else jk2:=jk+1;
|
||||
var l := obnovA[ik,jk1];
|
||||
var r := obnovA[ik,jk2];
|
||||
var u := obnovA[ik1,jk];
|
||||
var d := obnovA[ik2,jk];
|
||||
var lu := obnovA[ik1,jk1];
|
||||
var ld := obnovA[ik2,jk1];
|
||||
var ru := obnovA[ik1,jk2];
|
||||
var rd := obnovA[ik2,jk2];
|
||||
if u then
|
||||
for var j:=jfirst+1 to jlast-1 do
|
||||
ProcessCell(ifirst,j);
|
||||
if d then
|
||||
for var j:=jfirst+1 to jlast-1 do
|
||||
ProcessCell(ilast,j);
|
||||
if l then
|
||||
for var i:=ifirst+1 to ilast-1 do
|
||||
ProcessCell(i,jfirst);
|
||||
if r then
|
||||
for var i:=ifirst+1 to ilast-1 do
|
||||
ProcessCell(i,jlast);
|
||||
if u or l or lu then
|
||||
ProcessCell(ifirst,jfirst);
|
||||
if u or r or ru then
|
||||
ProcessCell(ifirst,jlast);
|
||||
if d or l or ld then
|
||||
ProcessCell(ilast,jfirst);
|
||||
if d or r or rd then
|
||||
ProcessCell(ilast,jlast);
|
||||
end;
|
||||
obnovB[ik,jk] := obn;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Перерисовка содержимого окна
|
||||
procedure LifeRedrawProc;
|
||||
begin
|
||||
Redraw;
|
||||
DrawConfigurationFull;
|
||||
end;
|
||||
|
||||
/// Вывод номера поколения и количества ячеек
|
||||
procedure DrawInfo;
|
||||
begin
|
||||
Brush.Color := clWhite;
|
||||
TextOut(25,0,'Поколение '+IntToStr(gen));
|
||||
TextOut(WindowWidth - 130,0,'Жителей: '+IntToStr(CountCells)+' ');
|
||||
end;
|
||||
|
||||
begin
|
||||
SetConsoleIO;
|
||||
if (m mod mk<>0) or (n mod nk<>0) then
|
||||
begin
|
||||
writeln('Размер кластера не согласован с размером поля. Программа завершена');
|
||||
exit
|
||||
end;
|
||||
hm := m div mk;
|
||||
hn := n div nk;
|
||||
SetWindowSize(x0+m*w,y0+n*w);
|
||||
CenterWindow;
|
||||
Window.Title := 'Игра "Жизнь"';
|
||||
Window.IsFixedSize := True;
|
||||
Font.Name := 'Arial';
|
||||
Font.Size := 10;
|
||||
Init;
|
||||
|
||||
LockDrawing;
|
||||
DrawInfo;
|
||||
DrawField;
|
||||
DrawConfiguration;
|
||||
UnLockDrawing;
|
||||
|
||||
var mil := Milliseconds;
|
||||
gen := 0;
|
||||
RedrawProc := LifeRedrawProc;
|
||||
while True do
|
||||
begin
|
||||
gen += 1;
|
||||
|
||||
if gen mod 11 = 0 then
|
||||
DrawInfo;
|
||||
|
||||
SosediA := SosediB;
|
||||
obnovA := obnovB;
|
||||
NextGen;
|
||||
|
||||
if gen mod 1000 = 0 then
|
||||
begin
|
||||
var mil1 := Milliseconds;
|
||||
writeln(gen,' ',(mil1-mil)/1000);
|
||||
mil := mil1;
|
||||
end;
|
||||
end;
|
||||
end.
|
45
Matches.pas
Normal file
45
Matches.pas
Normal file
@ -0,0 +1,45 @@
|
||||
// Игра "Спички"
|
||||
const InitialCount=15;
|
||||
|
||||
var
|
||||
/// Текущее количество спичек
|
||||
Count: integer;
|
||||
/// Количество спичек, которое берет игрок
|
||||
Num: integer;
|
||||
/// Номер текущего игрока
|
||||
Player: integer;
|
||||
|
||||
begin
|
||||
Player := 1;
|
||||
Count := InitialCount;
|
||||
|
||||
repeat
|
||||
if Player=1 then
|
||||
begin
|
||||
var Correct: boolean;
|
||||
repeat
|
||||
write('Ваш ход. На столе ',Count,' спичек. ');
|
||||
write('Сколько спичек Вы берете? ');
|
||||
readln(Num);
|
||||
Correct := (Num>=1) and (Num<=3) and (Num<=Count);
|
||||
if not Correct then
|
||||
writeln('Неверно! Повторите ввод!');
|
||||
until Correct;
|
||||
end
|
||||
else
|
||||
begin
|
||||
Num := Random(1,3);
|
||||
if Num>Count then
|
||||
Num := Count;
|
||||
writeln('Мой ход. Я взял ',Num,' спичек');
|
||||
end;
|
||||
Count -= Num;
|
||||
if Player=1 then
|
||||
Player := 2
|
||||
else Player := 1;
|
||||
until Count=0;
|
||||
|
||||
if Player=1 then
|
||||
writeln('Вы победили!')
|
||||
else writeln('Вы проиграли!');
|
||||
end.
|
348
NewLife.pas
Normal file
348
NewLife.pas
Normal file
@ -0,0 +1,348 @@
|
||||
// Игра Жизнь на торе
|
||||
// Оптимизация хешированием по равномерной сетке
|
||||
|
||||
|
||||
uses Utils,GraphABC;
|
||||
|
||||
const
|
||||
w =3;
|
||||
w1=1;
|
||||
k=20;
|
||||
m=300;
|
||||
n=220;
|
||||
graphW=0;
|
||||
mk=m div k;//15;
|
||||
nk=n div k;//10;
|
||||
mm=m+1;
|
||||
nn=n+1;
|
||||
x0=1;
|
||||
y0=21;
|
||||
ClearColor=clBlack;
|
||||
FillColor=clLimeGreen;
|
||||
FiledColor=RGB(0,40,0);
|
||||
FiledColor2=RGB(0,70,0);{}
|
||||
{ClearColor=clWhite;
|
||||
FillColor=clBlack;
|
||||
FiledColor=clLightGray;
|
||||
FiledColor2=clGray;{}
|
||||
|
||||
|
||||
var
|
||||
//a,b,sosedia,sosedib: array [0..nn,0..mm] of byte;
|
||||
a,b,sosedia,sosedib:array of array of byte;
|
||||
//obnovA,obnovB: array [1..nk,1..mk] of boolean;
|
||||
obnovA,obnovB: array of array of boolean;
|
||||
count: integer;
|
||||
obn: boolean;
|
||||
mil,mil1: integer;
|
||||
hn,hm: integer;
|
||||
|
||||
procedure AssignArray(var arr:array of array of boolean; n,m:integer);
|
||||
begin
|
||||
SetLength(arr,n);
|
||||
for var i:=0 to n-1 do
|
||||
SetLength(arr[i],m);
|
||||
end;
|
||||
procedure AssignArray(var arr:array of array of byte; n,m:integer);
|
||||
begin
|
||||
SetLength(arr,n);
|
||||
for var i:=0 to n-1 do
|
||||
SetLength(arr[i],m);
|
||||
end;
|
||||
procedure CopyArray(arr1,arr2:array of array of byte);
|
||||
begin
|
||||
for var i:=0 to arr1.Length-1 do
|
||||
arr1[i].CopyTo(arr2[i],0);
|
||||
end;
|
||||
procedure CopyArray(arr1,arr2:array of array of boolean);
|
||||
begin
|
||||
for var i:=0 to arr1.Length-1 do
|
||||
arr1[i].CopyTo(arr2[i],0);
|
||||
end;
|
||||
|
||||
procedure DrawCell(i,j: integer);
|
||||
begin
|
||||
if BrushColor<>FillColor then begin
|
||||
SetBrushColor(FillColor);
|
||||
SetPenColor(FillColor);
|
||||
end;
|
||||
FillRect(x0+(j-1)*w,y0+(i-1)*w,x0+j*w-w1,y0+i*w-w1);
|
||||
end;
|
||||
|
||||
|
||||
procedure ClearCell(i,j: integer);
|
||||
begin
|
||||
if BrushColor<>clearColor then begin
|
||||
SetBrushColor(clearColor);
|
||||
SetPenColor(clearColor);
|
||||
end;
|
||||
FillRect(x0+(j-1)*w,y0+(i-1)*w,x0+j*w-w1,y0+i*w-w1);
|
||||
end;
|
||||
|
||||
procedure DrawConfiguration;
|
||||
begin
|
||||
for var i:=1 to n do
|
||||
for var j:=1 to m do
|
||||
if a[i,j]=1 then
|
||||
DrawCell(i,j)
|
||||
end;
|
||||
|
||||
procedure DrawField;
|
||||
begin
|
||||
SetBrushColor(ClearColor);
|
||||
FillRectangle(x0,y0,x0+m*w,y0+n*w);
|
||||
SetPenColor(FiledColor);
|
||||
for var i:=0 to m do
|
||||
Line(x0+i*w-1,y0,x0+i*w-1,y0+n*w);
|
||||
for var i:=0 to n do
|
||||
Line(x0,y0+i*w-1,x0+m*w,y0+i*w-1);
|
||||
SetPenColor(FiledColor2);
|
||||
for var i:=0 to m div hm do
|
||||
Line(x0+i*w*hm-1,y0,x0+i*w*hm-1,y0+n*w);
|
||||
for var i:=0 to n div hn do
|
||||
Line(x0,y0+i*w*hn-1,x0+m*w,y0+i*w*hn-1);
|
||||
end;
|
||||
|
||||
procedure IncSosedi(i,j: integer);
|
||||
begin
|
||||
var i1 := i=1 ? n : i-1;
|
||||
var i2 := i=n ? 1 : i+1;
|
||||
var j1 := j=1 ? m : j-1;
|
||||
var j2 := j=m ? 1 : j+1;
|
||||
SosediB[i1,j1] += 1;
|
||||
SosediB[i1,j] += 1;
|
||||
SosediB[i1,j2] += 1;
|
||||
SosediB[i,j1] += 1;
|
||||
SosediB[i,j2] += 1;
|
||||
SosediB[i2,j1] += 1;
|
||||
SosediB[i2,j] += 1;
|
||||
SosediB[i2,j2] += 1;
|
||||
end;
|
||||
|
||||
procedure DecSosedi(i,j: integer);
|
||||
begin
|
||||
var i1 := i=1 ? n : i-1;
|
||||
var i2 := i=n ? 1 : i+1;
|
||||
var j1 := j=1 ? m : j-1;
|
||||
var j2 := j=m ? 1 : j+1;
|
||||
SosediB[i1,j1] -= 1;
|
||||
SosediB[i1,j] -= 1;
|
||||
SosediB[i1,j2] -= 1;
|
||||
SosediB[i,j1] -= 1;
|
||||
SosediB[i,j2] -= 1;
|
||||
SosediB[i2,j1] -= 1;
|
||||
SosediB[i2,j] -= 1;
|
||||
SosediB[i2,j2] -= 1;
|
||||
end;
|
||||
|
||||
procedure SetCell(i,j: integer);
|
||||
begin
|
||||
if b[i,j]=0 then
|
||||
begin
|
||||
b[i,j]:=1;
|
||||
obn:=true;
|
||||
IncSosedi(i,j);
|
||||
end;
|
||||
count += 1;
|
||||
end;
|
||||
|
||||
procedure UnSetCell(i,j: integer);
|
||||
begin
|
||||
if b[i,j]=1 then
|
||||
begin
|
||||
b[i,j]:=0;
|
||||
obn:=true;
|
||||
DecSosedi(i,j);
|
||||
end;
|
||||
count -= 1;
|
||||
end;
|
||||
|
||||
type
|
||||
ColonyType = (Big, LD, RD, LU, RU);
|
||||
procedure AddColonyType(xc,yc:integer; ctype:ColonyType);
|
||||
begin
|
||||
case ctype of
|
||||
ColonyType.Big:begin
|
||||
SetCell(xc,yc);
|
||||
SetCell(xc,yc+1);
|
||||
SetCell(xc,yc+2);
|
||||
SetCell(xc-1,yc+2);
|
||||
SetCell(xc+1,yc+1);
|
||||
end;
|
||||
ColonyType.LD:begin
|
||||
SetCell(xc,yc-1);
|
||||
SetCell(xc,yc);
|
||||
SetCell(xc,yc+1);
|
||||
SetCell(xc-1,yc-1);
|
||||
SetCell(xc-2,yc);
|
||||
end;
|
||||
end;
|
||||
//SosediA:=SosediB;
|
||||
CopyArray(sosedib,sosedia);
|
||||
for var ik:=1 to nk do
|
||||
for var jk:=1 to mk do
|
||||
obnovB[ik,jk]:=true;
|
||||
//obnovA:=obnovB;
|
||||
CopyArray(obnovB,obnovA);
|
||||
end;
|
||||
|
||||
procedure Init;
|
||||
begin
|
||||
Count:=0;
|
||||
AddColonyType(n div 2,m div 2, ColonyType.Big);
|
||||
end;
|
||||
|
||||
procedure OnlyCase(i,j: integer);
|
||||
begin
|
||||
case SosediA[i,j] of
|
||||
0..1,4..9:
|
||||
if b[i,j]=1 then
|
||||
begin
|
||||
b[i,j]:=0;
|
||||
obn:=true;
|
||||
DecSosedi(i,j);
|
||||
ClearCell(i,j);
|
||||
count -= 1;
|
||||
end;
|
||||
3: if b[i,j]=0 then
|
||||
begin
|
||||
b[i,j]:=1;
|
||||
obn:=true;
|
||||
IncSosedi(i,j);
|
||||
DrawCell(i,j);
|
||||
count += 1;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure NextGen;
|
||||
var
|
||||
i,j,ik1,jk1,ik2,jk2,ifirst,jfirst,ilast,jlast: integer;
|
||||
l,r,u,d,lu,ld,ru,rd: boolean;
|
||||
begin
|
||||
for var ik:=1 to nk do
|
||||
begin
|
||||
for var jk:=1 to mk do
|
||||
begin
|
||||
obn := false;
|
||||
ifirst := (ik-1)*hn+1;
|
||||
ilast := ik*hn;
|
||||
jfirst := (jk-1)*hm+1;
|
||||
jlast := jk*hm;
|
||||
if obnovA[ik,jk] then
|
||||
begin
|
||||
for i:=ifirst to ilast do
|
||||
for j:=jfirst to jlast do
|
||||
OnlyCase(i,j);
|
||||
end
|
||||
else
|
||||
begin
|
||||
ik1 := ik=1 ? nk : ik-1;
|
||||
ik2 := ik=nk ? 1 : ik+1;
|
||||
jk1 := jk=1 ? mk : jk-1;
|
||||
jk2 := jk=mk ? 1 : jk+1;
|
||||
l:=obnovA[ik,jk1];
|
||||
r:=obnovA[ik,jk2];
|
||||
u:=obnovA[ik1,jk];
|
||||
d:=obnovA[ik2,jk];
|
||||
lu:=obnovA[ik1,jk1];
|
||||
ld:=obnovA[ik2,jk1];
|
||||
ru:=obnovA[ik1,jk2];
|
||||
rd:=obnovA[ik2,jk2];
|
||||
if u then
|
||||
begin
|
||||
i:=ifirst;
|
||||
for j:=jfirst+1 to jlast-1 do
|
||||
OnlyCase(i,j);
|
||||
end;
|
||||
if d then
|
||||
begin
|
||||
i:=ilast;
|
||||
for j:=jfirst+1 to jlast-1 do
|
||||
OnlyCase(i,j);
|
||||
end;
|
||||
if l then
|
||||
begin
|
||||
j:=jfirst;
|
||||
for i:=ifirst+1 to ilast-1 do
|
||||
OnlyCase(i,j);
|
||||
end;
|
||||
if r then
|
||||
begin
|
||||
j:=jlast;
|
||||
for i:=ifirst+1 to ilast-1 do
|
||||
OnlyCase(i,j);
|
||||
end;
|
||||
if u or l or lu then
|
||||
OnlyCase(ifirst,jfirst);
|
||||
if u or r or ru then
|
||||
OnlyCase(ifirst,jlast);
|
||||
if d or l or ld then
|
||||
OnlyCase(ilast,jfirst);
|
||||
if d or r or rd then
|
||||
OnlyCase(ilast,jlast);
|
||||
end;
|
||||
obnovB[ik,jk]:=obn;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure MouseDown(x,y,b:integer);
|
||||
begin
|
||||
case b of
|
||||
1:AddColonyType((y-y0)div w,(x-x0)div w, ColonyType.LD);
|
||||
|
||||
end;
|
||||
end;
|
||||
|
||||
begin
|
||||
SetConsoleIO;
|
||||
AssignArray(obnovA,nk+1,mk+1);
|
||||
AssignArray(obnovB,nk+1,mk+1);
|
||||
AssignArray(a,nn+1,mm+1);
|
||||
AssignArray(b,nn+1,mm+1);
|
||||
AssignArray(sosedia,nn+1,mm+1);
|
||||
AssignArray(sosedib,nn+1,mm+1);
|
||||
SetWindowCaption('Игра "Жизнь"');
|
||||
if (m mod mk<>0) or (n mod nk<>0) then
|
||||
begin
|
||||
writeln('Размер кластера не согласован с размером поля. Программа завершена');
|
||||
exit
|
||||
end;
|
||||
hm:=m div mk;
|
||||
hn:=n div nk;
|
||||
SetBrushColor(ClearColor);
|
||||
SetWindowSize(x0+m*w,y0+n*w+graphW);
|
||||
CenterWindow;
|
||||
ClearWindow(ClearColor);
|
||||
SetFontName('Courier New');
|
||||
SetFontSize(10);
|
||||
Init;
|
||||
DrawField;
|
||||
DrawConfiguration;
|
||||
OnMouseDown:=MouseDown;
|
||||
mil:=Milliseconds;
|
||||
var gen:=0;
|
||||
DrawInBuffer := false;
|
||||
while true do begin
|
||||
gen+=1;
|
||||
//SosediA:=SosediB;
|
||||
//obnovA:=obnovB;
|
||||
CopyArray(sosedib,sosedia);
|
||||
CopyArray(obnovB,obnovA);
|
||||
NextGen;
|
||||
if gen mod 10 = 0 then begin
|
||||
DrawInBuffer := True;
|
||||
SetBrushColor(ClearColor);
|
||||
SetFontColor(FillColor);
|
||||
TextOut(25, 0,'Поколение: '+IntToStr(gen));
|
||||
TextOut(765,0,'Жителей: '+IntToStr(count)+' ');
|
||||
if gen mod 1000 = 0 then begin
|
||||
mil1:=Milliseconds;
|
||||
writeln(gen,' ',(mil1-mil)/1000);
|
||||
mil:=mil1;
|
||||
end;
|
||||
DrawInBuffer := false;
|
||||
end;
|
||||
end;
|
||||
end.
|
BIN
блокнот/Open.png
Normal file
BIN
блокнот/Open.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 575 B |
BIN
блокнот/Save.png
Normal file
BIN
блокнот/Save.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 535 B |
91
блокнот/TextEditor.pas
Normal file
91
блокнот/TextEditor.pas
Normal file
@ -0,0 +1,91 @@
|
||||
{$apptype windows}
|
||||
{$reference 'System.Windows.Forms.dll'}
|
||||
{$reference 'System.Drawing.dll'}
|
||||
{$resource 'Open.png'}
|
||||
{$resource 'Save.png'}
|
||||
|
||||
uses System.Windows.Forms;
|
||||
|
||||
const
|
||||
TextFileExt = 'txt';
|
||||
TextFileFilter = 'Текстовые файлы (*.'+TextFileExt+')|*.'+TextFileExt;
|
||||
|
||||
var
|
||||
myForm: Form;
|
||||
TextBox1: TextBox;
|
||||
|
||||
procedure SaveFile(FileName: string);
|
||||
begin
|
||||
//Создаем файловый поток с кодировкой Windows 1251, необходимо для корректного сохранения русских букв
|
||||
var f := new System.IO.StreamWriter(FileName, false, System.Text.Encoding.Default);
|
||||
f.Write(TextBox1.Text);
|
||||
f.Close;
|
||||
end;
|
||||
|
||||
procedure OpenFile(FileName: string);
|
||||
begin
|
||||
//Создаем файловый поток с кодировкой Windows 1251, необходимо для корректного чтения русских букв
|
||||
var f := new System.IO.StreamReader(FileName, System.Text.Encoding.Default);
|
||||
TextBox1.Text := f.ReadToEnd;
|
||||
f.Close;
|
||||
end;
|
||||
|
||||
procedure FormClose(sender: object; args: System.EventArgs);
|
||||
begin
|
||||
myForm.Close;
|
||||
end;
|
||||
|
||||
procedure MenuSaveClick(sender:object; args:System.EventArgs);
|
||||
begin
|
||||
//Диалог для выбора файла
|
||||
var sd := new SaveFileDialog;
|
||||
//Расширение поумолчанию
|
||||
sd.DefaultExt := TextFileExt;
|
||||
//Фильтр для диалга
|
||||
sd.Filter := TextFileFilter;
|
||||
if sd.ShowDialog=DialogResult.OK then
|
||||
//если результат выполнения sd.ShowDialog это нажатие кнопки подтверждения то
|
||||
SaveFile(sd.FileName);
|
||||
end;
|
||||
|
||||
procedure MenuOpenClick(sender:object; args:System.EventArgs);
|
||||
begin
|
||||
var sd := new OpenFileDialog;
|
||||
sd.DefaultExt := TextFileExt;
|
||||
sd.Filter := TextFileFilter;
|
||||
if sd.ShowDialog = DialogResult.OK then
|
||||
OpenFile(sd.FileName);
|
||||
end;
|
||||
|
||||
begin
|
||||
myForm := new Form;
|
||||
myForm.Text := 'Простой текстовый редактор';
|
||||
|
||||
TextBox1 := new TextBox;
|
||||
TextBox1.Multiline := True;
|
||||
TextBox1.Height := 100;
|
||||
TextBox1.Dock := DockStyle.Fill;
|
||||
//Полосы прокрутки
|
||||
TextBox1.ScrollBars := ScrollBars.Both;
|
||||
//Устанавливаем шрифт
|
||||
TextBox1.Font := new System.Drawing.Font('Courier New',10);
|
||||
|
||||
myForm.Controls.Add(TextBox1);
|
||||
|
||||
//Создаем меню
|
||||
var toolStrip1 := new ToolStrip;
|
||||
toolStrip1.GripStyle := System.Windows.Forms.ToolStripGripStyle.Hidden;
|
||||
var miFile := new ToolStripMenuItem('Файл');
|
||||
miFile.DropDownItems.Add(new ToolStripMenuItem('Открыть', new System.Drawing.Bitmap(GetResourceStream('Open.png')),MenuOpenClick));
|
||||
miFile.DropDownItems.Add(new ToolStripMenuItem('Сохранить как...',new System.Drawing.Bitmap(GetResourceStream('Save.png')),MenuSaveClick));
|
||||
miFile.DropDownItems.Add(new ToolStripMenuItem('Выход',nil,FormClose));
|
||||
toolStrip1.Items.Add(miFile);
|
||||
myForm.Controls.Add(toolStrip1);
|
||||
|
||||
//Посмотрим в аргументы командной строки
|
||||
//Если их количество = 1, то открываем
|
||||
if CommandLineArgs.Length = 1 then
|
||||
OpenFile(CommandLineArgs[0]);
|
||||
|
||||
Application.Run(myForm);
|
||||
end.
|
Reference in New Issue
Block a user