📄 fivechess.c
字号:
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 + -