//围棋算法 ,利用一个围棋类来完成,最后的是一个围棋的提子算法。在WIN32 API中编写,这只是围棋类的代码,如果想得到所有代码和.exe文件,请到网站: fyyuan.5166.info 中下载。作者:袁飞艳
#include <strstrea.h>
#include <math.h>
#define max_num 361 //ÆåÅÌÖÐËùÓеãµÄ¸öÊý
#define length 19 //ÆåÅ̵ÄÐÐÊýÓëÁÐÊý
static int step=0; //²½Êý
static int SX[200],SY[200]; //¼Ç¼ÒÑÏÂÆå×Ó×ø±ê
static int blacknum=0,whitenum=0; //ÓÃÀ´±êʶÿɫÆå×Óϵ½µÚ¼¸ÊÖ
static int beatnum=0,weatnum=0; //±íʾÿɫÆå×ÓÌá¶Ô·½×ӵĴÎÊý
//¼Ç¼Æå×ÓµÄλÖã¬Ìá×Óº¯ÊýֻʹÓÃ
typedef struct positon
{
int row;
int col;
}Pos;
//Á´Õ»£¬ÓÃÓÚ»ØËݲéÕÒÊÇ·ñ»¹ÓÐÓ뵱ǰ×ÓÁ¬³É´®µÄͬɫÆå×Ó
typedef struct stack
{
int row;
int col;
struct stack *link;
}Sqstack;
//Ò»¸öÁ´±í£¬´æ·Å¿ÉÄÜûÆøµÄ×Ó£¬¼´±»ÌáÈ¡µÄÆå×Ó
typedef struct LNode
{
int row;
int col;
struct LNode *next;
}LNode;
//ÔÚ»ØËÝʱ£¬Îª·ÀÖ¹Öظ´£¬ÉèµÄ·ÃÎʱêÖ¾
int visited[length+1][length+1];
/*----------------------------------------------ΧÆåÀඨÒå------------------------------------------*/
class WqQP{
protected:
int QP[21][21]; //ÆåÅÌ:ÄÚ²¿´ÓQP[1][1]µ½QP[19][19],ÆäÓàΪÍⲿ
int xPos,yPos; //Êó±ê×ø±ê
int xP,yP; //ÆåÅÌ×ø±ê
public:
WqQP(){ //¹¹Ô캯Êý,ÆåÅ̳õʼ»¯,²¢¶Ôÿ¸öÆå×ÓµÄÆø½øÐгõʼ»¯
for(int i=1;i<=19;i++)
for(int j=1;j<=19;j++)
{QP[i][j]=0;}
for(int j=0;j<21;j++)
{
QP[0][j]=100;
QP[20][j]=100;
QP[j][0]=100;
QP[j][20]=100;
}
}
void drawQP(HINSTANCE,HDC,int,int ,int ); //»ÆåÅÌ
void drawQP0(HINSTANCE,HDC,int,int,int,int); //Ìá×ÓʱÖØ»
void drawQPRepeat(HINSTANCE,HDC,int,int,int); //°ÑÌá×ÓλÖø²¸Ç
void drawBQZ(HINSTANCE,HDC,int,int,int); //»ºÚÆå×Ó
void drawWQZ(HINSTANCE,HDC,int,int,int); //»°×Æå×Ó
void drawQZ(HDC,int,int,int); //»Æå×Ó
void drawQZB(HDC xxx,int xx,int yy,int); //¸øµ±Ç°Æå×Ó»ºì±ß
void transSB(int,int,int); //½«Êó±ê×ø±ê»»ËãΪÆåÅ̸ñµã×ø±ê
int XX(){return xP;} //µÃµ½ÆåÅÌ×ø±ê
int YY(){return yP;} //µÃµ½ÆåÅÌ×ø±ê
int getQP(int i,int j){return QP[i][j];} //µÃµ½ÆåÅ̵ã(i,j)µÄ״̬£º°××Ó1£¬ºÚ×Ó-1£¬¿Õ0
void putQP(int i,int j,int n){QP[i][j]=n;} //ÔÚÆåÅ̵ã(i,j)¸³Öµn£º°××Ón=1£¬ºÚ×Ón=-1£¬¿Õn=0
void push(Sqstack *,int ,int ); //½øÕ»²Ù×÷
void pop(Sqstack *); //³öÕ»²Ù×÷
int research(Pos*,int); //²éÕÒ
void play1(HINSTANCE,HWND,HDC,int,int,int,int); //Á½ÈËÏÂÆå
void killQZ(HINSTANCE,HWND,HDC,int,int,int,int,int,int); //Ìá×ßËÀ×Ó
};
WqQP wqqp;//Éú³ÉÆåÅ̶ÔÏóʵÀý,¸øÆåÅÌÄÚ²¿¸³0£¬Íⲿ¸³100
//**********ÀàWqQPµÄ³ÉÔ±º¯Êý¶¨Ò壺******************************
/*------------------------------------------»ÆåÅ̽çÃ溯ÊýdrawQP------------------------------------------*/
void WqQP::drawQP(HINSTANCE hInstance,HDC hdc,int t,int cxClient,int cyClient)
{
int i;
char temp[50]; //ÁÙʱ×Ö·ûÊý×飬ÓÃÓÚת»»Êä³ö
//create pens
HPEN LinePen = CreatePen(PS_SOLID,1,RGB(35,71,107));
HPEN rectPen = CreatePen(PS_SOLID,1,RGB(0,0,0));
HPEN OldPen = NULL;
//create brush
HBRUSH hBrush = CreateSolidBrush(RGB(216,153,26));
HBRUSH hBrush1= CreateSolidBrush(RGB(180,133,0));
HBRUSH hBrush2= CreateSolidBrush(RGB(35,71,107));
HBRUSH OldBrush = NULL;
//create help font
//¸Ãº¯Êý´´½¨Ò»ÖÖÓÐÌØÊâÐÔµÄÂß¼×ÖÌ壬´ËÂß¼×ÖÌå¿ÉÒÔÔÚºóÃæ±»ÈκÎÉ豸ѡÔñ
HFONT w_FontShow1 = CreateFont(25,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,
GB2312_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,FIXED_PITCH | FF_MODERN,"¿¬Ìå_GB2312");
HFONT w_FontShow3 = CreateFont(18,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,
GB2312_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,FIXED_PITCH | FF_MODERN,"ÐÂËÎÌå");
HFONT w_fontTitle = CreateFont(50,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,
GB2312_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,FIXED_PITCH | FF_MODERN,"»ªÎIJÊÔÆ");
HFONT oldFont = NULL;
//»ÆåÅÌ×ó°ë²¿·Ö
OldPen = (HPEN)SelectObject(hdc,rectPen);
OldBrush = (HBRUSH)SelectObject (hdc, hBrush) ;
Rectangle(hdc,0,0,cyClient,cyClient);
//»ÆåÅÌÓҰ벿·Ö
OldBrush = (HBRUSH)SelectObject(hdc,hBrush1);
Rectangle(hdc,cyClient,0,cxClient,cyClient);
//»ÆåÅÌÏߺÍËıߵÄ×Ö·û±êºÅ
OldPen = (HPEN)SelectObject(hdc,LinePen);
for(i=1; i<20; i++)
{
itoa(i,temp,10);
SetBkColor(hdc,RGB(216,153,26)); //Éè±êºÅ×ÖÌå±³¾°£¬ÓëÆåÅ̱³¾°Ïàͬ
TextOut(hdc,t-18,i*t-8,temp,strlen(temp)); //×ó±ß±êºÅ
TextOut(hdc,t*19+5,i*t-8,temp,strlen(temp)); //Óұ߱êºÅ
//ÀûÓÃASCIIÂ룬Êä³öÉÏϱêºÅ
temp[0]=i+64;
TextOut(hdc,i*t-5,t-22,temp,1); //ÉϱêºÅ
TextOut(hdc,i*t-5,19*t+5,temp,1); //ϱêºÅ
SetBkColor(hdc,RGB(255,255,255)); //»¹Ô×ÖÌå±³¾°
//»ÆåÅÌÏß
MoveToEx(hdc,i*t,t,NULL);
LineTo(hdc,i*t,19*t+1);
MoveToEx(hdc,t,i*t,NULL);
LineTo(hdc,19*t+1,i*t);
}//for
for(i=0; i<3; i++)
{
//»ÆåÅÌÖеľŸöÐÇ룬ÐÇ볤¿í·Ö±ðΪ6
OldBrush = (HBRUSH)SelectObject(hdc,hBrush2);
Rectangle(hdc,4*t-3,(4+6*i)*t-3,4*t+3,(4+6*i)*t+3);
Rectangle(hdc,10*t-3,(4+6*i)*t-3,10*t+3,(4+6*i)*t+3);
Rectangle(hdc,16*t-3,(4+6*i)*t-3,16*t+3,(4+6*i)*t+3);
}
//ÓÒ²àÎÄ×Ö˵Ã÷
SetBkColor(hdc,RGB(180,133,0)); //ÉèÎÄ×Ö±³¾°ÓëÆåÅÌÓҲ౳¾°Ïàͬ
sprintf(temp,"Χ Æå");
SetTextColor(hdc,RGB(0,136,184));
oldFont = (HFONT)SelectObject(hdc,w_fontTitle);
TextOut(hdc,cyClient+(cxClient-cyClient)/4,30,temp,strlen(temp));
SetTextColor(hdc,RGB(121,220,225));
sprintf(temp,"°´ space ¼üÖØпªÊ¼");
oldFont = (HFONT)SelectObject(hdc,w_FontShow3);
TextOut(hdc,cyClient+(cxClient-cyClient)/20,cyClient/5,temp,strlen(temp));
sprintf(temp,"ºÚ ·½");
SetTextColor(hdc,RGB(0,0,0));
oldFont = (HFONT)SelectObject(hdc,w_FontShow1);
TextOut(hdc,cyClient+(cxClient-cyClient)/2,7*(cyClient/20)-10,temp,strlen(temp));
sprintf(temp,"°× ·½");
SetTextColor(hdc,RGB(255,255,255));
oldFont = (HFONT)SelectObject(hdc,w_FontShow1);
TextOut(hdc,cyClient+(cxClient-cyClient)/2,12*(cyClient/20)-10,temp,strlen(temp));
sprintf(temp,"µÚ ÊÖ");
SetTextColor(hdc,RGB(0,199,246));
TextOut(hdc,cyClient+(cxClient-cyClient)/3,9*(cyClient/20),temp,strlen(temp));
TextOut(hdc,cyClient+(cxClient-cyClient)/3,14*(cyClient/20),temp,strlen(temp));
sprintf(temp,"Ìá×Ó ´Î");
TextOut(hdc,cyClient+(cxClient-cyClient)/3,10*(cyClient/20),temp,strlen(temp));
TextOut(hdc,cyClient+(cxClient-cyClient)/3,15*(cyClient/20),temp,strlen(temp));
SetTextColor(hdc,RGB(0,0,0)); //»¹Ô×ÖÌåÑÕÉ«
SetBkColor(hdc,RGB(255,255,255)); //»¹Ô×ÖÌå±³¾°
SelectObject(hdc,GetStockObject(SYSTEM_FONT)); //»¹Ôϵͳ×ÖÌå´óС
//³õʼ»¯Ìáʾ:ÏÔʾÆåͲ
static HBITMAP hBitmap1,hBitmap2,hOldBitmap;
static BITMAP bmpinfo;
static int cxBitmap,cyBitmap;
static HDC hdcBackBuffer;
hBitmap1 = (HBITMAP)LoadImage(hInstance,"whitepan.BMP",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
hBitmap2 = (HBITMAP)LoadImage(hInstance,"blackpan.BMP",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
hdcBackBuffer = CreateCompatibleDC (NULL) ;//ÉêÇ뻺´æ¿Õ¼ä
//Ë¢ÐÂʱ¸ù¾Ýµ±Ç°²½ÊýstepÅжÏÓ¦¸ÃÏÔʾʲôÆåͲ
if(step%2==1)
{
GetObject (hBitmap1, sizeof (BITMAP), &bmpinfo) ;
cxBitmap = bmpinfo.bmWidth ;
cyBitmap = bmpinfo.bmHeight ;
hOldBitmap=(HBITMAP)SelectObject(hdcBackBuffer,hBitmap1);
StretchBlt (hdc,22*(cyClient/20)-(cyClient/20)/2,12*(cyClient/20)-(cyClient/20)/2,3*(cyClient/20)/2,3*(cyClient/20)/2,hdcBackBuffer,0,0,cxBitmap,cyBitmap,SRCCOPY);
}
else
{
GetObject (hBitmap2, sizeof (BITMAP), &bmpinfo) ;
cxBitmap = bmpinfo.bmWidth ;
cyBitmap = bmpinfo.bmHeight ;
hOldBitmap=(HBITMAP)SelectObject(hdcBackBuffer,hBitmap2);
StretchBlt (hdc,22*(cyClient/20)-(cyClient/20)/2,7*(cyClient/20)-(cyClient/20)/2,3*(cyClient/20)/2,3*(cyClient/20)/2,hdcBackBuffer,0,0,cxBitmap,cyBitmap,SRCCOPY);
}
//³õʼ»¯ÆåÅÌ£¬½çÃæ´óС»¯Ê±µ÷Ó㬶ÔÆå×ÓÖØ»
for( i=1;i<=19;i++)
for(int j=1;j<=19;j++)
{
if(QP[i][j]==1) drawWQZ(hInstance,hdc,i,j,t);
if(QP[i][j]==-1)drawBQZ(hInstance,hdc,i,j,t);
}
//ÖØ»µ±Ç°Æå×Ó±êÖ¾
if(step>0)
drawQZB(hdc,SX[step-1],SY[step-1],cyClient/20);
// ³õʼ»¯ÏÔʾµÚ¼¸ÊÖ
itoa(whitenum,temp,10);
SetBkColor(hdc,RGB(180,133,0));
TextOut(hdc,cyClient+(cxClient-cyClient)/3+55,9*(cyClient/20),temp,strlen(temp));
itoa(blacknum,temp,10);
TextOut(hdc,cyClient+(cxClient-cyClient)/3+55,14*(cyClient/20),temp,strlen(temp));
// ³õʼ»¯ÏÔʾÌá×Ó´ÎÊý
itoa(weatnum,temp,10);
TextOut(hdc,cyClient+(cxClient-cyClient)/3+55,15*(cyClient/20),temp,strlen(temp));
itoa(beatnum,temp,10);
TextOut(hdc,cyClient+(cxClient-cyClient)/3+55,10*(cyClient/20),temp,strlen(temp));
SetBkColor(hdc,RGB(255,255,255));
//ÊÍ·ÅËùʹÓõÄ×ÊÔ´
DeleteObject(LinePen);
DeleteObject(rectPen);
DeleteObject(OldPen);
DeleteObject(hBrush);
DeleteObject(hBrush1);
DeleteObject(hBrush2);
DeleteObject(OldBrush);
DeleteObject(w_fontTitle);
DeleteObject(w_FontShow3);
DeleteObject(oldFont);
DeleteObject(hBitmap2);
DeleteDC(hdcBackBuffer);
}
/*---------------------------------------------ÖØ»º¯ÊýdrawQP0----------------------------------------------*/
void WqQP::drawQP0(HINSTANCE hInstance,HDC hdc,int t,int cxClient,int cyClient,int w_count)
{
int i,j;
//µ±Ë¢ÐÂʱ£¬°ÑËùÓеIJÎÊý¶¼ÉèΪ0
if(w_count==0)
{
for(i=1;i<=19;i++)
for(j=1;j<=19;j++)
{
QP[i][j]=0;
}
step=0;
blacknum= 0;
whitenum= 0;
beatnum = 0;
weatnum = 0;
}
//µ±Ìá×Óʱ£¬ËùÓÐQP[i][j]Ϊ2,¼´ÎªÒªÌá×ßµÄ×Ó£¬¶ÔÆäλÖÃÀûÓÃdrawQPRepeatº¯Êý½øÐÐÖØ»
else{
for(i=1;i<=19;i++)
for(j=1;j<=19;j++)
{
if(QP[i][j]==2) drawQPRepeat(hInstance,hdc,t,i*t,j*t);
}
}
}
/*------------------------------------ÖØ»Ìá×ÓµÄλÖÃdrawQP0------------------------------*/
void WqQP::drawQPRepeat(HINSTANCE hinstance,HDC hdc,int t,int x,int y)
{
//create pens
HPEN LinePen = CreatePen(PS_SOLID,1,RGB(35,71,107)); //ÆåÅÌÏßÑÕÉ«
HPEN rectPen = CreatePen(PS_SOLID,1,RGB(216,153,26)); //¾ØÐαßÑÕÉ«
HPEN OldPen = NULL;
//create brush
HBRUSH hBrush = CreateSolidBrush(RGB(216,153,26)); //¾ØÐÎÄÚ²¿ÑÕÉ«
HBRUSH OldBrush = NULL;
OldPen = (HPEN)SelectObject(hdc,rectPen);
OldBrush = (HBRUSH)SelectObject(hdc,hBrush);
Rectangle(hdc,x-t/2,y-t/2,x+t/2,y+t/2); //»¾ØÐΣ¬¸²¸ÇÆå×Ó
OldPen = (HPEN)SelectObject(hdc,LinePen);
char temp[6];//ÖØÊä±êºÅ
//ÔÚ×î×ó±ßÇÒ²»ÊǽÇ
if(x/t==1 && y/t!=1 && y/t!= 19)
{
MoveToEx(hdc,x,y,NULL);
LineTo(hdc,x+t/2+1,y);
MoveToEx(hdc,x,y-t/2-1,NULL);
LineTo(hdc,x,y+t/2+1);
itoa(y/t,temp,10);
SetBkColor(hdc,RGB(216,153,26)); //Éè±êºÅ×ÖÌå±³¾°£¬ÓëÆåÅ̱³¾°Ïàͬ
TextOut(hdc,t-18,y-8,temp,strlen(temp)); //ÖØ»±¾Æå×Ó×ó±ß±êºÅ
}
//ÔÚ×îÓÒ±ßÇÒ²»ÊǽÇ
else if(x/t==19 && y/t!=1 && y/t!= 19)
{
MoveToEx(hdc,x-t/2-1,y,NULL);
LineTo(hdc,x,y);
MoveToEx(hdc,x,y-t/2-1,NULL);
LineTo(hdc,x,y+t/2+1);
itoa(y/t,temp,10);
SetBkColor(hdc,RGB(216,153,26)); //Éè±êºÅ×ÖÌå±³¾°£¬ÓëÆåÅ̱³¾°Ïàͬ
TextOut(hdc,t*19+5,y-8,temp,strlen(temp)); //ÖØ»±¾Æå×ÓÓұ߱êºÅ
}
//ÔÚ×îÉϱßÇÒ²»ÊǽÇ
else if(y/t==1 && x/t!=1 && x/t!= 19)
{
MoveToEx(hdc,x-t/2-1,y,NULL);
LineTo(hdc,x+t/2+1,y);
MoveToEx(hdc,x,y,NULL);
LineTo(hdc,x,y+t/2+1);
temp[0]=x/t+64;
SetBkColor(hdc,RGB(216,153,26));
TextOut(hdc,x-5,t-22,temp,1); //ÖØ»±¾Æå×ÓÉϱêºÅ
}
//ÔÚ×îϱßÇÒ²»ÊǽÇ
else if(y/t==19 && x/t!=1 && x/t!= 19)
{
MoveToEx(hdc,x-t/2-1,y,NULL);
LineTo(hdc,x+t/2+1,y);
MoveToEx(hdc,x,y-t/2-1,NULL);
LineTo(hdc,x,y);
temp[0]=x/t+64;
SetBkColor(hdc,RGB(216,153,26));
TextOut(hdc,x-5,19*t+5,temp,1); //ÖØ»±¾Æå×ÓϱêºÅ
}
//ÔÚ×óÉϽÇ
else if (x/t==1 && y/t==1)
{
MoveToEx(hdc,x,y,NULL);
LineTo(hdc,x+t/2+1,y);
MoveToEx(hdc,x,y,NULL);
LineTo(hdc,x,y+t/2+1);
sprintf(temp,"1");
SetBkColor(hdc,RGB(216,153,26)); //Éè±êºÅ×ÖÌå±³¾°£¬ÓëÆåÅ̱³¾°Ïàͬ
TextOut(hdc,t-18,y-8,temp,strlen(temp)); //ÖØ»±¾Æå×Ó×ó±ß±êºÅ
sprintf(temp,"A"); //ÖØ»±¾Æå×ÓÉϱ߱êºÅ
TextOut(hdc,x-5,t-22,temp,1);
}
//µãÔÚÓÒÉϽÇ
else if (x/t==19 && y/t==1)
{
MoveToEx(hdc,x-t/2-1,y,NULL);
LineTo(hdc,x,y);
MoveToEx(hdc,x,y,NULL);
LineTo(hdc,x,y+t/2+1);
itoa(y/t,temp,10);
SetBkColor(hdc,RGB(216,153,26)); //Éè±êºÅ×ÖÌå±³¾°£¬ÓëÆåÅ̱³¾°Ïàͬ
TextOut(hdc,t*19+5,y-8,temp,strlen(temp)); //ÖØ»±¾Æå×ÓÓұ߱êºÅ
sprintf(temp,"S"); //ÖØ»±¾Æå×ÓÉϱ߱êºÅ
TextOut(hdc,x-5,t-22,temp,1);
}
//µãÔÚÓÒϽÇ
else if (x/t==19 && y/t==19)
{
MoveToEx(hdc,x-t/2-1,y,NULL);
LineTo(hdc,x,y);
MoveToEx(hdc,x,y-t/2-1,NULL);
LineTo(hdc,x,y);
itoa(y/t,temp,10);
SetBkColor(hdc,RGB(216,153,26)); //Éè±êºÅ×ÖÌå±³¾°£¬ÓëÆåÅ̱³¾°Ïàͬ
TextOut(hdc,t*19+5,y-8,temp,strlen(temp)); //ÖØ»±¾Æå×ÓÓұ߱êºÅ
temp[0]=x/t+64;
TextOut(hdc,x-5,19*t+5,temp,1); //ÖØ»±¾Æå×ÓϱêºÅ
}
//µãÔÚ×óϽÇ
else if (x/t==1 && y/t==19)
{
MoveToEx(hdc,x,y,NULL);
LineTo(hdc,x+t/2+1,y);
MoveToEx(hdc,x,y-t/2-1,NULL);
LineTo(hdc,x,y);
itoa(y/t,temp,10);
SetBkColor(hdc,RGB(216,153,26)); //Éè±êºÅ×ÖÌå±³¾°£¬ÓëÆåÅ̱³¾°Ïàͬ
TextOut(hdc,t-18,(y/t)*t-8,temp,strlen(temp)); //ÖØ»±¾Æå×Ó×ó±ß±êºÅ
temp[0]=x/t+64;
TextOut(hdc,x-5,19*t+5,temp,1); //ÖØ»±¾Æå×ÓϱêºÅ
}
//²»ÔÚËÄÖÜ
else
{
MoveToEx(hdc,x-t/2-1,y,NULL); //»¸²¸ÇµÄÆå×ÓλÖõĺᡢ×ÝÆåÅÌÏß
LineTo(hdc,x+t/2+1,y);
MoveToEx(hdc,x,y-t/2-1,NULL);
LineTo(hdc,x,y+t/2+1);
}
SetBkColor(hdc,RGB(255,255,255)); //»¹Ô×ÖÌå±³¾°
//ÊÍ·ÅËùÓÃ×ÊÔ´
DeleteObject(LinePen);
DeleteObject(rectPen);
DeleteObject(hBrush);
DeleteObject(OldBrush);
DeleteObject(OldPen);
}
/*------------------------------------------»°×Æå×Óº¯Êý-----------------------------------*/
void WqQP::drawWQZ(HINSTANCE hInstance,HDC hdc,int xx,int yy,int tt)
{
PlaySound("1.wav", NULL, SND_FILENAME | SND_ASYNC );
//ÔÚ×ø±ê£¨xx,yy£©ÏÔʾһ¸öÆå×Ó£¬ÓÃÒ»¸öºÚÆå×ÓͼƬ±íʾ
static HBITMAP hBitmap1,hOldBitmap;//ÔÚ×ø±ê£¨xx,yy£©ÏÔʾһ¸öÆå×Ó£¬ÓÃÒ»¸ö°×Æå×ÓͼƬ±íʾ
static BITMAP bmpinfo;
static int cxBitmap,cyBitmap;
static HDC hdcBackBuffer;
hBitmap1 = (HBITMAP)LoadImage(hInstance,"white.BMP",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
hdcBackBuffer = CreateCompatibleDC (NULL) ;//ÉêÇ뻺´æ¿Õ¼ä
GetObject (hBitmap1, sizeof (BITMAP), &bmpinfo) ;
cxBitmap = bmpinfo.bmWidth ;
cyBitmap = bmpinfo.bmHeight ;
hOldBitmap=(HBITMAP)SelectObject(hdcBackBuffer,hBitmap1);
StretchBlt (hdc,xx*tt-tt/2+3,yy*tt-tt/2+3,tt/2+10,tt/2+10,hdcBackBuffer,0,0,cxBitmap,cyBitmap,SRCCOPY);
DeleteObject(hBitmap1);
DeleteObject(hOldBitmap);
DeleteDC(hdcBackBuffer);
}
/*------------------------------------------»ºÚÆå×Óº¯Êý-----------------------------------*/
void WqQP::drawBQZ(HINSTANCE hInstance,HDC hdc,int xx,int yy,int tt)
{
PlaySound("1.wav", NULL, SND_FILENAME | SND_ASYNC );
static HBITMAP hBitmap1,hOldBitmap;//ÔÚ×ø±ê£¨xx,yy£©ÏÔʾһ¸öÆå×Ó£¬ÓÃÒ»¸ö°×Æå×ÓͼƬ±íʾ
static BITMAP bmpinfo;
static int cxBitmap,cyBitmap;
static HDC hdcBackBuffer;
hBitmap1 = (HBITMAP)LoadImage(hInstance,"black.BMP",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
hdcBackBuffer = CreateCompatibleDC (NULL) ;//ÉêÇ뻺´æ¿Õ¼ä
GetObject (hBitmap1, sizeof (BITMAP), &bmpinfo) ;
cxBitmap = bmpinfo.bmWidth ;
cyBitmap = bmpinfo.bmHeight ;
hOldBitmap = (HBITMAP)SelectObject(hdcBackBuffer,hBitmap1);
StretchBlt (hdc,xx*tt-tt/2+3,yy*tt-tt/2+3,tt/2+8,tt/2+8,hdcBackBuffer,0,0,cxBitmap,cyBitmap,SRCCOPY);
DeleteObject(hBitmap1);
DeleteObject(hOldBitmap);
DeleteDC(hdcBackBuffer);
}
/*------------------------------------------¶Ôµ±Ç°Æå×Ó×ö¡°Ê®¡±×Ö±ê¼Ç-----------------------------------*/
void WqQP::drawQZB(HDC xxx,int xx,int yy,int tt)
{
static int fnPenStyle = PS_SOLID;
static int nPenWidth = 2;
static COLORREF crPenColor = 255;//Ê®×ÖµÄÑÕÉ«:ºì
HPEN h0Pen;
h0Pen = CreatePen(fnPenStyle, nPenWidth, crPenColor);
SelectObject(xxx, h0Pen);
//»æÖÆÊ®×Ö
MoveToEx(xxx,xx*tt-5,yy*tt,NULL);
LineTo(xxx,xx*tt+5,yy*tt);
MoveToEx(xxx,xx*tt,yy*tt-5,NULL);
LineTo(xxx,xx*tt,yy*tt+5);
DeleteObject(h0Pen);
}
/*----------------------½«Êó±ê×ø±ê(xPos,yPos)»»ËãΪÆåÅ̸ñµã×ø±ê(xP,yP)-----------*/
void WqQP::transSB(int xPos,int yPos,int tt)
{
if(xPos % tt > (tt/2)){xPos=xPos-xPos%tt+tt-1;}else {xPos=xPos-xPos%tt-1;}
if(yPos % tt > (tt/2)){yPos=yPos-yPos%tt+tt-1;}else {yPos=yPos-yPos%tt-1;}
xP=(xPos)/tt+1; yP=(yPos)/tt+1;
}
/*----------------------------------------¶þÈ˶ÔÞÄ---------------------------------------*/
void WqQP::play1(HINSTANCE hInstance,HWND hwnd,HDC hdc,int tt,int cxClient,int cyClient,int w_count)
{
//ÎÄ×ÖÇøÏÂÆåÌáʾ(ºÚ,°×Æå×Ó)
//ÉêÇë»±ÊÓë»Ë¢×ÊÔ´
char temp[10];
HPEN hpen = CreatePen(PS_SOLID,0,RGB(180,133,0));
HBRUSH hBrush1= CreateSolidBrush(RGB(180,133,0));
HBRUSH hBrush2= CreateSolidBrush(RGB(35,71,107));
HBRUSH OldBrush = NULL;
HPEN OldPen = NULL;
//°Ñ°×ÆåͲÓëºÚÆåͲ³õʼ»¯µ½Á½¸öͼƬ¾ä±úÖУ¨hBitmap1,hBitmap2£©
static HBITMAP hBitmap1,hBitmap2,hOldBitmap;
static BITMAP bmpinfo;
static int cxBitmap,cyBitmap;
static HDC hdcBackBuffer;
hBitmap1 = (HBITMAP)LoadImage(hInstance,"whitepan.BMP",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
hBitmap2 = (HBITMAP)LoadImage(hInstance,"blackpan.BMP",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
hdcBackBuffer = CreateCompatibleDC (NULL) ; //ÉêÇ뻺´æ¿Õ¼ä
OldBrush = (HBRUSH)SelectObject(hdc,hBrush1);
OldPen = (HPEN)SelectObject(hdc,hpen);
SetBkColor(hdc,RGB(180,133,0));
//Èç¹ûΪżÊý²½£¬Ó¦³ö°×Æ壬¹ÊÏÔʾ°×ÆåͲ
if(step%2==0 && QP[XX()][YY()]==0)
{
Rectangle(hdc,22*tt-tt,7*tt-tt,23*tt+tt,7*tt+tt); //°ÑÉÏÒ»´ÎÏÔʾµÄºÚÆåͲ¸²¸Ç
//ÔÚËùÐèλÖÃÏÔʾ°×ÆåͲ
GetObject (hBitmap1, sizeof (BITMAP), &bmpinfo) ;
cxBitmap = bmpinfo.bmWidth ;
cyBitmap = bmpinfo.bmHeight ;
hOldBitmap=(HBITMAP)SelectObject(hdcBackBuffer,hBitmap1);
StretchBlt (hdc,22*tt-tt/2,12*tt-tt/2,3*tt/2,3*tt/2,hdcBackBuffer,0,0,cxBitmap,cyBitmap,SRCCOPY);
//°×Æå´ÎÊý¼Ó1,²¢½«ÆäÊä³ö
whitenum++;
itoa(whitenum,temp,10);
TextOut(hdc,cyClient+(cxClient-cyClient)/3+55,9*(cyClient/20),temp,strlen(temp));
}
//Èç¹ûΪÆæÊý²½£¬ÔòÓ¦³öºÚÆ壬¹ÊÏÔʾºÚÆåͲ
else if(step%2==1 && QP[XX()][YY()]==0)
{
Rectangle(hdc,22*tt-tt,12*tt-tt,22*tt+tt,12*tt+tt); °ÑÉÏÒ»´ÎÏÔʾµÄ°×ÆåͲ¸²¸Ç
//ÔÚËùÐèλÖÃÏÔʾºÚÆåͲ
GetObject (hBitmap2, sizeof (BITMAP), &bmpinfo) ;
cxBitmap = bmpinfo.bmWidth ;
cyBitmap = bmpinfo.bmHeight ;
hOldBitmap=(HBITMAP)SelectObject(hdcBackBuffer,hBitmap2);
StretchBlt (hdc,22*tt-tt/2,7*tt-tt/2,3*tt/2,3*tt/2,hdcBackBuffer,0,0,cxBitmap,cyBitmap,SRCCOPY);
//ºÚÆå´ÎÊý¼Ó1,²¢½«ÆäÊä³ö
blacknum++;
itoa(blacknum,temp,10);
TextOut(hdc,cyClient+(cxClient-cyClient)/3+55,14*(cyClient/20),temp,strlen(temp));
}
SetBkColor(hdc,RGB(255,255,255));
//ÊÍ·Å×ÊÔ´
DeleteObject(hpen);
DeleteObject(OldPen);
DeleteObject(hBrush1);
DeleteObject(OldBrush);
DeleteObject(hBitmap2);
DeleteObject(hBitmap1);
DeleteDC(hdcBackBuffer);
//°Ñµ±Ç°µÄÊó±êËùÔÚÆåÅÌ×ø±ê´æ´¢
SX[step]=XX();SY[step]=YY();
//żÊý²½£¬´ÓµÚstep=0²½¿ªÊ¼£¬ÏºÚÆå
if(step%2==0 && QP[XX()][YY()]==0)
{
//ÉÏÒ»²½ÊÇÏÔʾµÄ°×Æ壬Öػһ´Î¸²¸ÇÉϴε±Ç°Æå×Ӻ조ʮ¡±×ּǺÅ,step=0ʱ²»¸²¸Ç
if(step>1)
drawWQZ(hInstance,hdc,SX[step-1],SY[step-1],tt);
drawBQZ(hInstance,hdc,XX(),YY(),tt);//»ºÚ×Ó
drawQZB(hdc,XX(),YY(),tt);//»ºì±ê¼Ç£¬±íʾµ±Ç°Æå×Ó
putQP(XX(),YY(),-1);
++step;
//µ÷ÓÃÌá×Óº¯Êý£¬¿´ÊÇ·ñ¿É¶Ô°×Æå½øÐÐÌá×Ó
killQZ(hInstance,hwnd,hdc,SX[step-1],SY[step-1],tt,cxClient,cyClient,w_count);
}
//ÆæÊý²½£¬Ï°×Æå
else if(step%2==1 && QP[XX()][YY()]==0)
{
//ÉÏÒ»²½ÏÔʾºÚÆ壬Öػһ´Î¸²¸ÇÉϴε±Ç°Æå×Ӻ조ʮ¡±×ּǺÅ
drawBQZ(hInstance,hdc,SX[step-1],SY[step-1],tt);
drawWQZ(hInstance,hdc,XX(),YY(),tt);//»°××Ó
drawQZB(hdc,XX(),YY(),tt);//»ºì±ê¼Ç£¬±íʾµ±Ç°Æå×Ó
putQP(XX(),YY(),1);
++step;
//µ÷ÓÃÌá×Óº¯Êý£¬¿´ÊÇ·ñ¿É¶ÔºÚÆå½øÐÐÌá×Ó
killQZ(hInstance,hwnd,hdc,SX[step-1],SY[step-1],tt,cxClient,cyClient,w_count);
}
}
/*----------------------------------------Ìá×ÓËã·¨---------------------------------------*/
LNode *p1,*p2,*head; //¶¨ÒåÁ´±í±äÁ¿
Sqstack *t,*q,*top; //¶¨ÒåÁ´Õ»±äÁ¿
Pos *s = (Pos *) malloc (sizeof(Pos)); //ÉêÇëÒ»¸ö½áµã¿Õ¼ä
void WqQP::killQZ(HINSTANCE hInstance,HWND hwnd,HDC hdc,int sx,int sy,int tt,int cxClient,int cyClient,int w_count)
{
//¶ÔÁ´±í³õʼ»¯
head = (LNode *) malloc (sizeof (LNode));//Í·½áµã
head->next = NULL;
p1 = head;
//¶ÔÁ´Õ»³õʼ»¯
t=(Sqstack *) malloc (sizeof(Sqstack));
t->link=NULL;
q = t;
//´æ·Åµ±Ç°ËùÏÂÆå×ÓÖÜΧµÄ²»Í¬É«Æå×Ó
int aa[20]; //´æÆäºá¡¢×Ý×ø±ê
int count=0;
int i;
int tag; //±íʾµ±Ç°ËùÏÂÆå×ÓÈç°×Æå 1,ºÚÆå -1
int temp; //µ±Ç°²½Êý
char temp0[10],temp1[10]; //ת»»Êý×Ö£¬ÓÃÓÚÊä³ö
int flag=0;
temp=step-1;
if((temp%2==0) && (temp>0)) //Õâ²½ÊÇϵĺÚÆå
tag=-1;
else //Õâ²½ÊÇϵİ×Æå
tag=1;
//³õʼ»¯aaÊý×é
for(i=0; i<10; i++)
aa[i]=0;
//¶Ôµ±Ç°ËùÏÂÆå×ÓµÄËÄÖܽøÐÐÅжϣ¬ÈôÓÐÓëÆ䲻ͬɫµÄÆå×Ó£¬½«Æäºá¡¢×Ý×ø±ê´æÈëaaÊý×éÖÐ
if(QP[sx-1][sy]==(-1)*tag) { aa[count++]=sx-1;aa[count++]=sy;}
if(QP[sx+1][sy]==(-1)*tag) { aa[count++]=sx+1;aa[count++]=sy;}
if(QP[sx][sy-1]==(-1)*tag) { aa[count++]=sx;aa[count++]=sy-1;}
if(QP[sx][sy+1]==(-1)*tag) { aa[count++]=sx;aa[count++]=sy+1;}
//¶ÔÆäÖеÄÿ¸ö²»Í¬É«Æå×Ó¶¼½øÐмì²é£¬¿´ÄÜ·ñÂú×ãÌá×ÓÌõ¼þ
i=0;
while(aa[i]>0)
{
//µ±Ç°Æå×ÓËÄÖܵÄÆå×Ó¶¼ÉèΪδ·ÃÎʹý,ΪÁË·ÀÖ¹Ò»¸öÆå×ÓͬʱÂú×ãÁ½¸ö´®µÄÌõ¼þ¡£
for(int ii=1; ii<20; ii++)
for(int jj=1; jj<20; jj++)
visited[ii][jj]=0;
//È¡³öÒ»¸öÆå×Ó×ø±ê
s->row = aa[i++];
s->col = aa[i++];
//½«×ø±êÈëÕ»
push(q,s->row,s->col);
visited[s->row][s->col]=1;
flag=research(s,tag);
while(flag==1) //ËÄÖܶ¼Âú,ÇÒÓÐÓëÆäÏàÁ¬µÄͬɫÆå×Ó
{
push(q,s->row,s->col);
visited[s->row][s->col]=1;
flag=research(s,tag);
}
if(flag==-1) //»¹ÓÐÆø
{
head->next = NULL;
p1 = head;
t->link=NULL;
q = t;
continue;
}
//ÀûÓÃÕ»½øÐеݹé²Ù×÷
while(q->link!=t )
{
pop(q);
s->row = q->row;
s->col = q->col;
flag=research(s,tag);
while(flag==1)
{
push(q,s->row,s->col);
visited[s->row][s->col]=1;
flag=research(s,tag);
}
if(flag==-1)
{
head->next = NULL;
p1=head;
t->link=NULL;
q = t;
break ;
}
}
//ÈôÕÒµ½Âú×ãÌá×ÓÌõ¼þµÄÆå×Ó£¬Ôò½øÐÐÌá×Ó²Ù×÷
//°ÑÐèÌá×ÓµÄQPÖµ¸ÄΪ2
p1=head;
while(p1->next!=NULL)
{
int i,j;
p2=p1->next;
p1=p2->next;
head->next=p1;
i = p2->row;
j = p2->col;
QP[i][j]=2;
p1=head;
}
head->next = NULL;
p1=head;
t->link=NULL;
q = t;
//ÓÃÓÚÊä³öÌá×Ó´ÎÊý
if(flag==0)
{
if(tag==1)
weatnum++;itoa(beatnum,temp0,10);
if(tag == -1)
beatnum++;itoa(weatnum,temp1,10);
SetBkColor(hdc,RGB(180,133,0));
itoa(beatnum,temp1,10);
itoa(weatnum,temp0,10);
TextOut(hdc,cyClient+(cxClient-cyClient)/3+55,10*(cyClient/20),temp1,strlen(temp1));
TextOut(hdc,cyClient+(cxClient-cyClient)/3+55,15*(cyClient/20),temp0,strlen(temp0));
SetBkColor(hdc,RGB(255,255,255));
}
//ÀûÓÃdrawQP0º¯Êý¶ÔÆÁÄ»½øÐÐˢУ¬¼´°ÑûÆøµÄ×ÓÌáµô
drawQP0(hInstance,hdc,tt,cxClient,cyClient,w_count);
drawQZB(hdc,sx,sy,tt); //±ê¼Çµ±Ç°Æå×Ó
}
return;
}
//²éѯ,¿´Æå×ÓsËÄÖܵÄÇé¿ö£¬ÓÐÆø£¬·µ»Ø£1,ÎÞÆø·µ»Ø0,»¹ÓÐͬɫÆå×Ó·µ»Ø1
int WqQP::research(Pos *s, int tag)
{
int row,col;
row = s->row;
col = s->col;
if((QP[row-1][col]==0 ) || (QP[row+1][col]==0) || (QP[row][col-1]==0 ) || (QP[row][col+1]==0)
||(QP[row-1][col]==2 ) || (QP[row+1][col]==2) || (QP[row][col-1]==2 ) || (QP[row][col+1]==2)
)
{
return -1; //Õâ¸öÆå×ÓËÄÖÜÖÁÉÙÓÐÒ»±ßΪ¿Õ
}
else
{
if((QP[row-1][col]==(-1)*tag) && (visited[row-1][col]!=1))
{
s->row = row-1;
s->col = col;
return 1;
}
if((QP[row+1][col]==(-1)*tag) && (visited[row+1][col]!=1))
{
s->row = row+1;
s->col = col;
return 1;
}
if((QP[row][col-1]==(-1)*tag) && (visited[row][col-1]!=1))
{
s->row = row;
s->col = col-1;
return 1;
}
if((QP[row][col+1]==(-1)*tag) && (visited[row][col+1]!=1))
{
s->row = row;
s->col = col+1;
return 1;
}
}
return 0; //Æå×ÓËÄÖܶ¼²»Îª¿Õ£¬ÇÒ¶¼Óës²»Í¬É«£¬»òͬɫµ«ÒѾ·ÃÎʹý
}
//ÈëÕ»
void WqQP::push(Sqstack *qq,int i,int j)//ÈëÕ»²Ù×÷
{
p2 = (LNode *) malloc (sizeof (LNode));//Ôö¼ÓµÄ½áµã
top = (Sqstack *)malloc(sizeof(Sqstack));
top->row=i;
top->col=j;
top->link=q;
q=top;
p2->row = i;
p2->col = j;
p2->next= p1->next;
p1->next= p2;
}
void WqQP::pop(Sqstack *qq)//³öÕ»²Ù×÷
{
Sqstack *top;
if(q->link!=NULL)
{
top=q;
q=q->link;
free(top);
}
else
{
exit(0);
}
}