⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fivechess.c

📁 MiniWinOuterSM MiniWinOuterSM
💻 C
📖 第 1 页 / 共 2 页
字号:
	m1=1,m2=1,n1=1,n2=1,a=1,b=1;
	total=1;
	for(;;)
	{
		if (a==1)
			if(jt-n1>=1 && *(*(ChessBox+it)+jt-(n1++))==style) total++;
			else if(*(*(ChessBox+it)+jt-(n1++))==Opposite(style)) {total-=0.5;a=0;} 
			else a=0;
			if (b==1 && jt+n2<=17 && *(*(ChessBox+it)+jt+(n2++))==style) total++;
			else if(*(*(ChessBox+it)+jt+(n2++))==Opposite(style)) {b=0;total-=0.5;}
			else b=0;
			if (a==0 && b==0) break;
	}
	if (total>=lasttotal) lasttotal=total;
	m1=1,m2=1,n1=1,n2=1,a=1,b=1;
	total=1;
	for(;;)
	{
		if (a==1)
			if (it-m1>=1 && jt-n1>=1 && *(*(ChessBox+it-(m1++))+jt-(n1++))==style) total++;
			else if (*(*(ChessBox+it-(m1++))+jt-(n1++))==Opposite(style)) {total-=0.5;a=0;}
			else a=0;
			if (b==1)
				if (it+m2<=19  && jt+n2<=17 && *(*(ChessBox+it+(m2++))+jt+(n2++))==style) total++;
				else if(*(*(ChessBox+it+(m2++))+jt+(n2++))==Opposite(style)) {total-=0.5;b=0;}
				else b=0;
				if (a==0 && b==0) break;
	}
	if (total>=lasttotal) lasttotal=total;
	m1=1,m2=1,n1=1,n2=1,a=1,b=1;
	total=1;
	for(;;)
	{
		if (a==1)
			if(it+m1<=19 && jt-n1>=1 && *(*(ChessBox+it+(m1++))+jt-(n1++))==style) total++;
			else if (*(*(ChessBox+it+(m1++))+jt-(n1++))==Opposite(style)) {total-=0.5;a=0;}
			else a=0;
			if (b==1)
				if(it-m2>=1 && jt+n2<=17 && *(*(ChessBox+it-(m2++))+jt+(n2++))==style) 
					total++;
				else  if(*(*(ChessBox+it-(m2++))+jt+(n2++))==Opposite(style)) 
				{
					total-=0.5;
					b=0;
				}else 
					b=0;
				if (a==0 && b==0) 
					break;
	}
	if (total>=lasttotal) 
		lasttotal=total;
	return lasttotal;
}
/******************************************************************************
返回man方最大连线子个数
******************************************************************************/
POINT GetMaxMan(int man)               
{
	int it,jt;
	float temp,total=1;
	POINT xy;
	for(it=1;it<=19;it++)
		for(jt=1;jt<=17;jt++)
			if (*(*(ChessBox+it)+jt)==NoMan){
				temp=GetManNum(man,it,jt);
				if (total<=temp){
					total=temp;
					xy.x=it;xy.y=jt;
				}
			}
	return xy;
}
/******************************************************************************

******************************************************************************/
static void OnKeyDown(HWND hWnd,UINT nChar) 
{
	switch(nChar)
	{
		case VK_LEFT:							/*向左移动*/
			LastX=(LastX-1+BOX_WIDTH)%BOX_WIDTH;	
			DrawChessRect(hWnd,PLAYER,LastX,LastY);
			break;
		case VK_RIGHT:						/*向右移动*/
			LastX=(LastX+1)%BOX_WIDTH;	
			DrawChessRect(hWnd,PLAYER,LastX,LastY);
			break;
		case VK_UP:										
			LastY=(LastY-1+BOX_HEIGHT)%BOX_HEIGHT;	
			DrawChessRect(hWnd,PLAYER,LastX,LastY);
			break;
		case VK_DOWN:
			LastY=(LastY+1)%BOX_HEIGHT;	
			DrawChessRect(hWnd,PLAYER,LastX,LastY);
			break;
		case VK_RETURN:
			SendMessage(hWnd,WM_LBUTTONDOWN,0,MAKELONG(CELL_WIDTH*LastX,CELL_WIDTH*LastY));
			break;
		default:DefWindowProc(hWnd,WM_KEYDOWN,nChar,0);break;
	}
}
/******************************************************************************
窗口函数
******************************************************************************/
static LRESULT WINAPI  FiveChessWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	//static PMWIMAGEHDR pimage=NULL;
	HDC hDC;
   	//PAINTSTRUCT PS;
	int i,j;
	switch(message)
	{
		case WM_KEYDOWN:OnKeyDown(hWnd,LOWORD (wParam)); 				break;
		//=======================================================      
	 	case WM_LBUTTONDOWN:        /*鼠标左键单击*/
			i=LOWORD(lParam);		
			j=HIWORD(lParam); 
			if (Action==PLAYER && LeftMan>=1 && LOWORD(lParam)>=10 && LOWORD(lParam)<=390
				&& HIWORD(lParam)>=10 && HIWORD(lParam)<=350
				&& OpenGame==TRUE && *(*(ChessBox+(i+10)/CELL_WIDTH)+(j+10)/CELL_WIDTH)==NoMan)
			{
				ActionNumber++;
				LastX=(i)/CELL_WIDTH;				LastY=(j)/CELL_WIDTH;
				*(*(ChessBox+LastX)+LastY)=PLAYER;
				LeftMan--;
				//InvalidateRect(hWnd,NULL,FALSE);
				//保存数据以便悔棋
				ReturnBox[ActionNumber].player.x=LastX;
				ReturnBox[ActionNumber].player.y=LastY;				
				if (CheckFive(LastX,LastY)==TRUE){			/*判断五子是否连线 */
					Action=NoMan;
					WIN=TRUE;
				}else 
					Action=COMPUTER;
			}
			if (LeftMan==0 && WIN==FALSE)					/*没有空白格子可下了*/
			{
				if(MessageBox(hWnd,"哈哈!真是棋逢对手,\r\n要继续吗?","五子棋胜负",MB_YESNO)==IDYES)
					SendMessage(hWnd,WM_COMMAND,IDM_RESTART,lParam);
				else 
					SendMessage(hWnd,WM_COMMAND,IDM_START,lParam);
			}			
			//电脑下子
			if (Action==COMPUTER && OpenGame==TRUE && LeftMan>=1)
			{
				//得到电脑下子位置,返回结构体 xy
				POINT xy,Whitexy,Blackxy;
				Blackxy=GetMaxMan(COMPUTER);
				Whitexy=GetMaxMan(PLAYER);
				switch(Level)
				{
				case 1:
					if (GetManNum(PLAYER,Whitexy.x,Whitexy.y)>GetManNum(COMPUTER,Blackxy.x,Blackxy.y)-2)
						xy=Whitexy;
					else 
						xy=Blackxy;
					break;		
				case 2:
					if (GetManNum(PLAYER,Whitexy.x,Whitexy.y)>GetManNum(COMPUTER,Blackxy.x,Blackxy.y)-1)
						xy=Whitexy;
					else xy=Blackxy;
					break;
				case 3:
					if (GetManNum(PLAYER,Whitexy.x,Whitexy.y)>GetManNum(COMPUTER,Blackxy.x,Blackxy.y))
						xy=Whitexy;
					else xy=Blackxy;
					break;
				}
				//电脑下子  
				*(*(ChessBox+xy.x)+xy.y)=COMPUTER;
				LeftMan--;
				{
					RECT rc;
					GetChessRect(LastX,LastY,&rc);
					InvalidateRect(hWnd,&rc,FALSE);
					GetChessRect(xy.x,xy.y,&rc);
					InvalidateRect(hWnd,&rc,FALSE);
				}
/*				LastX=xy.x;    LastY=xy.y;
#if 0
				hDC=GetDC(hWnd); 
				DrawChess(hDC,COMPUTER,LastX,LastY);
				DeleteDC(hDC);//ReleaseDC(hWnd,hDC);
				DrawChessRect(hWnd,COMPUTER,LastX,LastY);			
#else
				InvalidateRect(hWnd,NULL,FALSE);
#endif*/
				//保存数据以便悔棋
				ReturnBox[ActionNumber].com.x=LastX;
				ReturnBox[ActionNumber].com.y=LastY;
				if (CheckFive(xy.x,xy.y)==TRUE){
					int ret;
					Action=NoMan;
					WIN=FALSE;
					ret=MessageBox(hWnd,"你好臭啊 ","五子棋胜负",MB_OKCANCEL|MB_ICONEXCLAMATION);
					SendMessage(hWnd,WM_COMMAND,IDM_RESTART,0);		/*重新开始*/
				}else 
					Action=PLAYER;
			}
			break;
		//=======================================================
/*	 	case WM_CREATE:
			//hWnd->hMenu=createmenu ();
	    	/*hDC=GetDC(hWnd);
			hdcmem=CreateCompatibleDC(hDC);
			ReleaseDC(hWnd,hDC);
			InitGame();
	   		break;	*/
     	//=======================================================
     	case WM_PAINT: 
			{
				PAINTSTRUCT ps;
				RECT rc;
	       		HDC hDC=BeginPaint(hWnd,&ps);
				HDC hmemdc=CreateCompatibleDC(hDC);
				HBITMAP hobmp,hbg=CreateCompatibleBitmap(hDC,CELL_WIDTH,CELL_WIDTH);
				HBRUSH hb,ob;
				hobmp=(HBITMAP)SelectObject(hmemdc,(HGDIOBJ)hbg);
				SetRect(&rc,0,0,CELL_WIDTH,CELL_WIDTH);
				FillRect(hmemdc,&rc,(HBRUSH)(COLOR_BTNFACE+1));
				MoveTo(hmemdc,0,CELL_WIDTH/2);
				LineTo(hmemdc,CELL_WIDTH,CELL_WIDTH/2);
				MoveTo(hmemdc,CELL_WIDTH/2,0);
				LineTo(hmemdc,CELL_WIDTH/2,CELL_WIDTH);
				hb=CreatePatternBrush(hbg);
				GetClientRect(hWnd,&rc);
				FillRect(hDC,&rc,hb);
				DeleteObject((HGDIOBJ)hb);
				DeleteDC(hmemdc);
				//FillRect(hDC,&rc,COLOR_BTNFACE);
				//SetBrushOrgEx(hDC,CELL_WIDTH/2,CELL_WIDTH/2,NULL);
				for(i=0;i<BOX_WIDTH;i++){
					for(j=0;j<BOX_HEIGHT;j++){
						//DrawChessRect(hWnd,0,i,j);
						switch(*(*(ChessBox+i)+j)){
						case PLAYER:	DrawChess(hDC,PLAYER,i,j);   break;
						case COMPUTER:	DrawChess(hDC,COMPUTER,i,j); break;	
						default:DrawChess(hDC,0,i,j);				break;
						}
					}
				}
				EndPaint(hWnd,&ps);
			}
			break;
			//=======================================================
			//悔棋
			//=======================================================      
		case WM_RBUTTONDOWN:
			if (ActionNumber!=0)
				SendMessage(hWnd,WM_COMMAND,IDM_RETURNBOX,0);	
			break; 	
			//=======================================================      
		case WM_COMMAND:
			switch(LOWORD(wParam))
			{
				int x1,y1,x2,y2;
			case IDM_RETURNBOX:												/*悔棋*/
				x1=ReturnBox[ActionNumber].player.x;
				x2=ReturnBox[ActionNumber].com.x;
				y1=ReturnBox[ActionNumber].player.y;
				y2=ReturnBox[ActionNumber].com.y;
				ChessBox[ReturnBox[ActionNumber].player.x][ReturnBox[ActionNumber].player.y]=NoMan;
				ChessBox[ReturnBox[ActionNumber].com.x][ReturnBox[ActionNumber].com.y]=NoMan;
				ActionNumber--;
				break;
			case IDM_START:
				if(OpenGame==TRUE){	//END the game
					OpenGame=FALSE;		InitGame();
					InvalidateRect(hWnd,NULL,TRUE);
				}else{				//Start new game
					InitGame();			OpenGame=TRUE;
					InvalidateRect(hWnd,NULL,TRUE);
				}break;
			case IDM_RESTART:		/*重新开始*/
				InitGame();			OpenGame=TRUE;
				InvalidateRect(hWnd,NULL,TRUE);
				break;
			case IDM_EASY:		Level=1;	break;//水平设置
			case IDM_NORMAL:    Level=2;	break;
			case IDM_HARD:		Level=3;	break;
			case IDM_EXIT:SendMessage(hWnd,WM_DESTROY,0,0);
				return 0;
				//也可以发送退出消息。SendMessage(hWnd,WM_DESTROY,0,0);
			}
			break;
			default:
				return DefWindowProc(hWnd,message,wParam,lParam);
	}
	return 0;
}
/*************************************************************************/
HWND CreateFiveChess()
{
	HWND hwnd=CreateMainWindow("FIVE",WS_VISIBLE|WS_BORDER|WS_CAPTION|WS_SYSMENU,
		100,100,405,405,FiveChessWndProc);
	return hwnd;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -