#include #include #include #include #include void menu(); void kadr(); void left(); void right(); void rotate(); void down(); void clean(); void draw(); void refresh(); void fix(); void checkscore(); void delrow(int ); void checkend(); int checklimit(); int checkscreen(); int score,LEVEL; int X = 40 , Y = 8 ,LIMIT_RIGHT=51, LIMIT_LEFT=30 ,LIMIT_DOWN=40; int POLY , FORM ; int x_poly[6][4][6]={ { {0,1,1,1,88},{-1,0,-1,1,88},{-1,-1,-1,0,88},{1,1,0,-1,88}} ,{ {0,1,0,-1,88},{0,1,1,1,88},{0,-1,0,1,88},{0,-1,-1,-1,88} } ,{ {1,1,1,1,88},{-2,-1,0,1,88},{1,1,1,1,88},{-2,-1,0,1,88}} ,{ {0,0,-1,88},{-1,0,0,88},{-1,0,-1,88},{-1,0,-1,88} } ,{ {0,1,0,-1,0,88},{0,1,0,-1,0,88},{0,1,0,-1,0,88}, {0,1,0,-1,0,88}} ,{ {0,-1,0,-1,88},{0,-1,-1,-2,88},{0,-1,0,-1,88},{0,-1,-1,-2,88} } }; int y_poly[6][4][6]={ { {-1,0,-1,1,88},{-1,-1,0,-1,88},{-1,0,1,1,88},{0,1,1,1,88} } ,{ {0,1,1,1,88},{0,-1,0,1,88},{0,-1,-1,-1,88},{0,-1,0,1,88} } ,{ {-1,0,1,2,88},{0,0,0,0,88},{-1,0,1,2,88},{0,0,0,0,88} } ,{ {0,-1,0,88},{-1,0,-1,88},{-1,-1,0,88},{-1,0,0,88} } ,{ {0,0,1,0,-1,88},{0,0,1,0,-1,88},{0,0,1,0,-1,88},{0,0,1,0,-1,88} } ,{ {0,0,-1,1,88},{0,0,-1,-1,88},{0,0,-1,1,88},{0,0,-1,-1,88} } }; int screen[80][50]; main() { textmode(C4350); clrscr(); menu(); clrscr(); clock_t start=0, end; randomize(); textcolor(4); gotoxy(65,3);cprintf("SCORE : %d",score); POLY = random(6); FORM = random(4); textcolor(10); kadr(); textcolor(9); draw(); while(1){ if(kbhit()){ char ch = getch(); switch(ch){ case 72 : rotate();break; case 75 : left() ;break; case 77 : right() ;break; case 80 : down() ;break; case 27 : main(); }//switch() }//if end = clock(); if((end - start)/CLK_TCK >= 0.5/float(LEVEL) ) { refresh(); start = end; } }//while() } // main() void left(){ clean(); X--; if( !checklimit() || !checkscreen() )X++; draw(); } void right(){ clean(); X++; if( !checklimit() || !checkscreen() )X--; draw(); } void rotate(){ if(POLY==1&&FORM==3&&X==50)return;// halate estesna baray shekle 2 va forme 4 clean(); FORM = ++FORM%4 ; if( !checklimit() || !checkscreen() )FORM--; draw(); } void down(){ clean(); Y++; int step=1; while(step<=5){ if(!checkscreen()){Y--;break;} else { Y++; step++;continue ;} }//while if(!checkscreen())Y--; draw(); } int checklimit(){ for(int i=0;x_poly[POLY][FORM][i]!=88;i++) if( X+x_poly[POLY][FORM][i] <= LIMIT_LEFT || X+x_poly[POLY][FORM][i] >= LIMIT_RIGHT)return 0 ; return 1; } void clean(){ for(int i=0;x_poly[POLY][FORM][i]!=88;i++){ gotoxy(X+x_poly[POLY][FORM][i],Y+y_poly[POLY][FORM][i]); printf(" "); }//for } void draw(){ for(int i=0;x_poly[POLY][FORM][i]!=88;i++){ textcolor(9); gotoxy(X+x_poly[POLY][FORM][i],Y+y_poly[POLY][FORM][i]); cprintf("%c",219); gotoxy(79,45); }//for } void refresh(){ clean(); Y++; if(!checkscreen()){Y--;draw();fix();} draw(); } int checkscreen(){ for( int i = 0 ; y_poly[POLY][FORM][i] != 88 ; i++ ) if( Y + y_poly[POLY][FORM][i] >= LIMIT_DOWN ) return 0; for( i = 0 ; x_poly[POLY][FORM][i] != 88 ; i++ ) if( screen [ X+x_poly[POLY][FORM][i] ] [Y + y_poly[POLY][FORM][i]] == -1)return 0; return 1; }//checkscreen() void fix(){ for(int i = 0 ; x_poly[POLY][FORM][i] != 88 ; i++ ) screen[X+x_poly[POLY][FORM][i]][Y+y_poly[POLY][FORM][i]] = -1; X = 40 , Y = 8; POLY = random(6); FORM = random(4); checkscore(); checkend(); }//fix() void kadr(){ for(int i=8 ; i<=LIMIT_DOWN ; i++){ gotoxy(LIMIT_LEFT , i); cprintf("%c",219); gotoxy(LIMIT_RIGHT, i); cprintf("%c",219); }//for for( i=LIMIT_LEFT ; i<=LIMIT_RIGHT ; i++){ gotoxy(i , LIMIT_DOWN); cprintf("%c" , 219); }//for textcolor(7); gotoxy(2,45);cprintf("ESC = quite"); }//kadr() void checkscore(){ int count=0; for( int j=LIMIT_DOWN ; j>=1; j-- ){ for( int i = LIMIT_LEFT+1 ; i < LIMIT_RIGHT ; i++ ){ if(screen[i][j]!=-1) break ; if(i==LIMIT_RIGHT-1) {delrow(j); count++ ; j=LIMIT_DOWN;} }//for }//for score=score+100*count; textcolor(4); gotoxy(73,3);cprintf("%d",score); } void delrow(int j){ for(int i=LIMIT_LEFT+1;i=1;k--){ for( i=LIMIT_LEFT+1 ; i1) LEVEL-- ; else continue;gotoxy(18,i);cprintf(" "); gotoxy(18,i=i-2);cprintf("%c",219);break; case 80: if(LEVEL <10) LEVEL++ ; else continue;gotoxy(18,i);cprintf(" ");gotoxy(18,i=i+2);cprintf("%c",219);break; case 13: return; case 27: exit(0); }//switch }//while }//menu()