2011 m. birželio 6 d., pirmadienis

AVL medis

Norint gauti papildomų balų neštis į egzaminą, galima buvo suprogramuoti AVL medį. Iš kursiokės paėmiau jos AVL programą ir aiškinausi pusę nakties prieš atsiskaitymo dieną. Pagalvojau, kad galbūt galima bus gauti nors ne maksimumą, bet bent pusę taškų už nepaties programuotą programą, jeigu gerai ją sugebėsiu paaiškinti bet kurioje eilutėje, bei jeigu parašysiu programai kažkokių papildomų įrankių. Kitą pusnaktę tuos įrankius ir bandžiau rašyti. Pavyko parašyti procedūrą, kuri sunumeruoja dvejetainio AVL medžio elementus man reikiama hierarchine tvarka, ir antrą procedūrą, kuri tuos elementus išspausdina ekrane atidėdama atitinkamą skaičių tarpų.

AVL programa tai dvejetainis medis, kuris pildomas naujais elementais, balansuojasi. Dvejetainis medis skirtas ten įdėto elemento paieškai. Jeigu į medį bus dedami elementai vienas po kito didėjantys, arba vienas po kito mažėjantys, tai medis turės vieną ilgą šaką, o jei bus dedami įvairūs elementai, tai jis bus šakotas bei trumpašakis ir bus greičiau vykdoma paieška. AVL medis - besibalansuojantis medis. Kuomet viena jo šaka pasidaro ilgesnė už bet kurią kitą 2 sąlyginiai vienetais, tai ji deformuojasi, vykdomas "posūkis": šaka ale nupjaunama, perlaužiama perpus, tada suklijuojama "V" raide ir pritvirtinama prie šakos pamato.

Taip atrodo programos interfeiso fragmentas, atlikus vieno skaičiaus įterpimą į AVL medį:

(dvejetas ir trejetas paraudoninti, neryškiai čia matosi)

Beje, formulę su DIV'ais tai galvojau ir testavau tikrai kokias 3 valandas. O medžio išspausdinimą padariau su lygiavimo klaida (buvo ne visai gražu), kurią sugalvojau kaip pataisyti tik kai prisėdau savaitę po atsiskaitymo.

Pateiksiu tik programos procedūras, kurios paruošia masyvą ir išspausdina medį pseudografiškai.

( uses crt;
type Pnode=^node;
node=record
l,r,t : Pnode;
n: integer;
end;

var root :Pnode; skait: array[1..255] of integer;

function auksciai( rod : Pnode) : integer;
var a1, a2 : integer;
begin
if (rod <> nil)
then
begin
a1 := auksciai(rod^.l) + 1 ;
a2 := auksciai(rod^.r) + 1 ;
if a1>=a2 then auksciai:=a1
else auksciai:=a2 ;
end
else auksciai := -1;
end; )

procedure isEilesMasyvas;
var te:Pnode; au,n,el,power,k,kn: integer;
begin
au:=auksciai(root);
power:=1; el:=0;
for n:=1 to au+1 do begin power:=power*2; el:=el+power div 2; end;
for n:=1 to el do
begin k:=1; kn:=n;
while k*2<=n do k:=k*2; te:=root;
while (kn<>1 ) and (k<>1) and (kn div k <>0) and (te<>nil) do
begin if kn mod k div (k div 2) = 0 then te:=te^.l else te:=te^.r; k:=k div 2; end;
if te <> nil then skait[n]:=te^.n else skait[n]:=0;
end;
writeln('stai isEilesMasyvo ',el, ' elementai: ');
for n:=1 to el do write(skait[n],' ');
end;


procedure piestiMedi(reiksme: integer);
var au,i,j,k,s,power,tarpai: integer;
begin
au:=auksciai(root);
s:=0;
writeln;
writeln('isspausdinu visus Medzio elementus: ');
for i:=1 to au+1 do
begin
power:=1;
for j:=au+1-i downto 1 do begin power:=power*2; end;
tarpai:=power*2-2;
power:=1;
for j:=1 to i do power:=power*2;
for k:=1 to power div 2 do
begin
for j:=1 to tarpai do write(' ');
if k>1 then for j:=1 to tarpai do write(' ');
s:=s+1;
if (skait[s]<10) and (skait[s]>0) then write(' ');
if skait[s]<>0 then
begin write(' ');
if skait[s]<>reiksme then write(skait[s])
else begin textcolor(12); write(skait[s]); textcolor(7); end;
write(' ');
end
else write(' ');
end;

writeln;
end;
end;

Kibirų pilstymas

Prieš porą savaičių dėstytojas uždavė studentams klausimą, už kurį buvo galima gauti papildomų taškelių neštis į egzaminą. Visi kursiokai ėmė spręsti ir bent penkias minutes tvyrojo tyla. Po to staiga net tryse priėjom sprendimą bemaž tuo pačiu metu, bet buvau truputį aplenktas.
Uždavinys toks:
Yra trys kibirai, kurių tūriai 10, 7, 2 litrai. Į pirmąjį įpilta 10 litrų magiško skysčio, kiti - tušti.
Užduotis: reikia neišpilstant magiško skysčio, gauti lygiai 5 litrus viename iš indų.

Jau tą pačią dieną kilo mintis parašyti programą, sprendžiančią tokį uždavinį, tačiau žinojau, kad su mano programavimo tempais, tai užtruks ilgai, tad atsidėjau laisvesnei dienai.
Šiandien per pusiaudienį suprogramavau. Pirmiausia kelias valandas rašiau į sąsiuvinį, ir galiausiai programa užėmė apie vieną pilną pusiau pribraukytą puslapį. Padėjęs pagrindus, persikėliau į PC.
Patiko tai, kad sugebėjau suprogramuoti viską gana lanksčiai, t.y. vartotojui yra leidžiama pasirinkti kibirų skaičius, kibirų tūriai, ir į kokius kibirus ir kiek jis norėtų pripilti skysčio, bei kokį vieną skaičių jam reikia gauti. Visa tai realizuota masyvais ir daug FOR ciklų, vienoje vietoje siekiančių net 4 ciklų "gylį" (i, j, k, k1);
Nepatiko tai, kad programa neieško geriausių pilstymo variantų. Ir dar labiau nepatiko, kad neieško visų pilstymo variantų, dėl ko negalima pasakyti ar ji veikia visais atvejais teisingai.

Dėstytojo uždavinį programa išsprendžia per 15 pilstymų, nors yra bent 2 greitesni būdai kaip gauti 5 litrus.

Taigi, čia programos kodas:



