写比较麻烦,不过没牵涉到什么算法,只是一些逻辑问题
#include
#include
#include
#include
#include
LRESULT CALLBACK WndProc (HWND , UINT , WPARAM , LPARAM) ;
//定义主函数
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInst,LPSTR lpCmdLine,int nCmdShow){
WNDCLASS wndclass ;
HWND hWnd ;
MSG msg ;
char szWindowClass[] = "窗口示例" ; //窗口类名
char szTitle[] = "My Windows" ; //窗口标题
////////////////////////////////////////////
wndclass.cbClsExtra = 0 ;//窗口类无扩展
wndclass.cbWndExtra = 0 ; //窗口实例无扩展
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH) ;//窗口背景为白色
wndclass.hCursor = LoadCursor(NULL , IDC_ARROW) ;//窗口采用箭头光标
wndclass.hIcon = LoadIcon(hInstance ,MAKEINTRESOURCE(IDI_APPLICATION)) ;//窗口的最小化图标为默认图标
wndclass.hInstance = hInstance ;//当前实例句柄
wndclass.lpfnWndProc = WndProc ;//窗口处理函数为WndProc
wndclass.lpszMenuName = NULL ; //窗口中无菜单
wndclass.lpszClassName = szWindowClass ; //窗口的类名
wndclass.style = CS_HREDRAW | CS_VREDRAW|CS_DBLCLKS ; //窗口类型为默认类型
//////////////////////////////////////////.
//注册窗口类
if(!RegisterClass(&wndclass)){
MessageBox(NULL , _T("窗口类注册失败!") , _T("窗口注册") , NULL) ;
return 1 ;
}
////////////////////////////////////////
//创建窗口
hWnd=CreateWindow(
szWindowClass , //窗口类名
szTitle , //窗口实例的标题名
WS_OVERLAPPEDWINDOW , //窗口的样式
CW_USEDEFAULT , CW_USEDEFAULT , //窗口左上角坐标为默认 //窗口右上角坐标为默认
700 , 700 , //窗口宽度为默认 //窗口高度为默认
NULL , //此窗口无父窗口
NULL , //此窗口无主菜单
hInstance, //创建此窗口应用程序的当前句柄
NULL //不使用一个传递给窗口的参数值的指
);
if(!hWnd){
MessageBox(NULL , "创建窗口失败!" ,("创建窗口") , NULL) ;
return 1 ;
}
ShowWindow(hWnd,nCmdShow); //显示窗口
UpdateWindow(hWnd); //绘制用户区
//消息循环
while(GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg); //将消息的虚拟键转换为字符信息
DispatchMessage(&msg); //将信消息发送到指定窗口函数
}
return(int) msg.wParam ; //程序终止时讲信息返回系统
}
HFONT CreateMyFont(){
return CreateFont(
0,//字体高度
0,//字体宽度
0,
0,
600,//字体粗细
0,//字体倾斜 0为非倾斜
0,//下划线 0为非
0,//中划线 0为非
ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH,
"楷体_GB2312"//字体名
) ;
}
typedef struct point{
int x ,y ;
int color ;
int sf_flag ;
}MAP;
MAP map[15][15] ;
int a , b ;
void init(){
for(a = 0 ;a<15 ;a++){
for(b = 0 ; b<15 ;b++){
map[a][b].sf_flag = 0 ;//初始化每个点
map[a][b].color = -1 ;
}
}
}
int c_flag = 0 ;
int w_b = 0 ;//0下黑棋 非白棋
int pos_x ,pos_y ;
int x ,y ;
int Lbd_flag = 0;
int i_flag ,j_flag ;
int step1 = 0 ,step2=0 ,step3=0 ,step4=0 ;
char *str[]={"黑方赢! 点击重新开始。" ,"白方赢!点击重新开始。","黑方","白方"};
int over_flag = 0 ;
/////////////////////////////////////
//窗口函数(回调函数)
LRESULT CALLBACK WndProc( HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam){
HDC hDC ;
RECT rect ;
PAINTSTRUCT ps ;
HFONT hF ;
HBRUSH hBR1 ;
HBRUSH hBR2 ;
HPEN hPen1 ;
HPEN hPen2 ;
HCURSOR hcursor ;
int i ,j;
SIZE size ;
switch(message)
{
//鼠标信息
case WM_LBUTTONDOWN:
pos_x = LOWORD(lParam) ;
pos_y = HIWORD(lParam) ;
Lbd_flag = 1 ;
InvalidateRect(hWnd ,NULL ,TRUE) ;
break ;
case WM_MOUSEMOVE:
pos_x = LOWORD(lParam) ;
pos_y = HIWORD(lParam) ;
if(over_flag==0)
InvalidateRect(hWnd ,NULL ,TRUE) ;
break ;
case WM_LBUTTONUP:
break ;
case WM_DESTROY:
PostQuitMessage(0) ;
break ;
case WM_SIZE :
InvalidateRect(hWnd ,NULL ,1) ;
break ;
case WM_PAINT:
hDC = BeginPaint(hWnd ,&ps) ;
GetClientRect(hWnd, &rect) ;
hPen1 = CreatePen(PS_SOLID ,0 ,RGB(0,0,0)) ;
hPen2 = CreatePen(PS_SOLID ,2 ,RGB(255,0,0)) ;
hBR1 = CreateSolidBrush(RGB(255,255,255)) ;
hBR2 = CreateSolidBrush(RGB(0,0,0)) ;
SelectObject(hDC,hPen1) ;
if(c_flag)
TextOut(hDC,5,5,str[2],strlen(str[2])) ;
else{
GetTextExtentPoint32(hDC ,str[3],strlen(str[3]),&size) ;
TextOut(hDC,rect.right-size.cx-5,5,str[3],strlen(str[3])) ;
}
//确定坐标
for(i = 0 ;i<15 ;i++){
for(j = 0 ; j<15 ;j++){
map[i][j].x = rect.right*(j+2)/18 ;
map[i][j].y = rect.bottom*(i+2)/18 ;
}
}
//画图
for(j = 0 ;j<15 ;j++){
MoveToEx(hDC,map[0][j].x,map[0][j].y ,NULL);
LineTo(hDC,map[14][j].x ,map[14][j].y) ;
}
for(i = 0 ;i<15 ;i++){
MoveToEx(hDC,map[i][0].x,map[i][0].y ,NULL);
LineTo(hDC,map[i][14].x ,map[i][14].y) ;
}
//五个小黑点
SelectObject(hDC,hBR2) ;
Ellipse(hDC ,map[3][3].x-4 ,map[3][3].y-4,
map[3][3].x+4 ,map[3][3].y+4) ;
Ellipse(hDC ,map[3][11].x-4 ,map[3][11].y-4,
map[3][11].x+4 ,map[3][11].y+4) ;
Ellipse(hDC ,map[7][7].x-4 ,map[7][7].y-4,
map[7][7].x+4 ,map[7][7].y+4) ;
Ellipse(hDC ,map[11][3].x-4 ,map[11][3].y-4,
map[11][3].x+4 ,map[11][3].y+4) ;
Ellipse(hDC ,map[11][11].x-4 ,map[11][11].y-4,
map[11][11].x+4 ,map[11][11].y+4) ;
//画小边界框与鼠标的变化
for(i = 0 ;i < 15 ;i++){
for(j = 0 ;j<15 ;j++){
if(abs(pos_x-map[i][j].x)0;j--){
//往左
if(map[i_flag][j].sf_flag){
if(map[i_flag][j].color==map[i_flag][j_flag].color)
step1++ ;
else
break ;
}
}
//判断一列是否有五子
for(i=i_flag ;i<15 ;i++){
//往上判断
if(map[i][j_flag].sf_flag){
if(map[i][j_flag].color==map[i_flag][j_flag].color){
step2++ ;
}else
break ;
}
}
for(i=i_flag;i>0;i--){
//往下
if(map[i][j_flag].sf_flag){
if(map[i][j_flag].color==map[i_flag][j_flag].color)
step2++ ;
else
break ;
}
}
//判断\的方向
for(i=i_flag,j=j_flag ;i<15 ,j<15;i++,j++){
//往上判断
if(map[i][j].sf_flag){
if(map[i][j].color==map[i_flag][j_flag].color){
step3++ ;
}else
break ;
}
}
for(i=i_flag,j=j_flag;i>0,j>0;i--,j--){
//往下
if(map[i][j].sf_flag){
if(map[i][j].color==map[i_flag][j_flag].color)
step3++ ;
else
break ;
}
}
//判断/的方向
for(i=i_flag,j=j_flag ;i>0 ,j<15;i--,j++){
//往上判断
if(map[i][j].sf_flag){
if(map[i][j].color==map[i_flag][j_flag].color){
step4++ ;
}else
break ;
}
}
for(i=i_flag,j=j_flag;i<15,j>0;i++,j--){
//往下
if(map[i][j].sf_flag){
if(map[i][j].color==map[i_flag][j_flag].color)
step4++ ;
else
break ;
}
}
if(step1>5||step2>5||step3>5||step4>5){
SetTextColor(hDC,RGB(255,0,0));
SelectObject(hDC,hF) ;
GetTextExtentPoint32(hDC ,str[0],strlen(str[0]),&size) ;
if(map[i_flag][j_flag].color==1)
TextOut(hDC,(rect.right/2-size.cx/2),rect.bottom/18,str[0],strlen(str[0])) ;
if(map[i_flag][j_flag].color==0)
TextOut(hDC,(rect.right/2-size.cx/2),rect.bottom/18,str[1],strlen(str[1])) ;
over_flag = 1 ;
}
step1 = 0 ;
step2 = 0 ;
step3 = 0 ;
step4 = 0 ;
Lbd_flag = 0 ;
}
DeleteObject(hBR1) ;
DeleteObject(hBR2) ;
DeleteObject(hPen1) ;
DeleteObject(hPen2) ;
EndPaint(hWnd,&ps) ;
break ;
default:
return DefWindowProc(hWnd , message , wParam ,lParam) ;
break ;
}
return 0 ;
}