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

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

本文简介:

head.h

#define M 14
//M为连连看牌的高+2
#define N 10
//N为连连看牌的宽+2

struct point
{
 int x;
 int y;
};

/*********************************************************/

template < typename T, int m, int n > class Matrix
{
protected: 
 T matrix[M][N];
public:
 Matrix();
 Matrix( char* filename );//通过文件里的数据初始化
 void show_matrix();//输出矩阵
 void set_element( int x, int y, T num );//num为元素值
 T get_element( int x, int y );
};

/*********************************************************/

class Linker_Matrix:public Matrix < int, M, N >  //连连看的牌矩阵类
{
 /* matrix[M][N]为牌矩阵;
  从[1][1]开始,到[M-2][N-2]有效;
  外围一圈为预留的配对路径;
  值=0为无牌,即牌配对之后被消掉的的状态;
  其他值即为牌的类别,相同值的牌方可配对;  
 */
private:
 //time_t curtime;
 point p1,p2,way[ 4 ];
  //p1为起点,p2为终点,way[M+N]用于记录搜索到的路径
 int index;//路径的长度;
 int turn_count;//路径的转弯次数,>2就搜索失败;
 Matrix < int, M, N > visited;
  //是否访问过矩阵类,1:访问过 0:未访问 
public:

 Linker_Matrix();
 Linker_Matrix( int low, int high, int num );
  //随机选择元素初始化,元素值的范围在low-high,
  //每个值有num个;
 Linker_Matrix( int num );
  //随机选择元素初始化,从1开始,每个值有num个;
  
 void show_matrix();
 void count( int low, int high );//统计各个值的个数,测试用;
 bool auto_search();//自动搜索出一对配对的牌
 bool find_way( point p1, point p2 );
  //搜索路径 true-有路径 false-无;  
 void auto_play();//自动完成所有的配对;
 void init_search();//进行搜索前的初始化 
 bool man_search( point p1,  point p2);
 bool is_matched( point p1, point p2 );
  //是否配对 true-配对 false-否;
 int  get_element( int x, int y );
 void get_point(point &p1,point &p2);
  //通过p1,p2提取自动搜索出的匹配两点
 void reShuffle();//重新洗牌;
};

/*********************************************************/

head.cpp

#include "head.h"
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<conio.h>

template < typename T, int m, int n >
Matrix < T, m, n >::Matrix()
{
 for( int i=0; i<m; i++ )
  for( int j=0; j<n; j++ )
   matrix[i][j] = 0;
 
}

template < typename T, int m, int n >
Matrix< T, m, n >::Matrix( char* filename )
{
 ifstream infile(filename);
 
 for( int i=0; i<M; i++ )
  for( int j=0; j<N; j++ )
   infile >> matrix[i][j];
}

template < typename T, int m, int n >
void Matrix< T, m, n >::show_matrix()

 for( int i=0; i<m; i++ )
 {
  for( int j=0; j<n; j++ )
   cout<< matrix[i][j]<<'\t';
  cout<<endl;
 }
 cout<<endl;
}

template < typename T, int m, int n >
inline void Matrix< T, m, n >::set_element( int x, int y, T element )
{
 matrix[x][y] = element;
}

template < typename T, int m, int n >
T Matrix< T, m, n >::get_element( int x, int y )
{
 return matrix[x][y];
}

/*********************************************************/

Linker_Matrix::Linker_Matrix():Matrix< int, M, N >()
{
 p1.x = p1.y = 0;
 p2.x = p2.y = 0;
 index = 0;
 turn_count = 0;
 //max=0;

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

Linker_Matrix::Linker_Matrix( int low, int high, 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=low; i<=high; 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;
  }
}

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

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

go top