青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

(轉)連連看API版本的源代碼

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

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;

?//如果相鄰
?if( ( p1.x+1==p2.x && p1.y==p2.y )
??|| ( p1.x==p2.x && p1.y+1==p2.y )
??|| ( p1.x-1==p2.x && p1.y==p2.y?)
??|| ( p1.x==p2.x && p1.y-1==p2.y ) )
?{
??//把路徑記錄下來
??//起點
??way[0].x=p1.x;
??way[0].y=p1.y;
??//直線轉折點為0
??way[1].x=0;
??way[1].y=0;
??way[2].x=0;
??way[2].y=0;
??//終點
??way[3].x=p2.x;
??way[3].y=p2.y;

??return true;
?}

?//直線連通
?//如果在水平方向上
?if( p1.x==p2.x )
?{
??if(p1.y>p2.y)
??{
???temp=p1.y;
???p1.y=p2.y;
???p2.y=temp;
??}

??for(j=p1.y+1; j<p2.y; j++ )
??{
???if( matrix[p1.x][j]!=0)
???{
????break;
???}
??}

??//如果兩點之間相通
??if(j==p2.y &&? matrix[p1.x][j-1]==0 )
??{
???
???//把路徑記錄下來
???//起點
???way[0].x=p1.x;
???way[0].y=p1.y;
???//直線轉折點為0
???way[1].x=0;
???way[1].y=0;
???way[2].x=0;
???way[2].y=0;
???//終點
???way[3].x=p2.x;
???way[3].y=p2.y;

???return true;
??}
?}

?//如果在垂直方向上
?if( p1.y==p2.y )
?{
??if(p1.x>p2.x)
??{
???temp=p1.x;
???p1.x=p2.x;
???p2.x=temp;
??}

??for(i=p1.x+1; i<p2.x; i++ )
??{
???if( matrix[i][p1.y]!=0)
???{
????break;
???}
??}
??//如果兩點之間相通
??if(i==p2.x &&? matrix[i-1][p1.y]==0 )
??{


???//把路徑記錄下來
???//起點
???way[0].x=p1.x;
???way[0].y=p1.y;
???//直線轉折點為0
???way[1].x=0;
???way[1].y=0;
???way[2].x=0;
???way[2].y=0;
???//終點
???way[3].x=p2.x;
???way[3].y=p2.y;

???return true;
??}
?}


?
?//折線連通
?/*if( p1.x!=p2.x && p1.y!=p2.y)
?{*/
??if(p1.y>p2.y)
??{
???//兩點交換
???temp=p1.x;
???p1.x=p2.x;
???p2.x=temp;

???temp=p1.y;
???p1.y=p2.y;
???p2.y=temp;


??}


?//橫向掃描
?for(i=0;i<=M-1;i++)
?{??
??x_across=true;

??//是否水平連通
??for(j=p1.y+1; j<=p2.y-1; j++ )
??{
???if(matrix[i][j]!=0 )
???{
????x_across=false;
????break;
???}
??}

??if(matrix[i][p1.y]!=0? )
??{
???if( i!=p1.x )
????x_across=false;
??}
??if(matrix[i][p2.y]!=0? )
??{
???if( i!=p2.x )
????x_across=false;
??}?
???
??if(x_across)
??{//水平連通才執行下面
??/*?for(j=1; j<N-2; j++ )
???{*/
????//檢驗在垂直上是否連通

???px1=px2=i;
???py1=p1.y;
???py2=p2.y;
???while( px1!=p1.x || px2!=p2.x )
???{
????//如果當前點不空且不為p1點,就跳出循環,從下一行開始檢測
????if( matrix[px1][py1]!=0 && (px1!=p1.x || py1!=p1.y) )
?????break;

????//如果當前點不空且不為p2點,就跳出循環,從下一行開始檢測
????if( matrix[px2][py2]!=0 && (px2!=p2.x || py2!=p2.y) )
?????break;

????//如果兩點都為空
????//垂直向p1點靠近一格
????if(px1<p1.x)
?????px1++;
????else if(px1>p1.x)
?????px1--;
????//垂直向p2點靠近一格
????if(px2<p2.x)
?????px2++;
????else if(px2>p2.x)
?????px2--;
???}
?????
???//如果能到達兩個端點
???if(px1==p1.x && py1==p1.y && px2==p2.x && py2==p2.y )
???{
????//起點
????way[0].x=p1.x;
????way[0].y=p1.y;
????//兩個轉折點
????way[1].x=i;
????way[1].y=p1.y;
????way[2].x=i;
????way[2].y=p2.y;
????//終點
????way[3].x=p2.x;
????way[3].y=p2.y;?
????return true;
???}

??}
?}