program LitrasSenLitrasTen;
label 0;
const NN=5; NNN=1000;
type WM = array[1..NNN,1..NN] of integer;

var w: WM;
v, x, t: array[1..NN] of integer;
i,j,k,k1,m,m1,m2 :integer; //skaitliukai
t1,t2 :integer; //temporary
N, gauti, def :integer;
total, tot, nutraukti :boolean;

procedure perpilti(a, b, bV: integer; var a1, b1: integer);
begin
if a>=bV-b then
begin
a1:=a-(bV-b);
b1:=bV
end
else
begin
b1:=b+a;
a1:=0
end;
end;

begin
writeln('RS 2011-06-06');
writeln('Programa: pilstymas is kibiro i kibira, kol gaunamas norimas turis');
writeln;
writeln('NE - 0, TAIP - kitas skaicius');
writeln('Norite ivesti savus parametrus?');
writeln('(Jeigu NE, tai programa veiks su DEFAULT parametrais: ');
writeln('Kibiru skaicius: 3, pirmojo V = 10, antrojo V = 7, treciojo V = 2');
writeln('Pirmame kibire yra 10 litru, kiti - tusti. Bandoma gauti 5 litrus.)');
readln(def);
if def = 0 then
begin
N:=3;
v[1]:=10; v[2]:=7; v[3]:=2;
x[1]:=10; x[2]:=0; x[3]:=0;
gauti:=5;
end
else
begin
writeln('Iveskite kibiru skaiciu');
readln(N);
writeln('Iveskite visu kibiru turius');
for i:=1 to N do readln(v[i]);
writeln('Iveskite visu kibiru turini');
for i:=1 to N do readln(x[i]);
writeln('Koki litru skaiciu norite gauti?');
readln(gauti);
end;

for i:=1 to N do
w[1,i]:=x[i];

m:=1; m2:=0; nutraukti := false;

write(0:3,'| ');
for i:=1 to N do write(x[i]:2,' ');
writeln;

repeat
begin
m1:=m;
// writeln('m1:=m; - ',m);
for i:=1 to N do
begin
0:
for j:=1 to N do

if (i<>j) and (x[j]<>v[j]) and (x[i]<>0) then
begin
// writeln('i ir j - ',i,' ',j);
// writeln('x[i],x[j],v[j] - ',x[i],' ',x[j],' ',v[j]);
perpilti(x[i],x[j],v[j], t1,t2);
// writeln('t1,t2 - ',t1,' ',t2);
for k:=1 to N do
if k in [i,j] then
if k=i then
t[k]:=t1
else
t[k]:=t2
else
t[k]:=x[k];
total:=true;
for k:=1 to m do
begin
tot:=true;
for k1:=1 to N do
tot:=tot and (w[k,k1] = t[k1]);
total:=total and (not tot);
// writeln('total, k - ',total,' ',k);
// readln;
end;
if total then
begin
write(m:3,'| ');
for k:=1 to N do
begin
x[k]:=t[k];
w[m+1,k]:=t[k];
write(x[k]:2,' ');
if k=N then writeln;
if t[k]=gauti then nutraukti:= true;
end;
m:=m+1;
goto 0;
end;
end;
end;
if m=m1 then m2:=m2+1 else m2:=0;
end;
until (m2=2) or (m>100) or (nutraukti);

if m2=2 then writeln('m2=2');
if m>1000 then writeln('m>1000');
if nutraukti then writeln('nutraukti');

readln;
end.

2011 m. gegužės 28 d., šeštadienis

Memo žaidimas ant Java, išvertus iš Pascal'io.

Hm, pagaliau pavyko bent jau išversti į Javos sintaksę tą Memo žaidimuką.
Programoje yra dvi klasės: Main ir Readas2. Main klasė viska atlieka, išskyrus skaitymo iš klaviatūros, dėl to kreipiasi į Readas2 klasę, į jos metodą "giveNu" ("duok skaičių").
Java rašytos programos su komentarais užima daug vietos, todėl ši žinutė tuoj taps labai ilga.

1. Main
2. Readas2

-1-

import java.io.IOException;
import java.util.Random;

