码迷,mamicode.com
首页 > Windows程序 > 详细

WIN32 下的编程(五子棋)

时间:2015-04-04 15:16:29      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

写比较麻烦,不过没牵涉到什么算法,只是一些逻辑问题
#include<tchar.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>

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)<rect.right/36 && abs(pos_y-map[i][j].y)<rect.bottom/36 ){
					x = map[i][j].x ;
					y = map[i][j].y ;
					hcursor = LoadCursor(NULL,IDC_SIZEALL);
					SetCursor(hcursor) ;
					break ;
				}
			}
		} 
		SelectObject(hDC,hPen2) ;
		MoveToEx(hDC,x-rect.right/36 ,y-rect.bottom/62 ,NULL) ;
		LineTo(hDC ,x-rect.right/36 ,y-rect.bottom/36) ;
		LineTo(hDC ,x-rect.right/62 ,y-rect.bottom/36) ;
		
		MoveToEx(hDC,x+rect.right/36 ,y-rect.bottom/62 ,NULL) ;
		LineTo(hDC ,x+rect.right/36 ,y-rect.bottom/36) ;
		LineTo(hDC ,x+rect.right/62 ,y-rect.bottom/36) ;
		
		MoveToEx(hDC,x-rect.right/36 ,y+rect.bottom/62 ,NULL) ;
		LineTo(hDC ,x-rect.right/36 ,y+rect.bottom/36) ;
		LineTo(hDC ,x-rect.right/62 ,y+rect.bottom/36) ;
		
		MoveToEx(hDC,x+rect.right/36 ,y+rect.bottom/62 ,NULL) ;
		LineTo(hDC ,x+rect.right/36 ,y+rect.bottom/36) ;
		LineTo(hDC ,x+rect.right/62 ,y+rect.bottom/36) ;
		
		//点击下棋
		if(Lbd_flag&&over_flag==0){
			for(i = 0 ;i<15 ;i++){		
				for(j = 0 ; j<15 ;j++){
					if(!map[i][j].sf_flag &&abs(pos_x-map[i][j].x)<rect.right/36 && abs(pos_y-map[i][j].y)<rect.bottom/36 ){
						map[i][j].sf_flag = 1 ;//标示该点已经被下了
						i_flag = i ;
						j_flag = j ;
						if(c_flag){//1代表黑色 0为白色
							map[i][j].color = c_flag;
							c_flag = 0 ;
						}else{
							map[i][j].color = c_flag ;
							c_flag = 1 ;
						}
					}		
				}
				
			}
			
		}
		//初始化
		if(over_flag){
			init();
			over_flag = 0 ;
		}
		SelectObject(hDC,hPen1) ;
		//画出棋子
		for(i = 0 ;i<15 ;i++){		
			for(j = 0 ; j<15 ;j++){
				if(map[i][j].sf_flag){
					if(map[i][j].color==1){
						SelectObject(hDC,hBR2) ;
						Ellipse(hDC,map[i][j].x-12,map[i][j].y-12,
							map[i][j].x+12,map[i][j].y+12) ;
					}else{
						SelectObject(hDC,hBR1) ;
						Ellipse(hDC,map[i][j].x-12 ,map[i][j].y-12,
							map[i][j].x+12,map[i][j].y+12) ;
					}
				}
			}
		}
		
		if(Lbd_flag){
			//判断一行是否有五子
			for(j=j_flag ;j<15 ;j++){
				//往右判断
				if(map[i_flag][j].sf_flag){
					if(map[i_flag][j].color==map[i_flag][j_flag].color){
						step1++ ;	
					}else
						break ;
				}
			}
			for(j=j_flag;j>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 ;
}


 

WIN32 下的编程(五子棋)

标签:

原文地址:http://blog.csdn.net/makecontral/article/details/44872947

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!