pascalabcnet/TestSuite/CompilationSamples/BookWormABCNET.pas
Бондарев Иван e6e67c193c initial commit
2015-05-14 21:35:07 +02:00

228 lines
5.3 KiB
ObjectPascal

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.