?if(p1.x>p2.x)
??{
???//兩點交換
???temp=p1.x;
???p1.x=p2.x;
???p2.x=temp;

???temp=p1.y;
???p1.y=p2.y;
???p2.y=temp;


??}
?//縱向掃描
?for(j=0;j<=N-1;j++)
?{??
??y_across=true;
??//是否垂直連通
??for(i=p1.x+1; i<=p2.x-1; i++ )
??{
???if(matrix[i][j]!=0)
???{
????y_across=false;
????break;
???}
??}

??if(matrix[p1.x][j]!=0? )
??{
???if( j!=p1.y )
????y_across=false;
??}
??if(matrix[p2.x][j]!=0? )
??{
???if( j!=p2.y )
????y_across=false;
??}
????
??if(y_across)
??{//垂直連通才執行下面
??/*?for(j=1; j<N-2; j++ )
???{*/
????//檢驗在水平上是否連通

???py1=py2=j;
???px1=p1.x;
???px2=p2.x;
???while( py1!=p1.y || py2!=p2.y)
???{
????//如果當前點不空且不為p1點,就跳出循環,從下一行開始檢測
????if( matrix[px1][py1]!=0 && (px1!=p1.x || py1!=p1.y) )
?????break;

????//如果當前點不空且不為p2點,就跳出循環,從下一行開始檢測
????if( matrix[px2][py2]!=0 && (px2!=p2.x || py2!=p2.y) )
?????break;

????//如果兩點都為空
????//水平向p1點靠近一格
????if(py1<p1.y)
?????py1++;
????else if(py1>p1.y)
?????py1--;
????//水平向p2點靠近一格
????if(py2<p2.y)
?????py2++;
????else if(py2>p2.y)
?????py2--;
???}
?????
???//如果能到達兩個端點
???if(px1==p1.x && py1==p1.y && px2==p2.x && py2==p2.y )
???{
????//起點
????way[0].x=p1.x;
????way[0].y=p1.y;
????//兩個轉折點
????way[1].x=p1.x;
????way[1].y=j;
????way[2].x=p2.x;
????way[2].y=j;
????//終點
????way[3].x=p2.x;
????way[3].y=p2.y;?
????return true;
???}

??}
?}
?//}?
?return false;

}

void Linker_Matrix::init_search()
{
?visited = Matrix< int, M, N >();
?index = 0;
?turn_count = 0;
}

void Linker_Matrix::auto_play()
{
??while( auto_search() );
}

bool Linker_Matrix::man_search(const point p1, const point p2)
{
?init_search();
?if( find_way( p1, p2 ) )
?{
??matrix[p1.x][p1.y]=0;
??matrix[p2.x][p2.y]=0;
??return true;
?}
?return false;
}

?int Linker_Matrix::get_element( int x, int y )
?{
? return matrix[x][y];
?}

void Linker_Matrix::get_point(point &p1,point &p2)
{
?//if( auto_search() )
?//{
??p1=this->p1;
??p2=this->p2;
??//return true;
?//}
?
?//return false;
}

void Linker_Matrix::reShuffle()
{
?int m,n,k;
?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); i++ )
?for( int j=1; j<=(N-2); j++ )
?{
??if(matrix[i][j]!=0)
??{
???do
???{
????m = rand()%(M-2) + 1;
????n = rand()%(N-2) + 1;
???}
???while( 0==matrix[m][n] );

???k=matrix[i][j];
???matrix[i][j]=matrix[m][n];
???matrix[m][n]=k;
??}
?}
}

linker.cpp

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include <windows.h>

#include "head.h"
#include "resource.h"

TCHAR szAppName[] = TEXT ("Linker") ;//程序名稱
const int xsize=610,ysize=520;
const int TimerID=1;


LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM ) ;

int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance,
??????????????????? PSTR szCmdLine, int iCmdShow )
{
?HWND???????? hwnd ;
?MSG????????? msg ;
?WNDCLASS???? wndclass ;
?HACCEL hAccel ;//快捷鍵表


?wndclass.style???????? = CS_HREDRAW | CS_VREDRAW ;
?wndclass.lpfnWndProc?? = WndProc ;
?wndclass.cbClsExtra??? = 0 ;
?wndclass.cbWndExtra??? = 0 ;
?wndclass.hInstance???? = hInstance ;
?wndclass.hIcon???????? = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_ICON)) ;
?wndclass.hCursor?????? = LoadCursor (NULL, IDC_ARROW) ;
?wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
?wndclass.lpszMenuName? = szAppName ;
?wndclass.lpszClassName = szAppName ;

