Localize file www.TrSek.com/cover/draco/mines2.pas{ MINES2.PAS Copyright (c) Soul-Draco }
{ }
{ Mines v 1.0 }
{ =========== }
{ Created by soul_draco www.soul-draco.tk }
{ Program na hratie min simulujuce Mines z Windows. }
{ }
{ Datum:02.06.2005 http://www.trsek.com }
uses crt,graph,mouse;
const mines = 200; { pocet min v poli }
width = 42; { sirka pole ( v polickach ) max 42 }
height = 32; { sirka pole ( v polickach ) max 32 }
size = 15; { strana policka }
type tfield = record
content : shortint; { policko, jak je ve skutecnosti }
visible : shortint; { policko, jak ho hrac vidi }
onscreen : shortint; { policko, jak je vykreslene }
end;
var gd,gm,i,j : integer;
ch : char;
field : array[-2..43,-2..33] of tfield;
{ hodnoty ve field :
0 - nezname policko
1 - 8 - cislice znacici pocet prilehlych min
9 - mina
10 - praporek
11 - prazdne policko }
{ inicializuje grafiku, generator nahodnych cisel a mys }
procedure init;
var gd,gm : integer;
begin
randomize;
gd:=detect;
initgraph(gd,gm,'');
limitmousex(0,639);
limitmousey(0,479);
end;
{ ***************************************************************************
Prace s polem
*************************************************************************** }
{ spocita miny prilehle k policku[x,y]. pokud je policko samo mina, vrati 9 }
function countadjacentmines(x,y : integer) : shortint;
var i,j,counter : integer;
begin
counter:=0;
if (field[x,y].content = 9) then begin
countadjacentmines:=9;
exit;
end;
for j:=(y - 1) to (y + 1) do for i:=(x - 1) to (x + 1) do
if (field[i,j].content = 9) then inc(counter);
if (counter = 0) then counter:=11;
countadjacentmines:=counter;
end;
{ odhali vsechna policka prilehla k policku[x,y]
pokud jsou jiz vsechna odhalena, vrati false }
function showadjancedfields(x,y : integer) : boolean;
var i,j : integer;
b : boolean;
begin
b:=false;
for j:=(y - 1) to (y + 1) do for i:=(x - 1) to (x + 1) do
if (field[i,j].visible <> field[i,j].content) then begin
field[i,j].visible:=field[i,j].content;
b:=true;
end;
showadjancedfields:=b;
end;
{ vygeneruje nove pole }
procedure generatefield;
var i,j : integer;
begin
{ ********************* vyprazdneni pole onscreen ************************* }
for j:=-1 to height do for i:=-1 to width do
field[i,j].onscreen:=99; { nesmysl - musi prekreslit }
{ *********************** generovani pole VISIBLE ************************* }
{ vyplneni celeho pole neznamymy policky }
for j:=-1 to height do for i:=-1 to width do
field[i,j].visible:=0;
{ *********************** generovani pole CONTENT ************************* }
{ vyplneni celeho pole prazdnymi policky }
for j:=-1 to height do for i:=-1 to width do field[i,j].content:=11;
{ vygenerovani min . . . potom predelat, aby nesly pres sebe }
for i:=0 to (mines - 1) do
field[random(width),random(height)].content:=9;
{ vygenerovani cislic oznacujicich pocet min }
for j:=-1 to height do for i:=-1 to width do
field[i,j].content:=countadjacentmines(i,j);
end;
{ projede pole a okolo kazdeho prazdneho policka odkryje prilehla policka }
procedure a;
var i,j : integer;
b : boolean;
begin
b:=false;
for j:=-1 to height do for i:=-1 to width do
if (field[i,j].visible = 11) then begin
if showadjancedfields(i,j) then a;
end;
end;
procedure checkfield;
var i,j,counter : integer;
begin
counter:=0;
for j:=0 to height - 1 do for i:=0 to width - 1 do begin
if (field[i,j].content <> field[i,j].visible) then inc(counter);
if (field[i,j].content = 9) and (field[i,j].visible = 10) then dec(counter);
end;
if (counter = 0) then win;
end;
{ odhali vsechny miny a zepta se na pokracovani }
procedure gameover;
var i,j : integer;
begin
for j:=-1 to height do for i:=-1 to width do
if (field[i,j].content = 9) then begin
field[i,j].visible:=9;
end;
redrawfield;
readkey;
ch:=#13;
end;
begin
init;
generatefield;
redrawfield;
setmousecursor(zapnuto);
repeat
ch:=#0;
{ pri kliknuti }
if mousebut(1) then begin
{ odhaleni policka }
field[getmousex,getmousey].visible:=field[getmousex,getmousey].content;
if (field[getmousex,getmousey].visible = 9) then gameover;
{}
a;
redrawfield;
checkfield;
end;
if mousebut(2) then begin
{ odhaleni policka }
if (field[getmousex,getmousey].visible = 0) then
field[getmousex,getmousey].visible:=10 else
if (field[getmousex,getmousey].visible = 10) then
field[getmousex,getmousey].visible:=0;
{}
a;
redrawfield;
checkfield;
delay(200);
end;
if keypressed then ch:=readkey;
if ch = #13 then begin
generatefield;
redrawfield;
end;
until ch = #27;
setmousecursor(vypnuto);
closegraph;
end.