关于四子棋的AI,四子棋高手进
#include <windows.h>
HINSTANCE hInst;
HWND hWnd;
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void MyPaint();
BOOL XiaQi(int whichPlay, LPARAM lParam);
BOOL IsWin(int whichPlay);
void SetMap();
HBITMAP bmp[3],bg,bufBmp;
HDC mdc,hdc,bufDC;
int who=1;
const int h=11,w=12;
const int picH=40,picW=40;
int map[w][h];
unsigned long now,pass;
void SetMap()
{
for(int i=0; i<w; i++)
{
for(int j=0; j<h; j++)
{
map[i][j]=0;
}
}
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
MyRegisterClass(hInstance);
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
while( msg.message!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
now=GetTickCount();
if(pass-now>=40)
{
MyPaint();
}
}
}
return msg.wParam;
}
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "canvas";
wcex.hIconSm = NULL;
return RegisterClassEx(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance;
hWnd = CreateWindow("canvas", "五子棋" , WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,0,0, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
SetMap();
bmp[0]=(HBITMAP)LoadImage(NULL,"white.bmp",IMAGE_BITMAP,picW,picH,LR_LOADFROMFILE);
bmp[1]=(HBITMAP)LoadImage(NULL,"red.bmp",IMAGE_BITMAP,picW,picH,LR_LOADFROMFILE);
bmp[2]=(HBITMAP)LoadImage(NULL,"black.bmp",IMAGE_BITMAP,picW,picH,LR_LOADFROMFILE);
if(!bmp[0] || !bmp[1] || !bmp[2])
{
MessageBox(hWnd,"找不要需要的资源,程序将退出.","错误提示",MB_ICONERROR);
ExitProcess(0);
}
MoveWindow(hWnd,10,10,640,480,true);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
hdc=GetDC(hWnd);
SetTextColor(hdc,RGB(255,0,0));
TextOut(hdc,500,100,"红方先下棋",strlen("红方先下棋"));
mdc=CreateCompatibleDC(hdc);
bufDC=CreateCompatibleDC(hdc);
bufBmp=CreateCompatibleBitmap(hdc,w*picW,h*picW);
SelectObject(mdc,bufBmp);
MyPaint();
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int i=0;
switch (message)
{
case WM_LBUTTONDOWN:
if(XiaQi(who,lParam))
{
MyPaint();
if(who==1)
{
if(IsWin(who))
{
MessageBox(hWnd,"红方获胜.","恭喜",MB_OK);
SetMap();
}
who=2;
SetTextColor(hdc,RGB(0,0,0));
TextOut(hdc,500,100,"轮到黑方下棋",strlen("轮到黑方下棋"));
}
else
{
if(IsWin(who))
{
MessageBox(hWnd,"黑方获胜.","恭喜",MB_OK);
SetMap();
}
who=1;
SetTextColor(hdc,RGB(255,0,0));
TextOut(hdc,500,100,"轮到红方下棋",strlen("轮到红方下棋"));
}
}
break;
case WM_DESTROY:
for(i=0; i<3; i++)
{
DeleteObject(bmp[i]);
}
ReleaseDC(hWnd,bufDC);
DeleteObject(bufBmp);
ReleaseDC(hWnd,mdc);
ReleaseDC(hWnd,hdc);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
void MyPaint()
{
SelectObject(mdc,bg);
for(int i=0; i<w; i++)
{
for(int j=0; j<h; j++)
{
SelectObject(bufDC,bmp[map[i][j]]);
BitBlt(mdc,picW*i,picW*j,picW*w,picH*h,bufDC,0,0,SRCCOPY);
}
}
BitBlt(hdc,0,0,picW*w,picH*h,mdc,0,0,SRCCOPY);
pass=GetTickCount();
}
BOOL XiaQi(int whichPlay, LPARAM lParam)
{
if( LOWORD(lParam) <= picW*w && LOWORD(lParam)>=0 &&
HIWORD(lParam) <= picH*h && HIWORD(lParam)>=0)
{
int x=0,y=0;
for(int i=1; i<=w; i++)
{
if( i*picW >= LOWORD(lParam) )
{
x=i;
x--;
break;
}
}
for(int j=1; j<=h; j++)
{
if( j*picH >= HIWORD(lParam) )
{
y=j;
y--;
break;
}
}
if(whichPlay==1)
{
if(map[x][y]==0)
{
map[x][y]=1;
}
else
{
return FALSE;
}
}
else
{
if(map[x][y]==0)
{
map[x][y]=2;
}
else
{
return FALSE;
}
}
return TRUE;
}
else
{
return FALSE;
}
}
BOOL IsWin(int whichPlay)
{
int num=0;
for(int i=0; i<w; i++)
{
for(int j=0; j<h; j++)
{
if(whichPlay==1)
{
if(map[i][j]==2 || map[i][j]==0 )
{
num=0;
}
if(map[i][j]==1 )
{
num++;
if(num==5)
{
return TRUE;
}
}
}
else
{
if(map[i][j]==1 || map[i][j]==0)
{
num=0;
}
if(map[i][j]==2)
{
num++;
if(num==5)
{
return TRUE;
}
}
}
}
}
num=0;
for( i=0; i<w; i++)
{
for(int j=0; j<h; j++)
{
if(whichPlay==1)
{
if(map[j][i]==2 || map[j][i]==0)
{
num=0;
}
if(map[j][i]==1)
{
num++;
if(num==5)
{
return TRUE;
}
}
}
else
{
if(map[j][i]==1||map[j][i]==0)
{
num=0;
}
if(map[j][i]==2)
{
num++;
if(num==5)
{
return TRUE;
}
}
}
}
}
num=0;
int k=0;
for(i=w-1; i>=0; i--)
{
for(int j=0; j<=i; j++)
{
if(whichPlay==1)
{
if(map[j+k][j]==0 || map[j+k][j]==2)
{
num=0;
}
if(map[j+k][j]==1)
{
num++;
}
if(num==5)
{
return TRUE;
}
}
else
{
if(map[j+k][j]==0 || map[j+k][j]==1)
{
num=0;
}
if(map[j+k][j]==2)
{
num++;
}
if(num==5)
{
return TRUE;
}
}
}
num=0;
k++;
}
num=0;
k=0;
for(i=w-1; i>=0; i--)
{
for(int j=0; j<=i; j++)
{
if(whichPlay==1)
{
if(map[j][j+k]==0 || map[j][j+k]==2)
{
num=0;
}
if(map[j][j+k]==1)
{
num++;
}
if(num==5)
{
return TRUE;
}
}
else
{
if(map[j][j+k]==0 || map[j][j+k]==1)
{
num=0;
}
if(map[j][j+k]==2)
{
num++;
}
if(num==5)
{
return TRUE;
}
}
}
num=0;
k++;
}
num=0;
for(i=0; i<w; i++)
{
k=i;
for(int j=w-1; j>=i; j--,k++)
{
if(whichPlay==1)
{
if(map[j][k]==0 || map[j][k]==2)
{
num=0;
}
if(map[j][k]==1)
{
num++;
}
if(num==5)
{
return TRUE;
}
}
else
{
if(map[j][k]==0 || map[j][k]==1)
{
num=0;
}
if(map[j][k]==2)
{
num++;
}
if(num==5)
{
return TRUE;
}
}
}
num=0;
}
num=0;
for( i=w-1; i>=0; i--)
{
k=0;
for(int j=i; j>=0; j--,k++)
{
if(whichPlay==1)
{
if(map[j][k]==0 || map[j][k]==2)
{
num=0;
}
if(map[j][k]==1)
{
num++;
}
if(num==5)
{
return TRUE;
}
}
else
{
if(map[j][k]==0 || map[j][k]==1)
{
num=0;
}
if(map[j][k]==2)
{
num++;
}
if(num==5)
{
return TRUE;
}
}
}
num=0;
}
return FALSE;
}