rendered paste body#include <iostream.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <new.h>
#include <dos.h>
#include <graphics.h>
#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<n*ver){
lb_func(a , ver , x1 , y1);
proverka( a , x , y , n );
cpu(a , x , y , n );
}}
}while(rb!=0);
restorecrtmode();}
void setka(int **a , int ver)
{
char chr[25];
setcolor(2);
for ( i = 0 ; i < n ; i++ )
for ( j = 0 ; j < n ; j++)
rectangle(i*ver,j*ver,(i+1)*ver-1,(j+1)*ver-1);
for ( i = 1 ; i <= n ; i++ ){
for ( j = 1 ; j <= n ; j++){
if (a[i][j]!=0){
itoa(a[i][j],chr,10);
settextstyle(0,0,(20-n)/2);
moveto(j*ver-ver+ver/20,i*ver-ver+ver/10);
outtext(chr);
} } }
}
////////////////////////////////////////////////////////////////////////////////
void lb_func(int **a , int ver , int x1 , int y1)
{
int ch;
x1=x/ver;
y1=y/ver;
cleardevice();
setfillstyle(HATCH_FILL, GREEN);
bar(x1*ver+1, y1*ver+1, x1*ver+ver-2, y1*ver+ver-2);
x1++;
y1++;
do {
setcolor(2);
for ( i = 0 ; i < n ; i++ )
for ( j = 0 ; j < n ; j++)
rectangle(i*ver,j*ver,(i+1)*ver-1,(j+1)*ver-1);
gotoxy(73,2);
cout<<" k ";
gotoxy(73,3);
cout<<" l ";
gotoxy(73,4);
cout<<" e ";
gotoxy(73,5);
cout<<" t ";
gotoxy(73,6);
cout<<" k ";
gotoxy(73,7);
cout<<" a ";
gotoxy(73,8);
cout<<" ";
gotoxy(72,9);
cout<<"["<<y1<<"]["<<x1<<"]";
gotoxy(74,10);
cout<<"|";
gotoxy(74,11);
cin>>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();
}