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

📄 main.c

📁 GNU国际象棋C++源代码Windows版的
💻 C
📖 第 1 页 / 共 3 页
字号:

    case WM_KEYDOWN:
      switch (wParam)
       {
        case VK_CANCEL:
          flag.timeout=true;
          break;
        case 13:
          if (flag.replay) command=1;
          break;
        case VK_F2:
          if (player==opponent || flag.editing || flag.force)
           {
            lpfnDlgProc = MakeProcInstance ( TypeMoveDlgProc, hInst);
            if (DialogBox ( hInst, MAKEINTRESOURCE(NUMDLG), hWnd,
                lpfnDlgProc))
              {
               command=1;
               if (flag.bothsides && !flag.editing)
                {
                 flag.bothsides=false;
                 flag.abort=flag.timeout=true;
                }
              }
            FreeProcInstance ( lpfnDlgProc);
           }
          else ShowMessage(CP[62]);
          break;
        default: if (flag.editing && wParam>='0' && wParam<='9')
          {
            wParam-='0';
            if (!wParam)wParam=10;
            PostMessage(hBtnWnd,WM_LBUTTONDOWN,0,--wParam*(bmsize+5)+pawn);
          }
         else return 1;
       }
      return 0;

#ifdef WIN32
    case WM_CTLCOLORSTATIC:
      SetTextColor((HDC)wParam,clrText);
      SetBkMode((HDC)wParam,TRANSPARENT);
      return hBrushBackGround;
#else
    case WM_CTLCOLOR:
      switch(HIWORD(lParam))
        {
         case CTLCOLOR_STATIC:
           SetTextColor((HDC)wParam,clrText);
           SetBkMode((HDC)wParam,TRANSPARENT);
           return hBrushBackGround;
        }
    return 0;