?if (!RegisterClass (&wndclass))
?{
??MessageBox (NULL, TEXT ("This program requires Windows NT!"),
????szAppName, MB_ICONERROR) ;
??return 0 ;
?}
????
?hwnd = CreateWindow ( szAppName,??// window class name
????????????????????????? TEXT ("連連看 V1.08.18.01"),?// window caption
????????????????????????? WS_OVERLAPPEDWINDOW &
???? ~WS_MAXIMIZEBOX & ~WS_SIZEBOX,// window style
???? //沒有最大化按鈕和無法改變窗口大小
????????????????????????? CW_USEDEFAULT,??// initial x position
????????????????????????? CW_USEDEFAULT,??// initial y position
????????????????????????? xsize,??// initial x size
????????????????????????? ysize,??// initial y size
????????????????????????? NULL,????// parent window handle
????????????????????????? NULL,????// window menu handle
????????????????????????? hInstance,???// program instance handle
????????????????????????? NULL ) ;???// creation parameters
????
?ShowWindow (hwnd, iCmdShow) ;
?UpdateWindow (hwnd) ;
????
?hAccel = LoadAccelerators (hInstance, TEXT ("MY_ACCELERATOR")) ;

?while(GetMessage (&msg, NULL, 0, 0))
?{
??if(!TranslateAccelerator (hwnd, hAccel, &msg))
??{
????????????????? TranslateMessage (&msg) ;
????????????????? DispatchMessage (&msg) ;
??}
?}

?return msg.wParam ;
}

BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message,
??????????????????????????? WPARAM wParam, LPARAM lParam)
{
???? switch (message)
???? {
???? case WM_INITDIALOG :
????????? return TRUE ;
?????????
???? case WM_COMMAND :
????????? switch (LOWORD (wParam))
????????? {
????????? case IDOK :
????????? case IDCANCEL :
?????????????? EndDialog (hDlg, 0) ;
?????????????? return TRUE ;
????????? }
????????? break ;
???? }
???? return FALSE ;
}