public class Main {

public static void main(String[] args) {

//daug kintamuju
int MAX = 10;
int MAZ = 5;
int i,j,k,l,n,x,y, rep, repi;
int zaistidarSk, lenta, ilg, plo, varkie, pasirvar, indvar, atmp, inda;
boolean zaistidar;
boolean endgame, same;
int[] v = new int[4];
int[][] a = new int[MAX+1][MAX+1];
boolean[][] s= new boolean[MAX+1][MAX+1];
int[] xrep= new int[MAZ+1], yrep= new int[MAZ+1];

// visiems kintamiesiems priskiriu betkokias reksmes, norint isvengti praesimo
// ~~"variable AAA may not have initialized"
v[3] = 1;
varkie = 1;
pasirvar = 1;
indvar = 1;

lenta = 1;
ilg = 1;
plo = 1;

x = 1;
y = 1;

zaistidarSk = 2;
zaistidar = true;

//kai kuriu kintamuju pavadinimu paaiskinimai
//ilg - lentos ilgis, plo - lentos plotis
//v[] - variantai, varkie - variantu kiekis
//pasirvar - vartotojo pasirekamas variantas
//indvar - varianto indeksas
//a[][] - langelis, kuriam priskirtas skacius; atmp - "temporary a" (maisant lenta)
//s[][] - saugo a langelio logika (atvertas/uzvertas).
//i,j,n,rep,repi - skaitliukai

//sis visa programa gaubiantis ciklas klausineja, ar nori vartotojas "zaisti dar?"
while (zaistidar) {

System.out.println("pasirinkite lentos dydi, ivesdami atitinkama skaitmeni");
System.out.println("1 - 4x3, 2 - 5x4, 3 - 6x5, 4 - 8x6, 5 - 10x6");

try {
lenta = Readas2.giveNu();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/// System.out.println(lenta);


if (lenta==1) { ilg=4; plo=3; varkie=2; v[1]=2; v[2]=3;}
if (lenta==2) { ilg=5; plo=4; varkie=2; v[1]=2; v[2]=4; }
if (lenta==3) { ilg=6; plo=5; varkie=2; v[1]=2; v[2]=3; }
if (lenta==4) { ilg=8; plo=6; varkie=2; v[1]=2; v[2]=3; }
if (lenta==5) { ilg=10;plo=6; varkie=3; v[1]=2; v[2]=3; v[3]=5; }
System.out.println("pasirinkite po kiek vienodu paveiksleliu bus poligone");
System.out.println("pasirinkimo variantai: ");



for (i=1;i<6;i++) {
if (lenta==i) { for (j=1;j
/// System.out.println("indvar : "+indvar);
System.out.println();
try {
pasirvar = Readas2.giveNu();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/// System.out.println("pasirvar : "+pasirvar);

for (j=1;j
/// System.out.println("indvar-2 : "+indvar);

for (i=plo;i>0;i--) { //priskiriami skaiciai [1..ixj]
for (j=1;j
a[j][i]=(i-1)*ilg+j;
}
//pvz. i=4, j=3.
// 1 2 3 4
// 5 6 7 8
// 9 10 11 12

}

for (i=plo;i>0;i--) { //vienodu skaiciu sudarymas
for (j=1;j
a[j][i]=(a[j][i]+v[indvar]-1) / v[indvar];
}
}
//pvz. jei v[indvar]=2. jei v[indvar]=3.
// 1 1 2 2 1 1 1 2
// 3 3 4 4 2 2 3 3
// 5 5 6 6 3 4 4 4

Random generator = new Random();

for (n=1;n<4;n++) { //triskart ismaiso lenta
for (i=1;i
for (j=1;j
atmp=a[j][i];
l = generator.nextInt(plo)+1;
k = generator.nextInt(ilg)+1;
a[j][i]=a[k][l];
a[k][l]=atmp;
}
}
}


for (i=MAX;i>0;i--) { //logiskai uzvienetinam kintamuju lauka (MAX lenta)
for (j=1;j
}
for (i=plo;i>0;i--) { //logiskai uznulinam zaidziama lenta (plo x ilg lenta)
for (j=1;j
}


do { //1 --ciklo pabaigoje patikrina ar visi lageliai atverti; jei ne: endgame = false

endgame = true;

rep=0;
do //1.1 --ciklas tikrina ir atvercia vienodas korteles, uzvercia suklydus
{
rep++;

for (i=plo;i>0;i--) { //parodom lenta

for (j=1;j
if (s[j][i]) {
if (a[j][i]<10) {System.out.print(" ");};
System.out.print(" "+ a[j][i]);
}
else { System.out.print(" "+"X"); }
}
System.out.println();
}
System.out.println();

System.out.println("iveskite langelio koord x ir y");

try {
x = Readas2.giveNu();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
try {
y = Readas2.giveNu();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};


// tikrinam ar vartotojas gerai gaudosi koordinatese negrafineje aplinkoje :>
while ( !( (x<=ilg) && (y<=plo) && (x>0) && (y>0) ) || s[x][y] ) {
if ( !( (x<=ilg) && (y<=plo) && (x>0) && (y>0) ) ) {
System.out.println("uzribio koordinates! iveskite x ir y is naujo");
try {
x = Readas2.giveNu();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
try {
y = Readas2.giveNu();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
}
else {
System.out.println("si kortele jau atverta, pasirinkite kita");
try {
x = Readas2.giveNu();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
try {
y = Readas2.giveNu();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
}
}


s[x][y] = true; //pazymim si langeli atidarytinu
xrep[rep] =x; //i masyva issaugom langelio x
yrep[rep] =y; //i masyva issaugom langelio y

same=true;
for (repi=1;repi
inda = a[xrep[1]][yrep[1]];
same = same && (inda==a[xrep[repi]][yrep[repi]]);
}

if (!same) {
for (i=plo;i>0;i--) { //parodom lenta atversdami "nebroli", bet tik trupam

for (j=1;j
if (s[j][i]) {
if (a[j][i]<10) {System.out.print(" ");};
System.out.print(" "+ a[j][i]);
}
else { System.out.print(" "+"X"); }
}
System.out.println();

};
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("\n\n\n\n\n\n\n\n\n\n\n"); //"javaClearScreen'as" :>
for (repi=1;repi
s[xrep[repi]][yrep[repi]] = false; //uzvercia visus anksciau atvertus "brolius", jei paskutinysis blogas
}
}

}
while ( !((rep==v[indvar]) || (!same)) ) ; //1.1
// --ciklas baigiasi kai atspetas reikiamas skaicius vienodu skaiciu ARBA kai suklystama

for (i=plo;i>0;i--) { //tikrinam ar visi langeliai atverti
for (j=1;j
endgame = endgame && s[j][i];
}
}

}
while (!endgame); //1

System.out.println("Jeigu norite zaisti dar, iveskite 1, jeigu ne - kita skaiciu");
try {
zaistidarSk = Readas2.giveNu();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};

if (zaistidarSk!=1) zaistidar=false;

}

System.out.println("programa baigia darba. viso gero!");

}

}


-2-

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Readas2 {
public static int giveNu() throws IOException {

InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);

boolean teisigaiIvesta = false;
int ivesk = 0;

while (!teisigaiIvesta) {
String str = null;
str = br.readLine();

try {
ivesk = Integer.parseInt(str);
}
catch (NumberFormatException nfe){
System.out.println("Blogas formatas!");
continue;
}
teisigaiIvesta = true;
}
// br.close();
return ivesk;
}
}

2011 m. balandžio 13 d., trečiadienis

Daugybos "matmintiniškas" treniruočių poligonas

Šiaip ne taip pavykusi programa, skirta "mokytis" daugybos (2011-04-03).
Tai paprasčiausias random užduočių išmetimo programa, kuri prašo sudauginti du skaičius iki 30, ir sulygina su teisingu atsakymu.
Be to, kad programa pateikia laiką, kiek buvo spręstas uždavinys, jis dar tą laiką įsirašo į sukuriamą failą, ir saugo jį ten dviem parametrais: vidutinis tam tikros užduoties (vienos iš 30x30 užduočių) sprendimo laikas , ir kiekis, kiek kartų toji užduotis buvo pateikiama.
Prieš pradedant žaisti, reikia nueiti į žaidimo opcijas ir pasirinkti sukurti naują failą, po failo sukūrimo, jis jau tampa užpildytas defaultinėmis reikšmėmis, kur vidutinis užduoties alikimo laikas įrašytas kaip 2 sekundės, o užduoties pateikimo kiekis - 1. Dar galima failą sukurti taip, kad defaultiniai užduočių sprendimo laikai būtų mažesni lengvesniems uždaviniams, ir didesni - sunkesniems.
Programa pateikia užduotį ne visai random būdu, o randomina 5 atsitiktines užduotis ir sulygina, kuri iš j sunkiausia žaidėjui, ir tą ir pateikia. Dėl to antrojo būdo failo sukūrimas su "progresyviniais" defaultiniais nustatymais privers programą dažniau mėtyti sudėtingesnius uždavinius, t.y. dažniausiai prašys sudauginti du skaičius iš intervalų [20..30].
Lengvesnes užduotis išsprendus per trumpesnį laiką, rezultatas įsirašo į failą, ir vėliau toji užduotis bus išmetama gerokai rečiau.
Programą išjungus, rezultatai išlieka, kadangi jie rašomi į sukurtą failą, kuris yra toje pačioje direktorijoje kur ir programos failas.

Taigi: screenshot'ai ir programos kodas:





program mult;
uses crt, dos;

procedure defreiksmes(var r, p: integer);
begin r:=10; p:=100; end;

procedure help;
begin
writeln('RS, 2011-04-03, daugyba');
writeln(#249,' Is pradziu pasirinkite pavadinima, kuriuo pavadinsite faila (pvz. manof)');
writeln('Tada eikite i nustatymus (1). Ten pasirinkite 2');
writeln(#249,' Programa paklaus, kokiu budu uzpildyti faila: 1 arba 2.');
writeln('1 - panasi tikimybe visiems veiksmams, 2 - didesne tikimybe sunkesniems');
writeln(#249,' Failas bus perrasytas, arba jeigu tokiu pavadinimu failo nebuvo - sukurtas naujas');
writeln;
writeln(#249,' Jums skaiciuojant, jusu rezultatai pildosi i pasirinkta faila');
writeln(#249,' Kuo ilgiau prie uzduoties sugaistate laiko,');
writeln('tuo didesne tikimybe kita kart gauti sia uzduoti');
writeln(#249,' Is pradziu sis efektas silpnas, taciau pildantis uzduociu');
writeln('sprendimo istorijai, stipreja');
writeln(#249,' Uz klaidinga atsakyma prisideda 3 sek ir keliauja i statsitika');
writeln;
writeln(#249,' Pagal defaulta(nutylejima), tarp uzduociu daroma 0.1 sek pauze,');
writeln('zaidziate 10 uzdaviniu ciklais. Taciau siuos nustatymus ');
writeln('galite keisti kol programa ijungta');
writeln('Isjungus programa ir vel ijungus, atsistato defaultiniai nustatymai');
writeln(#249,' Sprendimu istorija niekur nedingsta, nes ji uzrasyta tekstiniuose failuose');
writeln('Ja galite pradanginti, jeigu ta faila perrasysite su opcija "sukurti nauja defaultini faila" ');
writeln;
writeln(#249,' Uzpilde faila antruoju defaultiniu budu,');
writeln('gausite didesne tikimybe sunkesniu uzduociu atsiradimams');
writeln(#249,' Po zaidimo, jusu paklaus, ar norite pamatyti zemelapi');
writeln(#249,' Zemelapyje pavaizduota daugybos lentele 30x30, ir kiekvienas langelis reiskia');
writeln('kiek vidutiniskai laiko sugaisote sprendziant ta uzdavini');
writeln('Taciau i rezultata issiskaiciuoja ir pirmasis - defaultinis rezultatas,');
writeln('atsirades kuriant faila');
writeln;
writeln(#249,' Pilka spalva zemelapyje dazniausiai reiks, kad to veiksmo');
writeln('nebuvo ne karto atlikta');
writeln(#249,' Programoje gali buti klaidu');
readln;
end;

procedure defaultas(vidg: integer; fa:string);
const ko = 30;
var t: text;
i,j,k, g: integer;
b: array [1..ko*ko] of integer;
begin
writeln('Pasirinkite default varianta: 1 arba 2. (1 - lygiai, 2 - progresyviai)');
readln(g);
assign(t, fa);
rewrite(t);
writeln(t, vidg);
for i:=1 to ko do
for j:=1 to ko do
begin
k:=j+(i-1)*ko;
b[k]:=vidg;
if g=2 then begin
if (i<11) or (j<11) then b[k]:=vidg-25;
if (i<11) and (j<11) then b[k]:=vidg-75;
if ((i>10) and (j>20)) or ((i>20) and (j>10)) then b[k]:=vidg+50;
if (i>20) and (j>20) then b[k]:=vidg+150;
end;
writeln(t, b[k]);
writeln(t, '1');
end;
close(t);
end;

const ko = 30;
var
i,j,k,l,ll: integer;
t:text;
fa:string;
vidg, r, p: integer;
kla: integer;
s,z : array [1..ko*ko] of string;
b,c : array [1..ko*ko] of integer;
val1, min, sek, mil : word;
val2, min2, sek2, mil2 : word;
dtime: longint;
ax, max, mx, ixj, kodas, ats: integer;
zaistidar: boolean;

begin
clrscr;
randomize;

vidg:=200;

defreiksmes(r, p);
kla:=10;

b[1]:=15; b[2]:=14; b[3]:=10; b[4]:=11; b[5]:=9; b[6]:=13; b[7]:=12;
for i:=1 to 7 do begin textcolor(b[i]); writeln('Labas'); end; textcolor(7);

writeln('Kuriame faile saugoti rezultatus?');
writeln('(iveskite esamo failo pavadinima arba suteikite pavadinima naujam)');
readln(fa);
fa:=fa+'.txt';

while kla = 10 do begin
writeln('Eikite i Informacija ivesdami "1", arba pradekite zaidima ivesdami kitka.');
readln(kla);

if kla = 1 then
repeat begin
writeln('Informacija');
writeln('Pasirinkite opcija (iveskite atitinkama skaiciu)');
writeln(' 0 - grizti');
writeln(' 1 - paskaityti apie programa');
writeln(' 2 - sukurti nauja defaultini faila');
writeln(' 3 - pasirinkti kartojimu skaiciu');
writeln(' 4 - pasirinkti uzduodamu veiksmu sunkumus');
writeln(' 5 - pasirinkti pauzes trukme (milisekundemis)');
writeln(' 6 - grazinti defaultinius nustatymus');
readln(kla);
if kla = 0 then kla:=10
else if kla = 1 then help
else if kla = 2 then defaultas(vidg, fa)
else if kla = 3 then begin writeln('iveskite kartojimu sk.'); readln(r); end
else if kla = 4 then
else if kla = 5 then begin writeln('iveskite pauzes trukme'); readln(p); end
else if kla = 6 then defreiksmes(r, p);
end; until kla=10;
end;

zaistidar:=true;
while zaistidar do begin

assign(t, fa);
reset(t);
readln(t, vidg);
for i:=1 to ko do
for j:=1 to ko do begin
k:=j+(i-1)*ko;
readln(t, s[k]);
readln(t, z[k]);
val(s[k], b[k], kodas);
val(z[k], c[k], kodas);
end;
close(t);

for l:=1 to r do
begin
writeln('uzduoties numeris: ',l);
delay(p);

max:=0;
for ll:=1 to 5 do begin
ax:=random(ko*ko)+1;
if b[ax]> max then begin max:=b[ax]; mx:=ax; end;
end;
i:= mx div ko + 1;
j:= mx mod ko;
if j=0 then j:=(mx-1) mod ko + 1 ;
ixj:= i*j;
writeln(i:2,' x ',j:2);

GetTime(val1, min, sek, mil);
readln(ats);
GetTime(val2, min2, sek2, mil2);
dtime:=(val2-val1)*360000+(min2-min)*6000+(sek2-sek)*100+(mil2-mil);
writeln('laiko galvota: ',dtime div 100,':',dtime mod 100:2);
if ixj=ats then writeln('tiesa')
else begin writeln('NEtiesa. Ats.: ',ixj); dtime:=dtime+300 end;

b[mx]:=round((c[mx]*b[mx]+dtime)/(c[mx]+1));
c[mx]:=c[mx]+1;
end;

assign(t, fa);
rewrite(t);
writeln(t, vidg);
for i:=1 to ko*ko do begin
writeln(t, b[i]);
writeln(t, c[i]);
end;
close(t);

writeln('Ar zaidziam toliau? (1 - taip)');
readln(kla);
if kla <> 1 then

begin

writeln('Ar parodyti zemelapi? (1 - taip)');
readln(kla);
if kla = 1 then
begin
write(' 0 - 150: '); textcolor(15); writeln(#219); textcolor(7);
write('150 - 200: '); textcolor(14); writeln(#219); textcolor(7);
write('200 - 250: '); textcolor(10); writeln(#219); textcolor(7);
write('250 - 300: '); textcolor(11); writeln(#219); textcolor(7);
write('300 - 400: '); textcolor(9); writeln(#219); textcolor(7);
write('400 - 500: '); textcolor(13); writeln(#219); textcolor(7);
write('500 - + : '); textcolor(12); writeln(#219); textcolor(7);
write(' ');
for i:=1 to 30 do
for j:=1 to 30 do
begin
k:=j+(i-1)*ko;
if b[k]<= 100 then ats:=15
else if b[k]<= 150 then ats:=14
else if b[k]<= 200 then ats:=10
else if b[k]<= 350 then ats:=11
else if b[k]<= 450 then ats:=9
else if b[k]<= 550 then ats:=13
else ats:=12;
if b[k]=200 then ats:=7;
textcolor(ats);
if j<> 30 then write(c[k])
else begin writeln(c[k]); if (i mod 10)=0 then writeln; end;
if (j mod 10) = 0 then write(' ');
end;

end;
textcolor(7);

writeln('Ar zaidziam toliau? (1 - taip)');
readln(kla);
if kla <> 1 then
zaistidar:=false;
end;

end;
writeln('Sekmes! (iseiti - enter)');
readln;
end.

Memo žaidimas :)

Šią programą parašiau po šachmatų programos nepribaigimo (2011 kovo pradžioje)
Žaidimas "memo" yra kur kas lengvesnis, jeigu neskaityti to, kad viskas padarytas labai primityviai: reikia įsiminti ne paveikslėlius, o paprastus skaičius negrafinėje aplinkoje :)

Siūlau šią programą išbandyti, t.y. pažaisti žaidimą! (tiems, kas turi Pascalį (parsisiųsti))

2011-04-13 programą šiek tiek patobulinau, nes buvo keli "bugai", ir dar prirašiau neseniai išmoktą laiko skaičiavimo funkciją, (sužinojau iš šios internetinės vietos - http://scripterz.linija.net/v3/index.php?id=katalogas&f=145 ).

Vualia:

program Memo;
uses crt, dos;
const max=10;
type lentostipas = array [1..max,1..max] of integer;
type logtipas = array [1..max,1..max] of boolean;
type repxy = array [1..5] of integer;
var i,j, k,l, n, x,y, rep, repi: integer;
zaistidarsk, lenta, ilg, plo, varkie, pasirvar, indvar: integer;
atmp, inda : integer;
zaistidar, endgame, same : boolean;
v: array [1..3] of integer;
a: lentostipas;
s: logtipas;
xrep, yrep: repxy;
aa,as,ad,af: word; //1
qq,qw,qe,qr, times: word; //2
begin
clrscr;
randomize;

zaistidar:=true; v[3]:=1;
while zaistidar do
begin
writeln('pasirinkite lentos dydi, ivesdami atitinkama skaitmeni');
writeln('1 - 4x3, 2 - 5x4, 3 - 6x5, 4 - 8x6, 5 - 10x6');
readln(lenta);
if lenta=1 then begin ilg:=4; plo:=3; varkie:=2; v[1]:=2; v[2]:=3; end;
if lenta=2 then begin ilg:=5; plo:=4; varkie:=2; v[1]:=2; v[2]:=4; end;
if lenta=3 then begin ilg:=6; plo:=5; varkie:=2; v[1]:=2; v[2]:=3; end;
if lenta=4 then begin ilg:=8; plo:=6; varkie:=2; v[1]:=2; v[2]:=3; end;
if lenta=5 then begin ilg:=10;plo:=6; varkie:=3; v[1]:=2; v[2]:=3; v[3]:=5 end;
writeln('pasirinkite po kiek vienodu paveiksleliu bus poligone');
writeln('pasirinkimo variantai: ');
for i:=1 to 5 do
if lenta=i then for j:=1 to varkie do write(' ',v[j]:2);
writeln;
readln(pasirvar);
for j:=1 to varkie do if v[j]=pasirvar then indvar:=j;

for i:=plo downto 1 do //priskiriami skaiciai [1..ixj]
for j:=1 to ilg do
a[j,i]:=(i-1)*ilg+j;

for i:=plo downto 1 do //vienodu skaiciu sudarymas
for j:=1 to ilg do
a[j,i]:=(a[j,i]+v[indvar]-1) div v[indvar];

for n:=1 to 3 do //triskart ismaiso lenta
for i:=1 to plo do
for j:=1 to ilg do
begin
atmp:=a[j,i];
l:=random(plo)+1;
k:=random(ilg)+1;
a[j,i]:=a[k,l];
a[k,l]:=atmp;
end;

for i:=max downto 1 do //logiskai uzvienetinam kintamuju lauka
for j:=1 to max do s[j,i]:=true;
for i:=plo downto 1 do //logiskai uznulinam zaidziama lenta
for j:=1 to ilg do s[j,i]:=false;

GetTime(aa,as,ad,af);
repeat //1
begin
endgame:=true;

rep:=0;
repeat //1.1
begin
clrscr;
rep:=rep+1;
for i:=plo downto 1 do //parodom lenta
begin
for j:=1 to ilg do
if s[j,i] then write(' ',a[j,i]:2) else write(' -');
writeln;
end;
writeln;

writeln('iveskite langelio koord x ir y');
readln(x,y);
while not( (x<=ilg) and (y<=plo) and (x>0) and (y>0) ) or s[x,y] do
begin
if not( (x<=ilg) and (y<=plo) and (x>0) and (y>0) ) then
begin
writeln('uzribio koordinates! iveskite x ir y is naujo');
readln(x,y);
end
else
begin
writeln('si kortele jau atverta, pasirinkite kita');
readln(x,y);
end;
end;
s[x,y]:=true;
xrep[rep]:=x;
yrep[rep]:=y;

same:=true;
for repi:=1 to rep do
begin
inda:=a[xrep[1],yrep[1]];
same:=same and (inda=a[xrep[repi],yrep[repi]]);
end;

if not same then
begin
clrscr;
for i:=plo downto 1 do //parodom lenta
begin
for j:=1 to ilg do
if s[j,i] then write(' ',a[j,i]:2) else write(' -');
writeln;
end;
writeln;
delay(1000);
for repi:=1 to rep do
begin
s[xrep[repi],yrep[repi]]:=false;
end;
end;

end;
until (rep=v[indvar]) or (same=false) ; //1.1

for i:=plo downto 1 do //tikrinam ar visi langeliai atverti
for j:=1 to ilg do
endgame:=endgame and s[j,i];

end;
until endgame=true; //1
GetTime(qq,qw,qe,qr);
times:=((qq-aa)*360000+(qw-as)*6000+(qe-ad)*100+(qr-af));
writeln('Sprendimo laikas: ', times div 6000,' min, ',(times mod 6000) div 100,' sek, ',times mod 100);
writeln('jeigu norite zaisti dar, iveskite 1, jeigu ne - kita skaiciu');
readln(zaistidarsk);
if zaistidarsk<>1 then zaistidar:=false;
end;

writeln('viso gero!');
readln;
end.

[apatinio kairiojo langelio koordinatės yra (0|0)]

Nesėkmingas bandymas suprogramint šachmatus

Žiemą buvau pasirašęs šachmatų programos juodraštį. Pavasario pradžioje dar kartą prisėdau prie programos (2011-03-04+), tiksliau pradžioje prie sąsiuvinio, ir kelias valandas programinau sąsiuvinyje. Vėliau prisiruošiau bandyti perkelinėti viską į kompiuterį ir žiūrėti, kas gausis. Perkelinėjau į kompiuterį programą tokiame lygyje, kad žaisti galima: darant ėjimus, tačiau be tokių mandrų ėjimų, kaip rokiruotė, kirtimas prasilenkiant, figūros vertimas kita pasiekus paskutinę gulstinę ir pnš. Taipogi nebuvo realizuotas matas, t.y. žaidimo esmė: "pralaimėjimo varžovui paskelbimas".

Ir, po kelių pataisymų, tokia "betikslė" programa veikė.

Tada per dar kokias dvi dienas pažaidžiau su Pascaliu, kol išmokiau daryti leistinus ėjimus su karaliumi, reaguoti į šachus, drausti kirsti prasilenkiant netinkamu laiku. Visos tokios išimtys ir j apdorojimas užima daugiau kaip 2/3 programos teksto :/

Iš pradžių pateiksiu programos screenshotą, t.y. negrafinėje aplinkoje atvaizduotą partijos pradžios fragmentą, o toliau pateiksiu kodą.
Ši programa užima virš 300 eilučių, tai ilgiausia kada nors rašyta mano programa ir daugiausiai laiko.



program chessbeta_2011_03_04_RS;
uses crt;
// type figa= (_,R,N,B,Q,K,p);
var a: array [1..8,1..8] of integer;
mv: array [1..100] of integer;
n1: array [1..8] of boolean;
rok: array [1..20] of boolean;
i,j, move,mov, fig,en, atmp, R1,RR, ec, ko1,ko2,ko3,ko4, kn,km: integer;
x,y,v,z,kx,ky,bx,by,jx,jy, xx, max,max2,min2, che: integer;
kieno, kie,ch,ch2: string;
// f: figa;
check, enorm, boo1,boo2,boo3,bool,boor, nn,m, dmw,dmb, eQ, c1,c2: boolean;

begin
clrscr;

a[1,1]:=1; a[1,8]:=11; a[8,1]:=1; a[8,8]:=11; //bokstai
a[2,1]:=2; a[2,8]:=12; a[7,1]:=2; a[7,8]:=12; //zirgai
a[3,1]:=3; a[3,8]:=13; a[6,1]:=3; a[6,8]:=13; //rikiai
a[4,1]:=4; a[4,8]:=14; a[5,1]:=5; a[5,8]:=15; //valdoves ir karaliai
for i:=1 to 8 do begin a[i,2]:=6; a[i,7]:=16; end; //pestininkai
for i:=1 to 8 do for j:=3 to 6 do a[i,j]:=0; //tusti langeliai

bx:=5; by:=1; jx:=5; jy:=8; //pradines karaliu koordinates
R1:=0; move:=0; mv[1]:=9999; mov:=0; dmb:=false; dmw:=false;
while R1=0 do
begin
clrscr;

move:=move+1;
mov:=move mod 2;

for j:=8 downto 1 do //nupiesiama grazi lenta
begin
for i:=1 to 8 do
begin
if a[i,j] div 10 = 1 then ch2:='1' else ch2:='+';
if a[i,j] mod 10 = 0 then ch:='.' else
if a[i,j] mod 10 = 1 then ch:='R' else
if a[i,j] mod 10 = 2 then ch:='N' else
if a[i,j] mod 10 = 3 then ch:='B' else
if a[i,j] mod 10 = 4 then ch:='Q' else
if a[i,j] mod 10 = 5 then ch:='K' else
if a[i,j] mod 10 = 6 then ch:='p';
if a[i,j] mod 10 = 0 then write(' ',ch,' ') else
write(' ', ch2+ch:2);
end;
writeln;
end;
writeln;
for i:=1 to move do writeln(i:2,' from: ', mv[i] div 100:2,' to: ', mv[i] mod 100:2,' ',(i+1) div 2); //isspausdinamas ejimu sarasas


if mov=1 then kieno:='Baltieji' else kieno:='Juodieji';


if mov=1 then //konstantos baltuju...
begin
ko1:=10; ko2:=17; ko3:=-1; ko4:=6;
end;

if mov=0 then //konstantos juoduju...
begin
ko1:=0; ko2:=7; ko3:=1; ko4:=12;
end;

for i:=1 to 20 do rok[i]:=false; //rokiruotes galimos

repeat
begin
enorm:=true; // =kol kas ejimas normalus

repeat //nuskaitom ejimo koordinates
begin
writeln(kieno, ' atlikite ejima');
READLN(x,y,v,z);
m:=(x>0) and (y>0) and (v>0) and (z>0) and (x<9) and (y<9) and (v<9) and (z<9);
m:=m and (((mov=1) and (a[x,y] in [1..6])) or ((mov=0) and (a[x,y] in [11..16])));
if not m then writeln('klaida');
end;
until m=true;


if mov=1 then begin kx:=bx; ky:=by; end; //baltuju karaliaus koordinaciu nurasymas
if mov=0 then begin kx:=jx; ky:=jy; end; //juoduju karaliaus koordinaciu nurasymas
writeln('karalius: ',kx,' ',ky); //trinti veliau

{ check:=false; (...?)
...tikriname ar shachas...
if check=true then writeln('check!');
}
fig:=a[x,y]; en:=a[v,z];
writeln('fig:=a[x,y]= ',a[x,y],' en:=a[v,z]= ',a[v,z]); //trinti veliau


if fig in [1,11,4,14] then //bokstas (valdove)
begin
if fig in [1,11] then writeln('fig 1/11') else writeln('fig 4,14');
if ((en=0) or ((en>ko1) and (en
begin
if x-v<>0 then
begin
xx:=abs(x-v);
max:=(x+v+xx) div 2;
while xx>1 do
begin
max:=max-1; xx:=xx-1;
if a[max,y]<>0 then
begin enorm:=false; xx:=0; ec:=1; end;
end;
end;
if y-z<>0 then
begin
xx:=abs(y-z);
max:=(y+z+xx) div 2;
while xx>1 do
begin
max:=max-1; xx:=xx-1;
if a[x,max]<>0 then
begin enorm:=false; xx:=0; ec:=1; end;
end;
end;
end
else begin enorm:=false; ec:=3; end;
end;
eQ:=enorm;
enorm:=true;

if fig in [3,13,4,14] then //rikis (valdove)
begin
if fig in [3,13] then writeln('fig 3/13');
if ((en=0) or ((en>ko1) and (en
begin
if x-v=y-z then
begin
xx:=abs(x-v);
max:=(x+v+xx) div 2;
max2:=(y+z+xx) div 2;
while xx>1 do
begin
max:=max-1; max2:=max2-1; xx:=xx-1;
if a[max,max2]<>0 then
begin enorm:=false; xx:=0; ec:=1; end;
end;
end;
if x-v=z-y then //cia su klaidom kol kas palieku.... gal istaisiau?
begin
xx:=abs(x-v);
max:=(x+v+xx) div 2;
max2:=(y+z+xx) div 2;
min2:=max2-xx;
while xx>1 do
begin
max:=max-1; min2:=min2+1; xx:=xx-1;
if a[max,min2]<>0 then
begin enorm:=false; xx:=0; ec:=1; end;
end;
end;
end
else begin enorm:=false; ec:=3; end;
end;

if fig in [4,14] then //del valdoves
begin
if eQ or enorm then enorm:=true;
end
else enorm:=enorm and eQ;




if fig in [2,12] then //zirgas
begin
writeln('fig 2/12');
if ((en=0) or ((en>ko1) and (en
else begin enorm:=false; ec:=3; end;
end;


boo2:=false;

if fig in [6,16] then //pestininkai
begin
writeln('fig 6/16');
boo1:=(en=0) and (x=v) and (y-z=ko3); //+1
boo2:=(en=0) and (x=v) and ((y-z=2*ko3) and (y+z=ko4) and (a[x,(y+z) div 2]=0)); //+2
boo3:=((en>ko1) and (en
bool:=false;
if x>1 then bool:=(en=0) and (y-z=ko3) and (abs(x-v)=1) and (a[x-1,y]=6+ko1);
if mov=1 then bool:=bool and dmb;
if mov=0 then bool:=bool and dmw;
boor:=false;
if x<8 then boor:=(en=0) and (y-z=ko3) and (abs(x-v)=1) and (a[x+1,y]=6+ko1);
if mov=1 then boor:=boor and dmb;
if mov=0 then boor:=boor and dmw;

if (boo1=true) or (boo2=true) or (boo3=true) or (bool=true) or (boor=true) then
enorm:=true
else begin enorm:=false; ec:=3; end;
end;

if (mov=1) then if (boo2=true) then dmw:=true else dmw:=false;
if (mov=0) then if (boo2=true) then dmb:=true else dmb:=false;
//...klaida dmw kai true, tada ir i kaire ir i desine kirsti galima...

if fig in [5,15] then //karalius
begin
writeln('fig 5/15');
if ((en=0) or ((en>ko1) and (en<=1) and (abs(y-z)<=1) then enorm:=true
else begin enorm:=false; ec:=3; end;

end;


{ if fig=4 ... //valdove
...tikrinam ar leistinas ejimas...
(kazkaip sunkiai pridejau prie rikio ir boksto)
}
if (mov=1) and (a[x,y]=5) and enorm then begin kx:=v; ky:=z; end;
if (mov=0) and (a[x,y]=15) and enorm then begin kx:=v; ky:=z; end;
atmp:=a[v,z]; a[v,z]:=a[x,y]; a[x,y]:=0;
writeln('atmp:=a[v,z]; a[v,z]:=a[x,y]; ',atmp,' ',a[v,z]); //trinti veliau


{ //idesime sacho tikrinima
che:=0;
repeat
begin
che:=che+1;
if che=2 then
begin a[x,y]:=a[v,z]; a[v,z]:=atmp; end;
if che=3 then
begin a[x,y]:=a[v,z]; a[v,z]:=atmp; a[(x+v) div 2,y] end;
if a[v,z] in [5,15]}

check:=false;
//tikriname ar shachas?

//ar shachas nuo boksto/valdoves?
kn:=kx; km:=ky;
while kn<8 do //1
begin
kn:=kn+1;
if (a[kn,km]-ko1) in [1,4] then check:=true;
if ((a[kn,km]+ko1) in [11..16]) or ((a[kn,km]-ko1) in [2,3,5,6]) then kn:=8;
end;
writeln('is desines ',check);
kn:=kx; km:=ky;
while km<8 do //2
begin
km:=km+1;
if (a[kn,km]-ko1) in [1,4] then check:=true;
if ((a[kn,km]+ko1) in [11..16]) or ((a[kn,km]-ko1) in [2,3,5,6]) then km:=8;
end;
writeln('is virsaus ',check);
kn:=kx; km:=ky;
while kn>1 do //3
begin
kn:=kn-1;
if (a[kn,km]-ko1) in [1,4] then check:=true;
if ((a[kn,km]+ko1) in [11..16]) or ((a[kn,km]-ko1) in [2,3,5,6]) then kn:=1;
end;
writeln('is kaires ',check);
kn:=kx; km:=ky;
while km>1 do //4
begin
km:=km-1;
if (a[kn,km]-ko1) in [1,4] then check:=true;
if ((a[kn,km]+ko1) in [11..16]) or ((a[kn,km]-ko1) in [2,3,5,6]) then km:=1;
end;
writeln('is apacios ',check);

//ar shachas nuo zirgo?
kn:=kx; km:=ky;
for i:=1 to 8 do n1[i]:=false;
if (kn-2>0) and (kn-2<9) and (km-1>0) and (km-1<9) then n1[1]:= (a[kn-2,km-1]-ko1=2);
if (kn-2>0) and (kn-2<9) and (km+1>0) and (km+1<9) then n1[2]:= (a[kn-2,km+1]-ko1=2);
if (kn-1>0) and (kn-1<9) and (km-2>0) and (km-2<9) then n1[3]:= (a[kn-1,km-2]-ko1=2);
if (kn-1>0) and (kn-1<9) and (km+2>0) and (km+2<9) then n1[4]:= (a[kn-1,km+2]-ko1=2);
if (kn+1>0) and (kn+1<9) and (km-2>0) and (km-2<9) then n1[5]:= (a[kn+1,km-2]-ko1=2);
if (kn+1>0) and (kn+1<9) and (km+2>0) and (km+2<9) then n1[6]:= (a[kn+1,km+2]-ko1=2);
if (kn+2>0) and (kn+2<9) and (km-1>0) and (km-1<9) then n1[7]:= (a[kn+2,km-1]-ko1=2);
if (kn+2>0) and (kn+2<9) and (km+1>0) and (km+1<9) then n1[8]:= (a[kn+2,km+1]-ko1=2);
nn:=false;
for i:=1 to 8 do nn:=nn or n1[i];
if nn=true then check:=true;
writeln;
writeln(check);

//ar shachas nuo rikio/valdoves/pestininko?
kn:=kx; km:=ky;
while (kn<8) and (km<8) do //1
begin
kn:=kn+1; km:=km+1;
if (a[kn,km]-ko1) in [3,4] then check:=true;
if mov=1 then if (a[kn,km]=16) and (kn-kx=1) then check:=true;
if (a[kn,km]<>0) then kn:=8;
end;
writeln('++ ',check);
kn:=kx; km:=ky;
while (kn>1) and (km>1) do //2
begin
kn:=kn-1; km:=km-1;
if (a[kn,km]-ko1) in [3,4] then check:=true;
if mov=0 then if (a[kn,km]=6) and (kn-kx=-1) then check:=true;
if (a[kn,km]<>0) then kn:=1;
end;
writeln('-- ',check);
kn:=kx; km:=ky;
while (kn<8) and (km>1) do //3
begin
kn:=kn+1; km:=km-1;
if (a[kn,km]-ko1) in [3,4] then check:=true;
if mov=0 then if (a[kn,km]=6) and (kn-kx=1) then check:=true;
if (a[kn,km]<>0) then kn:=8;
end;
writeln('+- ',check);
kn:=kx; km:=ky;
while (kn>1) and (km<8) do //4
begin
kn:=kn-1; km:=km+1;
if (a[kn,km]-ko1) in [3,4] then check:=true;
if mov=1 then if (a[kn,km]=16) and (kn-kx=-1) then check:=true;
if (a[kn,km]<>0) then kn:=1;
end;
writeln('-+ ',check);

{ if che=2 then
begin
atmp:=a[v,z]; a[v,z]:=a[x,y];
if check then c1:=true else c1:=false;
if not cast then che:=che+1;
end; }

{ end;
until che=3 ;
//idesime sacho tikrinima
}

if check=true then
begin writeln('neleistinas ejimas. testi: 0, pasiduoti: 1');
readln(RR);
enorm:=false; ec:=2;
end;


a[x,y]:=a[v,z]; a[v,z]:=atmp;
if (mov=1) and (a[x,y]=5) then begin kx:=bx; ky:=by; end;
if (mov=0) and (a[x,y]=15) then begin kx:=jx; ky:=jy; end;

if enorm=false then
begin
if ec=1 then writeln('kelyje trukdo figura, ec 1');
if ec=2 then writeln('neleistinas ejimas: sachas, ec 2');
if ec=3 then writeln('uzimtas langelis, ec 3');
end;

//rokiruociu aprasas
rok[1]:= enorm and (a[x,y] =1) and (x=1);
rok[2]:= enorm and (a[x,y] =1) and (x=8);
rok[3]:= enorm and (a[x,y]=11) and (x=1);
rok[4]:= enorm and (a[x,y]=11) and (x=8);
for i:=5 to 8 do rok[i]:=rok[i] or rok[i-4]; //ar sugadinti bokstai
rok[9]:= enorm and (a[x,y]= 5) and (abs(x-v)<=1) and (abs(y-z)<=1);
rok[10]:= enorm and (a[x,y]=15) and (abs(x-v)<=1) and (abs(y-z)<=1);
for i:=5 to 8 do rok[i]:=rok[i] or rok[((i+1) div 2)+6]; //ar sugadinti karaliai


end;
until (enorm=true) or (RR=1);

mv[move]:=x*1000+y*100+v*10+z;
if fig=5 then begin bx:=v; by:=z; writeln('fig 5! ',bx,' ',by,' bx:=v; by:=z;'); end;
if fig=15 then begin jx:=v; jy:=z; writeln('fig15! ',jx,' ',jy,' jx:=v; jy:=z;'); end;

a[v,z]:=a[x,y]; a[x,y]:=0;
if bool or boor then a[v,z+ko3]:=0; //kirtimui prasilenkiant

if RR=1 then R1:=RR;
end;


if mov=1 then writeln('juodieji laimejo') else writeln('baltieji laimejo');
readln;

end.