#endif

    case WM_LBUTTONDOWN:
     if (player==opponent || flag.force)
     {
      UINT xsq,ysq,width,margin;
      SHORT x,y;
      HRGN hRgn;

      if (flag.replay) {command=1;return 0;}
      x=LOWORD(lParam);
      y=HIWORD(lParam);
      if (y<BACKMARGIN || y>BACKMARGIN+sqdepth*8)return 0;/*is y o the board?*/
      width=sqwidthB*8+deltaX*(y-BACKMARGIN)/(sqdepth*8);
      margin=((sqwidthF*8-width)>>1)+LEFTMARGIN;
      if (x<margin || x>=width+margin) return 0;  /*is x on the board?*/
      xsq=8*(x-margin)/width;
      ysq=7-(y-BACKMARGIN)/sqdepth;
      if (!selected && !button)
       {
        selected=1;
        selectX=xsq;
        selectY=ysq;
        hRgn=CreatePolygonRgn(&squares[xsq][ysq][0],4, ALTERNATE);
        hDC=GetDC(hWnd);
        InvertRgn(hDC,hRgn);
        ReleaseDC(hWnd,hDC);
        DeleteObject(hRgn);
       }
      else
       {
        if (!button) /*no squares are highlighted if a button is down*/
         {
          hRgn=CreatePolygonRgn(&squares[selectX][selectY][0],
                 4, ALTERNATE);
          hDC=GetDC(hWnd);
          InvertRgn(hDC,hRgn);  /*restore square to normal*/
          ReleaseDC(hWnd,hDC);
          DeleteObject(hRgn);
         }
        selected=0;
        if (xsq==selectX && ysq==selectY && !flag.editing)return 0;
        if (flag.reverse)
         {
           selectX = 7-selectX;
           xsq = 7-xsq;
           selectY = 7-selectY;
           ysq = 7-ysq;
         }
        move[0]=(char)selectX+'a';
        move[2]=(char)xsq+'a';
        move[1]='1'+(char)selectY;
        move[3]='1'+(char)ysq;
        move[4]=0;
        if (!flag.editing
            && ((ysq==0 && selectY==1)||(ysq==7 && selectY==6))
            && abs(selectX-xsq)<=1
            && (player==white ? ysq>selectY : ysq<selectY) )
         {
           SHORT *brdptr,*colptr;
           if (flag.searching) {brdptr=&origbrd; colptr=&origcol;}
           else {brdptr=&board; colptr=&color;}
           if (*(brdptr+selectX+selectY*8)==pawn
            && *(colptr+selectX+selectY*8)==player
            && ( abs(selectX-xsq)==0 ? *(brdptr+xsq+ysq*8)==no_piece
                                     : *(colptr+xsq+ysq*8)==!player ) )
            {
             lpfnDlgProc = MakeProcInstance(PromoteDlgProc, hInst);
             move[4] = CP[1][DialogBox(hInst, MAKEINTRESOURCE(PROMOTE),
                hWnd, lpfnDlgProc)];  /*promotion*/
             FreeProcInstance(lpfnDlgProc);
             move[5]=0;
            }
         }
        if (button) move[0]=0; /*editing - allow delete with right button
                                 while a piece button is down*/
        if (!flag.editing)
         {
           if ((!flag.easy || flag.bothsides) && player==opponent)
              flag.timeout = true;
           if (flag.bothsides) {flag.abort=true; flag.bothsides = false; }
         }
        command=1;
       }
     }
     return 0;

    case WM_RBUTTONDOWN:
      if (flag.replay) {command=1; return 0;}
      if (flag.editing)
      {
       SHORT x,y;
       UINT width,margin;
       x=LOWORD(lParam);
       y=HIWORD(lParam);
       if (y<BACKMARGIN || y>BACKMARGIN+sqdepth*8)return 0;
       width=sqwidthB*8+deltaX*(y-BACKMARGIN)/(sqdepth*8);
       margin=((sqwidthF*8-width)>>1)+LEFTMARGIN;
       if (x<margin || x>=width+margin) return 0;
       if (flag.reverse)
        {
         move[0]='h'-8*(x-margin)/width;
         move[1]='1'+(y-BACKMARGIN)/sqdepth;
        }
       else
        {
         move[0]='a'+8*(x-margin)/width;
         move[1]='8'-(y-BACKMARGIN)/sqdepth;
        }
       move[2]=move[0];
       move[3]=move[1];
       move[4]=0;
       command=1;
      }
      return 0;

    case WM_ERASEBKGND:
      {
         RECT rect;
         UnrealizeObject ( hBrushBackGround);
         GetClientRect ( hWnd, &rect);
         FillRect ( (HDC)wParam, &rect, hBrushBackGround);
         return 1;
      }

    case WM_COMMAND:
      switch (LOWORD(wParam))
       {
        case IDM_QUIT:
          flag.quit=true;
          GetWindowRect(hWnd,&wr);
          maximized=IsZoomed(hWnd);
          if (IsIconic(hWnd)) wr.right = 0;
          WinHelp(hWnd,szHelpFile,HELP_QUIT,0L);
        case IDM_GET:
        case IDM_NEW:
        case IDM_LIST:
        case IDM_EDIT:
        case IDM_REVIEW:
        case IDM_REMOVE:
        case IDM_UNDO:
        case IDM_FORCE:
        case IDM_SWITCH:
        case IDM_SWITCHDM:
        case IDM_WHITE:
        case IDM_BLACK:
        case IDM_COMPILE:
          flag.timeout=flag.abort=true;
          flag.bothsides=false;
          command=LOWORD(wParam);
          break;
        case IDM_SAVE:
          flag.timeout=true;
          flag.bothsides=false;
          command=LOWORD(wParam);
          break;

        case IDM_BOTH:
          if (!flag.searching)
           {
            command=LOWORD(wParam);
            break;
           }
          if (flag.bothsides)
           {
            flag.bothsides=false;
            if (player==opponent)   /*computer is making opponents move*/
               flag.abort=flag.timeout=true; /*so abort it*/
           }
          else
           if (player==opponent) /*computer is thinking on opponent's time*/
            {
              flag.timeout=true;
              command=LOWORD(wParam);
            }
           else flag.bothsides=true;
          break;
        case IDM_WTM:
        case IDM_BTM:
          if (player==(LOWORD(wParam)==IDM_WTM)? white : black) break;
          flag.timeout=flag.abort=true;
          flag.bothsides=false;
          command=LOWORD(wParam);
          break;

        case IDM_BEEP:
          flag.beep=!flag.beep;
          break;
        case IDM_COORD:
          flag.coords=!flag.coords;
          InvalidateRect(hWnd,0,true);
          break;
        case IDM_POST:
          if ( flag.post )
           {
            SendMessage ( hStats, WM_COMMAND, IDOK, 0 );
            flag.post = false;
           }
          else
           {
            lpfnDlgProc = MakeProcInstance(StatDlgProc, hInst);
            hStats = CreateDialog (hInst, MAKEINTRESOURCE(STATS),
                hWnd, lpfnDlgProc);
            flag.post = true;
           }
          break;
        case IDM_ANIMATE:
          flag.animate=!flag.animate;
          if (!flag.animate)
           {
            UpdateDisplay(0,0,1,0,0);
            Znodes<<=4;
           }
          else Znodes>>=4;
          break;
        case IDM_HASH:
          flag.hash=!flag.hash;
          break;
        case IDM_BOOK:
          flag.usebook=!flag.usebook;
          Book = flag.usebook ? BOOKFAIL : 0;
          break;
        case IDM_HDEPTH:
          lpfnDlgProc = MakeProcInstance ( HashDepthDlgProc, hInst);
          if (DialogBox ( hInst, MAKEINTRESOURCE(HASHDEPTHDLG), hWnd,
                lpfnDlgProc))
           {
            HashDepth=DlgInt1;
            HashMoveLimit=DlgInt2;
           }
          FreeProcInstance ( lpfnDlgProc);
          break;
        case IDM_HFILE:
          lpfnDlgProc = MakeProcInstance ( CreateHashDlgProc, hInst);
          if (DialogBox ( hInst, MAKEINTRESOURCE(CREATEHASH), hWnd,
                lpfnDlgProc))
           {
            if (size < 24)
                size = (1 << size);
            if (size>0) CreateHashFile(size);
           }
          FreeProcInstance ( lpfnDlgProc);
          break;
        case IDM_WIN:
          lpfnDlgProc = MakeProcInstance ( ChangeWinDlgProc, hInst);
          if (DialogBox ( hInst, MAKEINTRESOURCE(CHANGEWINDOW), hWnd,
                lpfnDlgProc))
          {
            WAwindow=DlgInt1;
            WBwindow=DlgInt2;
            WXwindow=DlgInt3;
            BAwindow=DlgInt4;
            BBwindow=DlgInt5;
            BXwindow=DlgInt6;
            xwndw = (computer == white) ? WXwindow : BXwindow;
          }
          FreeProcInstance ( lpfnDlgProc);
          break;
        case IDM_CONTEMP:
          lpszTitle=CP[64];
          DlgInt1=contempt;
          lpfnDlgProc = MakeProcInstance ( GetNumDlgProc, hInst);
          if (DialogBoxParam ( hInst, MAKEINTRESOURCE(NUMDLG), hWnd,
                lpfnDlgProc,46L)) contempt=DlgInt1;
          FreeProcInstance ( lpfnDlgProc);
          break;
        case IDM_MATERIAL:
          flag.material=!flag.material;
          break;
        case IDM_RCPTR:
          flag.rcptr=!flag.rcptr;
          break;
        case IDM_THREAT:
          flag.threat=!flag.threat;
          break;
        case IDM_PVS:
          flag.pvs=!flag.pvs;
          break;
        case IDM_NEWEVAL:
          flag.neweval=!flag.neweval;
          break;
        case IDM_GAMEIN:
          flag.gamein=!flag.gamein;
          break;

⌨️ 快捷键说明

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