LRESULT CALLBACK WndProc ( HWND hwnd, UINT message,
????WPARAM wParam, LPARAM lParam )
{
?HDC??hdc,hdcMem;
?//HBRUSH hBrush ;
?PAINTSTRUCT?ps ;//繪圖結構
?static RECT??rect,rect2 ;//矩形
?static HBITMAP?hBitmap1,hBitmap2;//兩個位圖文件句柄
?HBITMAP hBitmap3;
?BITMAP??bitmap ;//位圖文件
?static?int?cxBack,cyBack,cxPre,cyPre,cxStart,cyStart;
????//cxBack,cyBack:背景圖片大小
????//cxPre,cyPre:牌面圖片大小??
?int?x,y,i,j,num;

?bool find;//是否有路徑標志
?static bool first_started=false;//是否是剛打開程序
?static bool bPrompt=false;//是否提示
?TCHAR??? szBuffer[14];
?static?HINSTANCE?hInstance ;
?static?HMENU??hMenu ;//菜單句柄
?static?int??iCurrentLevel = IDM_APP_LOW ;//記錄游戲難度
?static?int??iTime = 100 ;//記錄游戲的剩余時間
?static? int??iShuffle=0,iPrompt=0;
??//iShuffle:重新洗牌的剩余次數,iPrompt:提示的剩余次數
?static?int?iCount=0;//統計消去的對數,用于判斷是否勝利
?static?Linker_Matrix?linker ;//連連看的運算矩陣
?static?point??pSelected[2] ;//用于記錄選擇的兩個點
????
?switch (message)
?{
?case WM_CREATE://進行初始化;
??//PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
??//GetClientRect(hwnd,&rect);

??MoveWindow(hwnd,(GetSystemMetrics(SM_CXSCREEN)-xsize)/2,(GetSystemMetrics(SM_CYSCREEN)-ysize)/2,xsize,ysize,false);
??//將窗口移置屏幕中間

??hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;
??hMenu = GetMenu (hwnd) ;
??pSelected[0].x=pSelected[0].y=0;
??pSelected[1].x=pSelected[1].y=0;

??hBitmap1 = LoadBitmap (hInstance, TEXT ("IDB_BITMAP_BACK"));
??hBitmap2 = LoadBitmap (hInstance, TEXT ("IDB_BITMAP_PRE"));
??

??GetObject (hBitmap1, sizeof (BITMAP), &bitmap) ;

??cxBack = bitmap.bmWidth ;
??cyBack = bitmap.bmHeight/7 ;
??GetObject (hBitmap2, sizeof (BITMAP), &bitmap) ;

??cxPre = bitmap.bmWidth/2 ;
??cyPre = bitmap.bmHeight/42 ;

??//SendMessage(hwnd,WM_COMMAND,IDM_APP_START,0);
??first_started=true;
??
??return 0 ;

?case WM_TIMER:
??if(iTime>0)
???iTime--;

??//使字體所在區域無效化,重繪
??rect.left = 0;
??rect.right = xsize;
??rect.top? = 0;
??rect.bottom = 20;
??InvalidateRect (hwnd, &rect, true) ;
??rect.left = 0;
??rect.right = 0;
??rect.top? = 0;
??rect.bottom = 0;

??if( iTime<=0 )
??{
???iCount=0;
???KillTimer (hwnd, TimerID) ;
???MessageBox (hwnd, TEXT ("時間到,你輸了!!"),szAppName, MB_OK | MB_ICONQUESTION) ;
???

???SendMessage(hwnd,WM_COMMAND,IDM_APP_START,0);

???linker=Linker_Matrix();
???InvalidateRect (hwnd, NULL, true) ;
??}
??


??return 0;

??

?case WM_PAINT:
??hdc = BeginPaint (hwnd, &ps) ;
??
??//GetClientRect (hwnd, &rect) ;
??hdcMem = CreateCompatibleDC (hdc) ;
???
??

??//繪制牌面
??for(i=1; i<=M-2; i++ )
???for(j=1; j<=N-2; j++ )
???{
????num=linker.get_element(i,j);
????if( num!=0 )
????{
????x=i*(cxBack-3);
????y=j*(cyBack-4)-30;
????SelectObject (hdcMem, hBitmap1) ;
????BitBlt (hdc, x, y, cxBack, cyBack, hdcMem, 0, cyBack*(num%6+1), SRCCOPY) ;
????SelectObject (hdcMem, hBitmap2) ;
????BitBlt (hdc, x+1, y+6, cxPre, cyPre, hdcMem,? cxPre, cyPre*num, SRCAND) ;
????BitBlt (hdc, x+1, y+6, cxPre, cyPre, hdcMem,? 0, cyPre*num, SRCPAINT) ;
???
????}
???}
??
??//當選中第一張牌時,在上面畫個圈
??if(rect.left!=0 && rect.right!=0 && rect.top!=0 && rect.bottom!=0 && bPrompt==false)
??{
???SelectObject (hdc, GetStockObject (GRAY_BRUSH)) ;
???Ellipse(hdc,rect.left ,rect.top ,rect.left+10 ,rect.top+10 );
???rect.left=0;
???rect.right=0 ;
???rect.top=0;
???rect.bottom=0;

??}
??if( first_started==false)
??{
???sprintf(szBuffer,"剩余時間: %d 秒",iTime);
???TextOut (hdc, 0, 0, szBuffer, strlen (szBuffer)) ;
???TextOut (hdc, xsize/5, 0, TEXT("每消去一對剩余時間+2秒"), strlen (TEXT("每消去一對剩余時間+3秒"))) ;
???sprintf(szBuffer,"剩余洗牌次數: %d 次",iShuffle);
???TextOut (hdc, xsize/2+10, 0, szBuffer, strlen (szBuffer)) ;
???sprintf(szBuffer,"剩余提示次數: %d 次",iPrompt);
???TextOut (hdc, xsize/4*3, 0, szBuffer, strlen (szBuffer)) ;
??}

??if(first_started)
??{//第一次打開程序

???/*SendMessage(hwnd,WM_COMMAND,IDM_APP_ABOUT,0);
???//發送 單擊關于菜單 消息
???SendMessage(hwnd,WM_COMMAND,IDM_APP_START,0);
???//發送 單擊開始游戲菜單 消息,詢問是否開始;*/
???hBitmap3 = LoadBitmap (hInstance, TEXT ("IDB_BITMAP_START"));
???GetObject (hBitmap3, sizeof (BITMAP), &bitmap) ;
???cxStart = bitmap.bmWidth;
???cyStart = bitmap.bmHeight;

???SelectObject (hdcMem, hBitmap3) ;
???StretchBlt? (hdc, 0, 0, xsize, ysize, hdcMem, 0,0, cxStart, cyStart,MERGECOPY) ;
???PlaySound (TEXT ("start.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
???//first_started=false;
??}
?
??if(bPrompt)
??{
???SelectObject (hdc, GetStockObject (BLACK_BRUSH)) ;
???Ellipse(hdc,rect.left ,rect.top ,rect.left+10 ,rect.top+10 );
???Ellipse(hdc,rect2.left ,rect2.top ,rect2.left+10 ,rect2.top+10 );
???rect.left=0;
???rect.right=0 ;
???rect.top=0;
???rect.bottom=0;
???rect2.left=0;
???rect2.right=0 ;
???rect2.top=0;
???rect2.bottom=0;

???bPrompt=false;
??}

??DeleteDC (hdcMem) ;
??EndPaint (hwnd, &ps) ;

??return 0 ;
?case WM_INITMENUPOPUP:

??if( first_started==false )
??{
???EnableMenuItem ((HMENU) wParam, IDM_APP_RESHUFFLE,?? MF_ENABLED) ;
???EnableMenuItem ((HMENU) wParam, IDM_APP_PROMPT,?? MF_ENABLED) ;
??}

??if(iShuffle==0)
???EnableMenuItem ((HMENU) wParam, IDM_APP_RESHUFFLE,? MF_GRAYED) ;
??if(iPrompt==0)
???EnableMenuItem ((HMENU) wParam, IDM_APP_PROMPT,? MF_GRAYED) ;

??
??break;

?case WM_COMMAND :
??switch (LOWORD (wParam))
??{

??case IDM_APP_START://單擊開始游戲菜單
???if ( IDYES == MessageBox (hwnd, TEXT ("開始游戲嗎?"),
????szAppName, MB_YESNO | MB_ICONQUESTION) )
???//彈出確認窗口,按YES開始游戲
???{
????if ( iCurrentLevel==IDM_APP_LOW )
????{//難度為低
?????iTime=90;
?????iPrompt=3;
?????iShuffle=2;
?????linker=Linker_Matrix(6);
????
????}

????if ( iCurrentLevel==IDM_APP_MIDDLE )
????{//難度為中
?????iTime=90;
?????iPrompt=3;
?????iShuffle=2;
?????linker=Linker_Matrix(4);
?????
????}
????
????if ( iCurrentLevel==IDM_APP_HIGH )
????{//難度為高
?????iTime=60;
?????iPrompt=3;
?????iShuffle=1;
?????linker=Linker_Matrix(4);
????
????}
???
????SetTimer (hwnd, TimerID, 1000, NULL) ;
????InvalidateRect (hwnd, NULL, TRUE) ;
????first_started=false;
????iCount=0;

???}
???else
????SendMessage(hwnd,WM_CLOSE,0,0);
???break;

??case IDM_APP_EXIT ://單擊退出游戲菜單
???SendMessage(hwnd,WM_CLOSE,0,0);
???break;

??case IDM_APP_ABOUT ://單擊關于菜單
???DialogBox (hInstance, TEXT ("AboutBox"), hwnd, AboutDlgProc) ;
???break ;

??case IDM_APP_LOW:
??case IDM_APP_MIDDLE:
??case IDM_APP_HIGH:
???//單擊難度菜單
???CheckMenuItem (hMenu, iCurrentLevel, MF_UNCHECKED) ;
???iCurrentLevel = LOWORD (wParam) ;
???CheckMenuItem (hMenu, iCurrentLevel, MF_CHECKED) ;
???break;

??case IDM_APP_RESHUFFLE://單擊重新洗牌按鈕
???if(iShuffle>0 )
???{?
????iShuffle--;
????linker.reShuffle();
???}
???//if(iShuffle==0)
????//EnableMenuItem ((HMENU) wParam, IDM_APP_RESHUFFLE,? MF_GRAYED) ;
???
???//使文字所在區域無效化,重繪
???/*rect.left = 0;
???rect.right = xsize;
???rect.top? = 0;
???rect.bottom = 20;*/
???InvalidateRect (hwnd, NULL , true) ;
???rect.left = 0;
???rect.right = 0;
???rect.top? = 0;
???rect.bottom = 0;
???break;

??case IDM_APP_PROMPT:
???if(iPrompt>0 && linker.auto_search() )//提示次數>0,且找到匹配
???{
????//pSelected[0].x=pSelected[0].y=0;
????linker.get_point(pSelected[0],pSelected[1]);
????iPrompt--;

????//使文字所在區域無效化,重繪
????rect.left = 0;
????rect.right = xsize;
????rect.top? = 0;
????rect.bottom = 20;
????InvalidateRect (hwnd, &rect, true) ;
????rect.left = 0;
????rect.right = 0;
????rect.top? = 0;
????rect.bottom = 0;
?????
????//sprintf(szBuffer," %d %d %d %d",pSelected[0].x,pSelected[0].y,pSelected[1].x,pSelected[1].y);
????//MessageBox (hwnd, szBuffer,szAppName, MB_OK | MB_ICONQUESTION) ;
????
????rect.left = pSelected[0].x*(cxBack-3);
????rect.right = rect.left+(cxBack-3)+3;
????rect.top? = pSelected[0].y *(cyBack-4)-30;
????rect.bottom = rect.top + (cyBack-4)+4;
????//Ellipse(hdc,rect.left ,rect.top ,rect.right ,rect.bottom );
????InvalidateRect (hwnd, &rect, true) ;
????
????rect2.left = pSelected[1].x *(cxBack-3);
????rect2.right = rect2.left+(cxBack-3)+3;
????rect2.top? = pSelected[1].y *(cyBack-4)-30;
????rect2.bottom = rect2.top + (cyBack-4)+4;
????//Ellipse(hdc,rect.left ,rect.top ,rect.right ,rect.bottom );
????InvalidateRect (hwnd, &rect2, true) ;
?
????pSelected[0].x=0;
????pSelected[0].y=0;
????pSelected[1].x=0;
????pSelected[1].y=0;

???}

???bPrompt=true;
???//if(iPrompt==0)
????//EnableMenuItem ((HMENU) wParam, IDM_APP_PROMPT,? MF_GRAYED) ;
???break;
??}
??return 0 ;
?case WM_LBUTTONUP:
??//取得鼠標坐標
??x= LOWORD (lParam)/(cxBack-3);
??y= ( HIWORD (lParam)+30)/(cyBack-4);
??if (x>=1 && x<=M-2 && y>=1 && y<=N-2 && linker.get_element(x,y)!=0 )
??{
??/*
??sprintf(szBuffer,"%d",y);
??MessageBox (hwnd, TEXT (szBuffer),
????szAppName, MB_YESNO | MB_ICONQUESTION) ;*/
??//如果是在第一張牌按下鼠標
??if(pSelected[0].x==0 && pSelected[0].y==0 )
??{
???//hBrush = GetStockObject (GRAY_BRUSH) ;
???//SelectObject (hdc, hBrush) ;
???
???//hdc = BeginPaint (hwnd, &ps) ;
???//SelectObject (hdc, GetStockObject (BLACK_PEN)) ;

???//在該牌上畫圓
????rect.left = x *(cxBack-3);
????rect.right = rect.left+(cxBack-3)+3;
????rect.top? = y *(cyBack-4)-30;
????rect.bottom = rect.top + (cyBack-4)+4;
????//Ellipse(hdc,rect.left ,rect.top ,rect.right ,rect.bottom );
????InvalidateRect (hwnd, &rect, true) ;
????//EndPaint (hwnd, &ps) ;
???//把牌的位置記錄下來
???pSelected[0].x=x;
???pSelected[0].y=y;
??}
??else
??{?//如果是第二張牌上按鼠標

???//把牌的位置記錄下來
???pSelected[1].x=x;
???pSelected[1].y=y;

??
???if( (pSelected[0].x!=pSelected[1].x ||
????pSelected[0].y!=pSelected[1].y) &&
????linker.is_matched(pSelected[0],pSelected[1]) )
???{//如果不是同一張牌并且花色一致
????
????//尋找路徑
????find=linker.man_search(pSelected[0],pSelected[1])
?????|| linker.man_search(pSelected[1],pSelected[0]);;

????if(find)
????{//找到

?????//GetClientRect (hwnd, &rect) ;
?????rect.left = pSelected[0].x *(cxBack-3);
?????rect.right = rect.left+(cxBack-3)+3;
?????rect.top? = pSelected[0].y *(cyBack-4)-30;
?????rect.bottom = rect.top + (cyBack-4)+4;
?????InvalidateRect (hwnd, &rect, true) ;

?????rect.left = pSelected[1].x *(cxBack-3);
?????rect.right = rect.left+(cxBack-3)+3;
?????rect.top? = pSelected[1].y *(cyBack-4)-30;
?????rect.bottom = rect.top + (cyBack-4)+4;
?????InvalidateRect (hwnd, &rect, true) ;

?????rect.left=0;
?????rect.right=0 ;
?????rect.top=0;
?????rect.bottom=0;

?????iCount++;
?????iTime+=2;

?????PlaySound (TEXT ("yes.wav"), NULL, SND_FILENAME | SND_ASYNC) ;

?????//InvalidateRect (hwnd, NULL, true) ;

????}
????else
????{//沒找到
????/*
?????sprintf(szBuffer,"%d",find);
?????MessageBox (hwnd, TEXT (szBuffer),
?????szAppName, MB_YESNO | MB_ICONQUESTION) ;*/

?????rect.left = pSelected[0].x *(cxBack-3);
?????rect.right = rect.left+(cxBack-3)+3;
?????rect.top? = pSelected[0].y *(cyBack-4)-30;
?????rect.bottom = rect.top + (cyBack-4)+4;
?????InvalidateRect (hwnd, &rect, true) ;

?????rect.left=0;
?????rect.right=0 ;
?????rect.top=0;
?????rect.bottom=0;
?????PlaySound (TEXT ("no.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
????
????}
????pSelected[0].x=0;
????pSelected[0].y=0;
????pSelected[1].x=0;
????pSelected[1].y=0;

????
???}
???else
???{//同一張牌或花色不一致

????rect.left = pSelected[0].x *(cxBack-3);
????rect.right = rect.left+(cxBack-3)+3;
????rect.top? = pSelected[0].y *(cyBack-4)-30;
????rect.bottom = rect.top + (cyBack-4)+4;
????InvalidateRect (hwnd, &rect, true) ;

????pSelected[0].x=x;
????pSelected[0].y=y;
????pSelected[1].x=0;
????pSelected[1].y=0;

????rect.left = pSelected[0].x *(cxBack-3);
????rect.right = rect.left+(cxBack-3)+3;
????rect.top? = pSelected[0].y *(cyBack-4)-30;
????rect.bottom = rect.top + (cyBack-4)+4;
????InvalidateRect (hwnd, &rect, true) ;
????/*
????rect.left=0;
????rect.right=0 ;
????rect.top=0;
????rect.bottom=0;*/
???}
??

??}
??}

??if( iCount==(M-2)*(N-2)/2 )
??{?
???iCount=0;
???KillTimer (hwnd, TimerID) ;
???MessageBox (hwnd, TEXT ("恭喜你,你贏了!!"),szAppName, MB_OK | MB_ICONQUESTION) ;


???SendMessage(hwnd,WM_COMMAND,IDM_APP_START,0);
??}
??return 0;
??

?case WM_CLOSE://用戶關閉程序
??if ( IDYES == MessageBox (hwnd, TEXT ("確認關閉程序"),
????szAppName, MB_YESNO | MB_ICONQUESTION) )
??//彈出確認窗口,按YES退出程序
??{
???PlaySound (TEXT ("close.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
???KillTimer (hwnd, TimerID) ;
???DestroyWindow (hwnd) ;
???Sleep(2000);
??}
??return 0 ;
?case WM_DESTROY:
??
??PostQuitMessage (0) ;
??return 0 ;
?}

?return DefWindowProc (hwnd, message, wParam, lParam) ;
}

posted on 2006-09-17 21:48 楊粼波 閱讀(1456) 評論(0)  編輯 收藏 引用 所屬分類: 文章收藏

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美福利视频在线观看| 欧美一区二区高清| 欧美成年人视频| 久久9热精品视频| 在线不卡欧美| 亚洲一区一卡| 一区二区亚洲精品| 亚洲一区国产精品| 性欧美精品高清| 在线观看国产一区二区| 欧美激情精品久久久久久免费印度 | 日韩亚洲精品视频| 日韩网站在线| 国产亚洲欧美aaaa| 欧美激情女人20p| 国产精品扒开腿做爽爽爽软件| 欧美怡红院视频一区二区三区| 久久久久久久综合| av成人福利| 欧美一区二区三区视频在线观看| 亚洲国产另类久久精品| 99香蕉国产精品偷在线观看| 狠狠综合久久av一区二区老牛| 欧美黄色aaaa| 国产精品永久免费观看| 亚洲高清视频一区| 国产精品美腿一区在线看| 毛片基地黄久久久久久天堂| 欧美日韩综合在线免费观看| 久久综合国产精品| 欧美日韩综合视频| 欧美国产日韩a欧美在线观看| 欧美性大战久久久久久久蜜臀| 久久女同互慰一区二区三区| 亚洲欧美激情一区二区| 亚洲大片在线| 亚洲欧美日韩精品久久奇米色影视| 亚洲国产欧美一区| 亚洲中字在线| 亚洲一区二区三区免费在线观看 | 亚洲日本中文字幕区| 国产欧美一区视频| 日韩视频在线观看| 亚洲国产精品视频| 欧美一区二区三区视频在线| 亚洲综合久久久久| 欧美日韩免费视频| 亚洲第一久久影院| 1024亚洲| 久久三级视频| 免费看亚洲片| 尤物网精品视频| 久久av红桃一区二区小说| 午夜伦欧美伦电影理论片| 欧美日韩中文在线| 日韩视频免费大全中文字幕| 亚洲精品中文字幕在线观看| 可以看av的网站久久看| 久久综合九色欧美综合狠狠| 国内精品久久国产| 欧美一级在线视频| 欧美在线观看网站| 国产亚洲电影| 欧美在线播放一区二区| 欧美在线国产精品| 国产精品福利网站| 影音先锋在线一区| 久久精品国产免费| 久久人人看视频| 精品粉嫩aⅴ一区二区三区四区| 西瓜成人精品人成网站| 久久天堂成人| 亚洲国产精品va| 欧美激情成人在线视频| 日韩视频在线观看免费| 亚洲午夜免费视频| 国产伦精品一区二区三区高清| 欧美一区二区三区免费看| 久久精品91| 亚洲国产精品ⅴa在线观看| 欧美精品成人| 一区二区三区视频观看| 欧美亚洲一区二区三区| 尤物在线精品| 欧美精品二区三区四区免费看视频| 亚洲看片免费| 久久疯狂做爰流白浆xx| 精品二区视频| 欧美日韩一视频区二区| 午夜精品久久久久久久| 欧美高清视频在线| 亚洲在线一区二区| 激情婷婷亚洲| 欧美—级a级欧美特级ar全黄| 亚洲视频免费看| 欧美成人精品高清在线播放| 一区二区三区鲁丝不卡| 国产专区一区| 欧美日韩精品三区| 欧美电影免费观看大全| 亚洲午夜久久久久久久久电影院| 国语自产精品视频在线看一大j8| 免费精品99久久国产综合精品| 一本久久a久久免费精品不卡| 久久九九热re6这里有精品| 日韩视频在线一区二区三区| 国产乱码精品一区二区三区av| 美女网站久久| 欧美在线高清| aa级大片欧美| 欧美大片网址| 久久久久国产精品麻豆ai换脸| 99精品国产在热久久下载| 国产综合视频| 国产精品chinese| 欧美激情日韩| 久久久五月婷婷| 香蕉成人久久| 在线一区视频| 亚洲免费久久| 亚洲国产精品一区在线观看不卡 | 一区二区三区www| 好看的日韩视频| 国产精品一区一区三区| 欧美日韩视频一区二区三区| 欧美成人精品在线播放| 欧美中文字幕久久| 亚洲欧美国产高清| 在线视频精品一区| 日韩一级精品| 亚洲全部视频| 亚洲成色精品| 欧美激情第4页| 欧美不卡视频一区发布| 久久亚洲国产成人| 久久久久久久97| 久久激情网站| 久久久人成影片一区二区三区观看| 欧美日韩在线不卡| 夜夜嗨av色一区二区不卡| 亚洲国产日韩欧美在线图片| 欧美日本精品在线| 免费成人黄色av| 久久中文在线| 蜜臀久久99精品久久久画质超高清| 久久精品国产清自在天天线| 久久精彩视频| 久久免费的精品国产v∧| 久久国产精品一区二区三区| 久久精品在线免费观看| 久久人人97超碰人人澡爱香蕉| 久久精品亚洲精品| 久久综合电影| 欧美日韩三级一区二区| 国产精品人人做人人爽| 国产亚洲在线| 在线观看国产精品淫| 亚洲伦理在线| 亚洲欧美在线播放| 久久精品国产在热久久 | 亚洲国产精品久久人人爱蜜臀 | 国产一区二区三区久久悠悠色av| 国产一区二区日韩| 亚洲国产日韩在线一区模特| 艳女tv在线观看国产一区| 亚洲欧美不卡| 美女国产一区| 亚洲免费不卡| 欧美一级淫片播放口| 猫咪成人在线观看| 欧美午夜精品久久久久久久| 国产一区二区剧情av在线| 亚洲乱码国产乱码精品精98午夜| 亚洲免费视频网站| 久久久久一区二区三区四区| 亚洲精品欧美一区二区三区| 欧美亚洲日本国产| 欧美激情亚洲激情| 国产在线欧美| 夜夜嗨av一区二区三区四季av| 欧美一区二区精品| 欧美激情亚洲精品| 亚洲欧美日韩在线| 欧美激情在线狂野欧美精品| 国产欧美精品一区aⅴ影院| 亚洲经典在线| 欧美一区中文字幕| 亚洲日本激情| 久久精品国产视频| 国产精品免费观看视频| 亚洲精品久久久蜜桃| 久久久天天操| 亚洲欧美一区二区精品久久久| 欧美成人免费在线视频| 国产亚洲精品久久久久动| 正在播放亚洲一区| 欧美国产精品久久| 亚洲欧美日韩一区二区在线| 欧美视频在线观看一区| 亚洲久色影视|