#include #include #include #include #include #include #include #include #include #define BGI "c:\\bc5\\bgi" int MaxX,MaxY,x1,y1; int maxx,minx,maxy,miny,mst,nbt; int bst,x,y,lb,rb; int driver,mode; int i,j,n,ver; int MaxColor; struct REGPACK m; void cpu(int **a , int x , int y , int n ); void proverka(int **a , int x , int y ,int n); void lb_func(int **a , int ver , int x1 , int y1 ); void setka(int **a , int ver); void initilize_graph(); void analize( int& , int& , int& ); void m_0(int m_st , int n_but ); void m_show( void ); void m_hide( void ); void m_check( int &but_st , int &x_coord , int &y_coord ); void m_move( int x , int y ); void m_horiz_range( int minx , int maxx ); void m_vert_range( int miny , int maxy ); void m_sens( int senx , int seny ); //----------------------------------------------------------------------------// void main() { do { printf("Vvedite n ( n<3 || n>16 ) --> "); cin>>n; ver=480/n; } while (n<3 || n>16); int **a = new int *[n]; for ( i = 0 ; i <=n ; i++ ) a[i] = new int [n+1]; initilize_graph(); m_0(mst,nbt); m_show(); m_sens(0,0); do { m_check(bst,x,y); analize(bst,lb,rb); gotoxy(75,2); setka(a,ver); if (lb==0&&a[(y/ver)+1][(x/ver)+1]==0) { if (x>ch; clearviewport (); }while(ch<1 || ch>n); a[y1][x1]=ch; } //////////////////////////////////////////////////////////////////////////////// void proverka(int **a ,int x , int y , int n ) { int i,j,go=0,x2=0,y2=0,k,m; for(m=1;m<=n;m++){ for (ii=1;ii<=n;ii++){ for (jj=1;jj<=n;jj++){ if (a[ii][jj]=0;{ a[ii][jj]=m;} //Proverka po gorizontali rabotaet // for ( i = 1 ; i <= n ; i++ ){ // if ( i!=jj ){ // if ( a[ii][i] == a[ii][jj] ){ // go=1;}}} //Proverka vertikali ne rabotaet // for ( i = 1 ; i <=n ; i++ ){ // if ( i!=ii ){ // if ( a[i][jj] == a[ii][jj] ){ // go=1;}}} //Proverka prav.niz for (i=ii+1,j=jj+1; i==n || j==n ; i++,j++) if( a[i][j]==a[ii][jj] ) go=1; //Proverka lev.verh for (i=ii-1,j=jj-1; i==1 || j==1 ; i--,j--) if( a[i][j]==a[ii][j] ) go=1; //Proverka lev.niz for (i=ii+1,j=jj-1; i==1 || j==1 || i==n || j==n ; i++,j--) if( a[i][j]==a[ii][jj] ) go=1; //Proverka prav.verh for (i=ii-1,j=jj+1; i==1 || j==1 || i==n || j==n ; i--,j++) if( a[i][j]==a[ii][jj] ) go=1; if (go==0){ ii=n; jj=n m=n;} }}} if (go==1){ do{ settextstyle(0,0,6); moveto(MaxX/2-200,MaxY/2-50); setcolor(random(14)+1); outtext("YOU WIN"); delay(500); }while(!kbhit());restorecrtmode();} } //////////////////////////////////////////////////////////////////////////////// void cpu (int **a , int x , int y , int n ) { int i,j,go=0,x2=0,y2=0,k,ii,jj; x2=(x/ver)+1; y2=(y/ver)+1; //Proverka po gorizontali rabotaet // for ( i = 1 ; i <= n ; i++ ){ // if ( i!=x2 ){ // if ( a[y2][i] == a[y2][x2] ){ // go=1;}}} //Proverka vertikali ne rabotaet // for ( i = 1 ; i <=n ; i++ ){ // if ( i!=y2 ){ // if ( a[i][x2] == a[y2][x2] ){ // go=1;}}} //Proverka prav.niz for (i=y2+1,j=x2+1; i==n || j==n ; i++,j++) if( a[i][j]==a[y2][x2] ) go=1; //Proverka lev.verh for (i=y2-1,j=x2-1; i==1 || j==1 ; i--,j--) if( a[i][j]==a[y2][x2] ) go=1; //Proverka lev.niz for (i=y2+1,j=x2-1; i==1 || j==1 || i==n || j==n ; i++,j--) if( a[i][j]==a[y2][x2] ) go=1; //Proverka prav.verh for (i=y2-1,j=x2+1; i==1 || j==1 || i==n || j==n ; i--,j++) if( a[i][j]==a[y2][x2] ) go=1; // Viviod GAME OVER if (go==1){ do{ settextstyle(0,0,6); moveto(MaxX/2-200,MaxY/2-50); setcolor(random(14)+1); outtext("GAME OVER"); delay(500); }while(!kbhit());restorecrtmode();} } //----------------------------------------------------------------------------// //----------------------------------------------------------------------------// void m_0(int m_st,int n_but) {m.r_ax=0; intr(0x33,&m); m_st=m.r_ax; n_but=m.r_bx;} //////////////////////////////////////////////////////////////////////////////// void m_show(void) {m.r_ax=1; intr(0x33,&m);} //////////////////////////////////////////////////////////////////////////////// void m_hide(void) {m.r_ax=1; intr(0x33,&m);} //////////////////////////////////////////////////////////////////////////////// void m_check(int&but_st,int&x_coord,int&y_coord) {m.r_ax=3; intr(0x33,&m); but_st=m.r_bx; x_coord=m.r_cx; y_coord=m.r_dx;} //////////////////////////////////////////////////////////////////////////////// void m_move(int x,int y) {m.r_ax=4; m.r_cx=x; m.r_dx=y; intr(0x33,&m);} //////////////////////////////////////////////////////////////////////////////// void m_horiz_range(int minx,int maxx) {m.r_ax=7; m.r_cx=minx; m.r_dx=maxx; intr(0x33,&m);} //////////////////////////////////////////////////////////////////////////////// void m_vert_range(int miny,int maxy) {m.r_ax=8; m.r_cx=miny; m.r_dx=maxy; intr(0x33,&m);} //////////////////////////////////////////////////////////////////////////////// void m_sens(int senx,int seny) {m.r_ax=15; m.r_cx=senx; m.r_dx=seny; intr(0x33,&m);} //////////////////////////////////////////////////////////////////////////////// void analize(int&b_st,int&l_bt,int&r_bt) { if((b_st==1)||(b_st==3)||(b_st==5)||(b_st==7)) l_bt=0; else l_bt=1; if((b_st==2)||(b_st==3)||(b_st==6)||(b_st==7)) r_bt=0; else r_bt=1;} //============================================================================// void initilize_graph() { driver=DETECT; mode=0; initgraph(&driver,&mode,BGI); MaxX=getmaxx(); MaxY=getmaxy(); }