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;
}
}