连连看API版本的源代码[2]

[入库:2006年2月23日] [更新:2007年3月24日]

本文简介:

Linker_Matrix::Linker_Matrix(int num ):Matrix< int, M, N >()

 
 int m,n;
 time_t curtime; //记录当前时间

 p1.x = p1.y = 0;
 p2.x = p2.y = 0;
 index = 0;

 time(&curtime);//取得当前时间
 srand(curtime);//用当前时间作种子,产生随机数

 for( int k=0; k<4; k++ )
  way[k].x = way[k].y = 0;

 for( int i=1; i<=(M-2)*(N-2)/num; i++ )
  for( int j=0; j<num; j++ )
  {
   do
   {
    m = rand()%(M-2) + 1;
    n = rand()%(N-2) + 1;
   }
   while( 0==m || 0==n || 0!=matrix[m][n] );
   matrix[m][n]=i;
  }
}

void Linker_Matrix::show_matrix()
{
 
 for( int i=1; i<M-1; i++ )
 {
  for( int j=1; j<N-1; j++ )
   cout<<matrix[i][j]<<'\t';
  cout<<endl;
 }
 cout<<endl;
}

void Linker_Matrix::count( int low, int high )
{
 int *num,k;

 //动态分配 
 num = new int[ high-low+2 ];
 //初始化
 for( k=0; k<high-low+2; k++ )
  num[k]=0;
 
 //计数
 for( int i=1; i<M-1; i++ )
  for( int j=1; j<N-1; j++ )
   num[ matrix[i][j] ]++;
  
 //输出
 for( k=0; k<high-low+2; k++ )
  cout<<k<<":"<<num[k]<<'\t';
 cout<<endl;

 //销毁
 delete[] num;
}

inline bool Linker_Matrix::is_matched( const point p1, const point p2 )
{
 return matrix[ p1.x ][ p1.y ] == matrix[ p2.x ][ p2.y ];
}

bool Linker_Matrix::auto_search()
{
 int i,j,m,n;
 //static k = 0;
 bool all_is_zero = true;//是否所有元素都为0 true:yes false:no

 for( i=1; i<M-1; i++ )
 for( j=1; j<N-1; j++ )
 {
  if( matrix[i][j]!=0 )//元素不为0时方进行配对
  {
   all_is_zero=false;
   p1.x = i; p1.y = j;

   for( m=1; m<M-1; m++ )
   for( n=1; n<N-1; n++ )
   { 
    if( i!=m || j!=n )//元素不为本身时,方进行搜索路径
    { 
     //k++;
     p2.x=m; p2.y=n;

     init_search();
     /*if(k==29)
     {
      init_search();
      show_matrix();
     }*/
     
     if ( is_matched( p1, p2 ) && find_way( p1, p2 ) )
     /*逻辑式这样写的原因是只要is_matched(p1,p2)为false,
     逻辑式必为false,find_way(p1,p2)就不会执行;
     当两元素数值相同且有路径时,执行下面
     */
     { 
       //show_matrix();
       //cout<<turn_count<<endl;
       //matrix[ p1.x ][ p1.y ] = 0;
       //matrix[ p2.x ][ p2.y ] = 0;
       //k++;
       //cout<<p1.x<<' '<<p1.y<<' '<<p2.x<<' '<<p2.y<<':'<<k<<endl;
       //show_matrix();
       //count(1,21);
       //goto jump;
       //找到一个就退出
      
       return true;
      //}
     }
     
    }/*
    if( k>MAX)//搜索次数过大,强制跳出
        return false;*/
   }
  }
  //jump:  ;
 }

 if( true==all_is_zero )//元素全部为0,返回false
  return false;
 return false;//没有匹配时,返回false
}

bool Linker_Matrix::find_way(  point p1, point p2 )
{
 /*
 本方法是本程序的核心算法,
 作用是以p1为起点,p2为终点进行路径的搜索;*/
 /*采用水平垂直扫描法,先确定两个转折点之间是否相通,再判断
 转折点与相应端点间是否相通
 */

 int i,j;
 int px1,px2,py1,py2;
 int temp;
 bool x_across,y_across;

本文关键:连连看API版本的源代码
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top