//--------------------------------------------------------------------------- #include #pragma hdrstop #include #include "Unit1.h" #include #include //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" //---------------------------------------------------------------------------- /////DECLARARI SI INITIALIZARI DE VARIABILE/////////////////////// TForm1 *Form1; int a[22][12],x[6],y[6],ax[6],ay[6],matrice[27][17],nn,x1,y1,ax1,ay1; int n,i,j,k,fig,v,nrp; int matricen,matricem,m,lin; int spre_dreapta,nr_rotatii_efectuate,rotatii_posibile,done_dreapta; int v_linii[10],numar_lin,gaurele; int v_best[10],suprafata; int linii_complete=0, piese_aparute=0; int nr_piese; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::afismat() { Canvas->Brush->Color=clBlack; Canvas->FillRect(Rect(20,0,220,400)); for (i=1;i<=20;i++) for(j=1;j<=10;j++) if (a[i][j]!=0) { set_culoare(a[i][j]); Canvas->FillRect(Rect(j*20,(i-1)*20,(j+1)*20-1,i*20-1)); } } void __fastcall TForm1::afispiesa(int cul) { set_culoare(cul); for (i=1;i<=nrp;i++) Canvas->FillRect(Rect((x[i])*20,(y[i]-1)*20,(x[i]+1)*20-1,y[i]*20-1)); } void __fastcall TForm1::set_culoare(int cul) { switch(cul) { case 0: Canvas->Brush->Color=clBlack; break; case 1: Canvas->Brush->Color=clMaroon; break; case 2: Canvas->Brush->Color=clBlue; break; case 3: Canvas->Brush->Color=clGreen; break; case 4: Canvas->Brush->Color=clPurple; break; case 5: Canvas->Brush->Color=clTeal; break; case 6: Canvas->Brush->Color=clGray; break; case 7: Canvas->Brush->Color=clSilver; break; case 8: Canvas->Brush->Color=clYellow; break; case 9: Canvas->Brush->Color=clFuchsia; break; case 10: Canvas->Brush->Color=clWhite; break; case 11: Canvas->Brush->Color=clAqua; break; case 12: Canvas->Brush->Color=clLime; break; case 13: Canvas->Brush->Color=clNavy; break; case 14: Canvas->Brush->Color=clOlive; break; default: Canvas->Brush->Color=clRed; } } //------------------------------------------------------------------- void __fastcall TForm1::FormPaint(TObject *Sender) { afismat(); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { FILE *f1; f1=fopen("matricea1.txt","rt"); fig=1; i=0; fscanf(f1,"%d",&nr_piese); for (k=1;k<=nr_piese;k++) { //se pun in matrice coordonatele pieselor i++; fscanf(f1,"%d",&matrice[i][1]); for (j=2;j<=(2*matrice[i][1])+5;j++) fscanf(f1,"%d",&matrice[i][j]); } matricem=10; matricen=nr_piese; for (i=0;i<=21;i++) { //se initializeaza marginile cu 1(adica ocupat) a[i][0]=1; a[i][11]=1; } for (j=0;j<12;j++) { a[21][j]=1; } m=10; n=20; randomize(); } //---------------------------------------------- void stanga() {for(i=1;i<=nrp;i++) {ax[i]=x[i]-1; ay[i]=y[i]; } ax1=x1-1; ay1=y1; } void dreapta() {for (i=1;i<=nrp;i++) {ax[i]=x[i]+1; ay[i]=y[i]; } ax1=x1+1; ay1=y1; } void jos() {for (i=1;i<=nrp;i++) {ay[i]=y[i]+1; ax[i]=x[i]; } ax1=x1; ay1=y1+1; } void rotire() { for(i=1;i<=nrp;i++) { ay[i]=x[i]-x1+y1; ax[i]=nn-y[i]+x1+y1-1; } ax1=x1;ay1=y1; } void linii() { i=20; while (i>=1) { lin=1; for (j=1;j<11;j++) if (a[i][j]==0) {lin=0;break;} if (lin) { linii_complete++; for(k=i;k>1;k--) for (j=1;j<11;j++) a[k][j]=a[k-1][j]; } else i--; } } int se_poate() { for (i=1;i<=nrp;i++) if (a[ay[i]][ax[i]]!=0) return 0; return 1; //daca se poate } void fac() {for (i=1;i<=nrp;i++) {x[i]=ax[i]; y[i]=ay[i]; } x1=ax1;y1=ay1; } void piesa() { nrp=matrice[v][1]; for (i=1;i<=nrp;i++) {x[i]=matrice[v][(i*2)]; y[i]=matrice[v][i*2+1];} x1=matrice[v][2*nrp+2]; y1=matrice[v][2*nrp+3]; nn=matrice[v][2*nrp+4]; rotatii_posibile=matrice[v][2*nrp+5]; } //----------------------------------------- void nr_gaurele_dedesubt() { int t; gaurele=0; int lin_i=0; for(i=1;i<=nrp;i++) { t=1; for (j=1;j<=numar_lin;j++) if (y[i]==v_linii[j]) {t=0;break;} if (t) { lin_i=y[i]+1; while (a[lin_i][x[i]]==5)lin_i++; while(a[lin_i][x[i]]==0) { gaurele++; lin_i++; } } } } void ce_linii_se_fac() { int t; numar_lin=0; for(i=1;i<=20;i++) { t=1; for(j=1;j<=10;j++) if (a[i][j]==0){t=0;break;} if (t) { numar_lin++; v_linii[numar_lin]=i; for (j=1;j<=nrp;j++) if (y[j]==i) a[i][x[j]]=5; } } } void the_best() { v_best[1]=x1; v_best[2]=nr_rotatii_efectuate; v_best[3]=gaurele; v_best[4]=suprafata; v_best[5]=y1; } void suprafatza_de_contact() { suprafata=0; for (i=1;i<=nrp;i++) { if (a[y[i]][x[i]-1]!=0) suprafata++; if (a[y[i]][x[i]+1]!=0) suprafata++; if (a[y[i]-1][x[i]]!=0) suprafata++; if (a[y[i]+1][x[i]]!=0) suprafata++; } } //----------------------------------------------- void __fastcall TForm1::AI() { v_best[3]=20;v_best[5]=0; nr_rotatii_efectuate=0; spre_dreapta=0; while(nr_rotatii_efectuate<=rotatii_posibile) { piesa(); for(k=1;k<=nr_rotatii_efectuate;k++) { rotire(); fac(); } stanga(); while(se_poate()) { //face stanga cat se poate fac(); stanga(); } done_dreapta=0; for(k=1;k<=spre_dreapta;k++) { dreapta(); if(se_poate()) { fac(); } else { //dc nu poate face dreapta inseamna //ca a ajuns la capat si trebuie sa treaca la //rotatia urmatoare nr_rotatii_efectuate++; spre_dreapta=0; done_dreapta=1; } } //acum a ajuns pe pozitia de verificat(sus) if(!done_dreapta) { jos(); while(se_poate()) { fac(); jos(); } //acum a ajuns cat de jos poate for(i=1;i<=nrp;i++) a[y[i]][x[i]]=1; /////urmeaza chestii de testat//// ce_linii_se_fac(); nr_gaurele_dedesubt(); suprafatza_de_contact(); //-------------------------- if (gaurelev_best[4])the_best(); else if(suprafata==v_best[4]) if (y1>v_best[5]) the_best(); //------------------------------ //a terminat de analizat o pozitie si trece la urmatoarea spre_dreapta++; for (i=1;i<=nrp;i++) a[y[i]][x[i]]=0; } } } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { ////cu ai/////// if (fig) { Label5->Caption=++piese_aparute; Label3->Caption=linii_complete; v=random(matricen)+1; fig=0; piesa(); for (i=1;i<=nrp;i++) if (a[y[i]][x[i]]!=0) { //game over Timer1->Enabled=false; Label1->Visible=true; break; } AI(); piesa();//pune in x si y coordonatele piesei ce va aparea afispiesa(v); } else { //la propriu if (v_best[2]!=0) //v_best[2]=nr de rotiri ce trebuie efectuate { rotire(); afispiesa(0); fac(); afispiesa(v); v_best[2]--; } else if (v_best[1]x1) { //locul cel bun e in dreapta dreapta(); afispiesa(0); fac(); afispiesa(v); } //acum e pe coloana buna else { jos(); if(se_poate()) { afispiesa(0); fac(); afispiesa(v); } else { for (i=1;i<=nrp;i++) a[y[i]][x[i]]=v; fig=1; linii(); afismat(); } } } } /* /////////////fara ai///////////// if (fig) { Label5->Caption=++piese_aparute; Label3->Caption=linii_complete; v=random(matricen)+1; fig=0; piesa();//pune in x si y coordonatele piesei ce va aparea afispiesa(v); for (i=1;i<=nrp;i++) if (a[y[i]][x[i]]!=0) { Timer1->Enabled=false; Label1->Visible=true; break; } } else { jos(); if (se_poate()) { afispiesa(0); fac(); afispiesa(v); } else { for (i=1;i<=nrp;i++) a[y[i]][x[i]]=v; fig=1; linii(); afismat(); } } }*/ //--------------------------------------------------------------------------- void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key) { switch (Key) { case 'a':stanga();break; case 'd':dreapta();break; case 'w':rotire();break; case 's':jos();break; } if (se_poate()) { afispiesa(0); fac(); afispiesa(v); } } //--------------------------------------------------------------------------- void __fastcall TForm1::New1Click(TObject *Sender) { //resetari reveniri la starea initiala for(i=1;i<=20;i++) for(j=1;j<=10;j++) a[i][j]=0; afismat(); fig=1; i=0; piese_aparute=0; linii_complete=0; Timer1->Enabled=true; } void __fastcall TForm1::Exit1Click(TObject *Sender) { Application->Terminate(); } //---------------------------------------------------------------------------