亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mainform1.~cpp

?? 《C++Builder程序設計范例--中國象棋》配書盤自述文件
?? ~CPP
?? 第 1 頁 / 共 3 頁
字號:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop


#include "MainForm1.h"
#include "EditForm2.h"
#include "InfoForm3.h"
#include "ChessErr.h"
#include "InputPlyDepth.h"
#include "InputSecPerMove.h"
#include "InputMinPerGame.h"
#include "EndGameDlog.h"
#include "AboutDlog.h"
#include "ColorDlog.h"
#include "PieceValueDlog.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#include "CDefines.h"
#include "Global.h"


#undef MAXPATH
#define MAXPATH  160

/*
 *  全局變量
 */

BYTE ColorSquareColors[3] = { 0, 128, 0 };   /* 綠色 */

bool ShowBestPath = true;
HBRUSH hColorBrush;
HBITMAP PieceBmpArray[7][2];
HBITMAP MaskArray[7];
COLORTYPE ComputerColor;
short LINESIZE;
short CHARSIZE;
bool Editing;
int BORDERSIZE;
bool SoundOn;

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

/*
在 #pragma資源聲明里,加入包含定制光標的資源文件MyRc.res。
*/

#pragma resource "Chess.res"
#pragma resource "MyRc.res"

TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
        : TForm(Owner)
{

}
//---------------------------------------------------------------------------
/*
主Form必須負責創建子Form,前面兩行分別創建了兩個子Form,接下來的兩行
將這些子Form放到一個數組中。然后,通過一個循環依次顯示這些子Form。
使用這項技術時,不要讓系統自動創建這些子Form。為此,需要打開
“Project Options”對話框,翻到“Form”頁,然后將這些子Form
從列表框移到“Available Forms”列表框中。
*/
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
  InfoForm = new TInfoForm(this);
  EditForm = new TEditForm(this);
  ChildForms[1] = EditForm;
  ChildForms[2] = InfoForm;
  for (int i=1;i<3;i++)
    ChildForms[i]->Show();

   SoundOn = true;
   FileName = new char[MAXPATH];
   WhoseTurn = player;
   CurPlayer = red;
   ComputerColor = black;
   Editing = EditingChessBoard = GotStartSquare = false;
   blNewChessGame = true;
}
CheckLevelMenu(LEVELTYPE);
//---------------------------------------------------------------------------
/*
這是主窗體顯示時事件處理函數
從資源文件載入光標及位圖
由于光標及位圖保存在資源文件(.res)內有兩個好處。第一,它可以包含不同類型
的多種資源。第二,C++ Builder可以方便地把一個資源文件連接入最后的可執行
文件。
 "::"在變量前表明該變量是全局(外部)變量,
 在函數前表明該函數是全局(外部)函數。
*/
void __fastcall TMainForm::FormShow(TObject *Sender)
{
   HDC hDC;
   hDC = GetDC(MainForm->Handle);
   TEXTMETRIC tm;
   GetTextMetrics(hDC, &tm);
   CHARSIZE = short(tm.tmAveCharWidth);
   LINESIZE = short(tm.tmHeight + tm.tmExternalLeading);
   ReleaseDC(MainForm->Handle, hDC);
   BORDERSIZE = LINESIZE + MYFRAMESIZE;

 if ((GetSystemMetrics(SM_CXSCREEN)<800) || (GetSystemMetrics(SM_CYSCREEN)<600))
   MessageBox(NULL,"屏幕分辯率低于800X600!","警告",
      		 MB_ICONINFORMATION | MB_OK);

   Screen->Cursors[crWaitCursor]=LoadCursor(HInstance, "IDC_WCUR");
   //把自定義光標裝入Screen對象
    ::PieceBmpArray[pawn-1][red]=LoadBitmap(HInstance, "RPawnBmp");
    ::PieceBmpArray[pawn-1][black] = LoadBitmap(HInstance, "BPawnBmp");
    ::PieceBmpArray[rook-1][red] = LoadBitmap(HInstance, "RRookBmp");
    ::PieceBmpArray[rook-1][black] = LoadBitmap(HInstance, "BRookBmp");
    ::PieceBmpArray[knight-1][black] = LoadBitmap(HInstance, "BKnightBmp");
    ::PieceBmpArray[bishop-1][black] = LoadBitmap(HInstance, "BBishopBmp");
    ::PieceBmpArray[assist-1][black] =  LoadBitmap(HInstance, "BAssistBmp");
    ::PieceBmpArray[gunner-1][black] =  LoadBitmap(HInstance, "BGunnerBmp");

    ::PieceBmpArray[knight-1][red] = LoadBitmap(HInstance, "RKnightBmp");
    ::PieceBmpArray[bishop-1][red] = LoadBitmap(HInstance, "RBishopBmp");
    ::PieceBmpArray[assist-1][red] = LoadBitmap(HInstance, "RAssistBmp");
    ::PieceBmpArray[gunner-1][red] = LoadBitmap(HInstance, "RGunnerBmp");
    ::PieceBmpArray[king-1][red] = LoadBitmap(HInstance, "RKingBmp");
    ::PieceBmpArray[king-1][black] = LoadBitmap(HInstance, "BKingBmp");
    ::MaskArray[pawn-1] = LoadBitmap(HInstance, "PMaskBmp");
    ::MaskArray[rook-1] = LoadBitmap(HInstance, "RMaskBmp");
    ::MaskArray[knight-1] =  LoadBitmap(HInstance, "KTMaskBmp");
    ::MaskArray[bishop-1] = LoadBitmap(HInstance, "BMaskBmp");
    ::MaskArray[assist-1] =  LoadBitmap(HInstance, "AMaskBmp");
    ::MaskArray[gunner-1] =   LoadBitmap(HInstance, "GMaskBmp");
    ::MaskArray[king-1] =  LoadBitmap(HInstance, "KMaskBmp");

    MainWndRect= MainForm->GetClientRect();
    MainForm->Menu=TChessMenu;    //設置主窗體主菜單
    Talk();
    MainForm->CheckLevelMenu(Level);
    hColorBrush = CreateSolidBrush(
      RGB(ColorSquareColors[0], ColorSquareColors[1], ColorSquareColors[2]));
    Dragging = true;
    Screen->Cursor = TCursor(crArrow); //分配箭頭光標給應用程序
    ChildForms[2]->BringToFront();
}

//---------------------------------------------------------------------------
/*
 設置主窗體背景
通過文件方式載入位圖。
對于位圖沒有保存在資源文件(.res)內,C++ Builder不能把從文件裝入的位圖
連接入最后的可執行文件。因此,必須確保在c:\BcbChess下有必需的位圖文件。
 很明顯,使用VCL函數比原始的API函數要方便得多。使用后,
 應將Canvas->Brush->Bitmap這個特性設為NULL,以釋放位圖。
 如果不刪除位圖,將導致程序內存不足。
*/
 void TMainForm::SetMainWindowBk()
   {
      Graphics::TBitmap *BLKBrushBmp = new Graphics::TBitmap();

      BLKBrushBmp->LoadFromFile("e:\\BKBrush.bmp");
      //BLKBrushBmp->LoadFromFile("c:\\BcbChess\\BKBrush.bmp");
      MainForm->Canvas->Brush->Bitmap=BLKBrushBmp;
      MainForm->Canvas->FillRect(MainForm->GetClientRect());
      MainForm->Canvas->Brush->Bitmap=NULL;
       delete BLKBrushBmp;
   }
//---------------------------------------------------------------------------
/*
主窗體重畫事件處理函數
ReleaseDC函數釋放設備描述句柄,不然,會導致系統資源不足
*/
void __fastcall TMainForm::FormPaint(TObject *Sender)
{
  SetMainWindowBk();
  HDC PaintDC = GetDC(MainForm->Handle);
  DrawFrame(PaintDC, MainWndRect);
  ReleaseDC(MainForm->Handle, PaintDC);
  PaintDC = GetDC(InfoForm->Handle);
  DrawFrame(PaintDC, InfoAreaRect);
  ReleaseDC(InfoForm->Handle, PaintDC);
  PrintChessBoard();
}
//---------------------------------------------------------------------------
/*
鼠標按下時事件處理函數
對弈狀態時,按下左鼠標,可以抓住棋子進行移動,第二次按下時,釋放棋子。
編輯狀態時,按下左鼠標,可以使編輯窗體中的棋子透明顯示,第二次在主窗體按下時,
可以添加棋子,再按擊時,擦除棋子。
*/
void __fastcall TMainForm::FormMouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
   POINT point;
   if (Button != mbLeft)
    return;
    MouseX=X;
    MouseY=Y;
   if (EditingChessBoard)
      {
      DoEdit();
      return;
      }

   if (WhoseTurn == computer && NoComputerMove == false)
      return;
  
  point=Point(MouseX,MouseY);
  MainForm->ScreenToClient( point);

   if (!GotStartSquare)
      {
      MoveStartSquare = GetValidSquare(point, CurPlayer, true);
      if (MoveStartSquare == -1)
         return;
      GotStartSquare = true;
      if (!Dragging)
         DrawInvertedBitmap(MoveStartSquare);
      else
         DragStart(MoveStartSquare, point);
      }
   else
      {
      MoveEndSquare = GetValidSquare(point, CurPlayer, false);
      GotStartSquare = false;
      if (MoveEndSquare == -1)
         {
         if (Dragging)
              DragEnd(false);
	 Warning("錯誤的移動!");
         DrawNormalBitmap(MoveStartSquare);
         return;
         }
      if (!MoveCheck(MoveStartSquare, MoveEndSquare))
         {
         if (Dragging)
            DragEnd(false);
         DrawNormalBitmap(MoveStartSquare);
         return;
         }
      GotValidMove = true;
      UndoMove->Enabled = true;
      if (GameOver)
         EndGame();
      else if (NoComputerMove == false)
         ComputersTurn();
      else if (MultiMove)
         {
         CurPlayer = (CurPlayer == red) ? black : red;
         }
      }
}
//---------------------------------------------------------------------------
/*
輪到計算機計算時的回調函數。
程序處于機器控制狀態。主菜單發生改變。光標發生改變。
*/
void TMainForm::ComputersTurn()
{
   WhoseTurn = computer;
   Screen->Cursor =TCursor(crWaitCursor); //分配等待光標給應用程序
   MainForm->Menu=TChessThinkMenu; //設置主窗體主菜單
   ProgramMove();
   MainForm->Menu=TChessMenu;  //動態設置主窗體主菜單
   WhoseTurn = player;
   Screen->Cursor = TCursor(crArrow); //分配箭頭光標給應用程序
   if (GameOver)
      EndGame();
}
//---------------------------------------------------------------------------
/*
主菜單項“新建”事件處理函數
主窗體進入初始對弈狀態。同時清除信息窗體中的提示信息。
*/

void __fastcall TMainForm::NewChessGame1Click(TObject *Sender)
{
   Timer1->Enabled=false;
   InfoForm->Timer->Caption="時間:";
   UndoMove->Enabled = false;
   RedoUndo->Enabled = false;

   blNewChessGame = true;
   NewChessGame();
   PrintChessBoard();
   CurPlayer = Player;
   ComputerColor = Opponent;
}
//---------------------------------------------------------------------------
/*
自定義IDM_FILENEW消息回調函數
按擊動態對話框“Yes”按鈕發送一個消息,相當于按擊主菜單項“新建”
*/
void TMainForm::FileNew(TMessage &Msg)
{
 MainForm->NewChessGame1Click(NewChessGame1);
}
//---------------------------------------------------------------------------
/*
主菜單項“恢復”事件處理函數
調用公用對話框打開控件函數,讀入二進制棋盤文件。
*/
void __fastcall TMainForm::RestoreGame1Click(TObject *Sender)
{
     if(OpenDialog1->Execute())
      {
      blNewChessGame = false;
      RestoreGame(MainForm->OpenDialog1->FileName.c_str());
      CurPlayer = Player;
      ComputerColor = Opponent;
      RedoUndo->Enabled = false;   //重下菜單變灰
      UndoMove->Enabled = false;   //悔棋菜單變灰
      }
}
//---------------------------------------------------------------------------
/*
自定義函數
調用公用對話框保存控件函數,寫入二進制棋盤文件。
*/
void  TMainForm::SaveGameAs()
{
    if(SaveDialog1->Execute())
 {
 blNewChessGame=false;
 SaveGame(MainForm->SaveDialog1->FileName.c_str());
 }
}

//---------------------------------------------------------------------------
/*
主菜單項“保存”事件處理函數
調用公用對話框保存控件函數,寫入二進制棋盤文件。
*/
void __fastcall TMainForm::SaveGame1Click(TObject *Sender)
{
  if (blNewChessGame == true)
     SaveGameAs();
   else
     SaveGame(MainForm->SaveDialog1->FileName.c_str());

}
//---------------------------------------------------------------------------
/*
主菜單項“另存為...”事件處理函數
調用公用對話框保存控件函數,寫入二進制棋盤文件。
*/
 void __fastcall TMainForm::SaveGameAsClick(TObject *Sender)
{
      SaveGameAs();
}
//---------------------------------------------------------------------------
/*
 自定義消息IDM_ERROR的回調函數
  動態構造、顯示和刪除ChessErrorDlg。
  雖然沒有寫TChessErrorDlg的析構函數,但當刪除它們的Owner時VCL自動刪除
  了控件。如果包含非可視化對象的指針,則需要增加ChessErrorDlg的析構函數。
*/
void TMainForm::EMError(TMessage &Msg)
{
  TChessErrorDlg *ChessErrorDlg= new TChessErrorDlg(Application,(AnsiString)buffer);
  ChessErrorDlg->ShowModal();
  delete  ChessErrorDlg;
}
/*
主菜單項“關于”事件處理函數
調用自定義靜態對話框函數,無模態顯示版權信息。
*/
void __fastcall TMainForm::AboutClick(TObject *Sender)
{
 AboutDlg->Show();
}
//---------------------------------------------------------------------------
/*
自定義編輯函數
讀取光標位置,把選擇的棋子在主窗體上的合法位置上顯示出來。
*/
void TMainForm::DoEdit()
{
   POINT point;
   SQUARETYPE Square;
   int SelectedItem;
   Modified = true;
   point=Point(MouseX,MouseY);
   MainForm->ScreenToClient(point);
   Square = GetValidSquare(point, black, false);

   if (ChessBoard[Square].piece != empty)
      {
      ChessBoard[Square].piece = empty;
      UpdateChessBoard();
      return;
      }
    SelectedItem = EditForm->GetSelectedItem();

    ChessBoard[Square].piece = (PIECETYPE)(SelectedItem % 7 + 1);
    ChessBoard[Square].color = (SelectedItem < 7) ? red : black;
    UpdateChessBoard();
}

//---------------------------------------------------------------------------
/*
菜單項“擺子”的回調函數。
  EditForm->BringToFront()將編輯子窗體EditForm推到前端。
  CheckMenuItem第一個參數為菜單句柄,從菜單TChessEditMenu句柄屬性Handle獲取。
      第二個參數告訴菜單項是用命令ID指明的。
      第三個參數它告訴菜單項是應該執行哪一些操作。在這種情況下,
      MF_CHECKED告訴CheckMenuItem菜單項被打勾。
      MF_UNCHECKED告訴CheckMenuItem菜單項勾被取消。
*/
void __fastcall TMainForm::MovePieceClick(TObject *Sender)
{
    SaveChessBoard = new BOARDTYPE[0x99];
   if (SaveChessBoard == NULL)
      {
      Error("沒有足夠的內存");
      return;
      }
    memcpy(SaveChessBoard, ChessBoard, sizeof(BOARDTYPE) * 0x99);
   Editing = EditingChessBoard = true;
   MainForm->Menu=TChessEditMenu; //動態設置主窗體主菜單
   Modified = false;
   if (CurPlayer == red)
      {
       CheckMenuItem(TChessEditMenu->Handle, BlackTurn->Command, MF_UNCHECKED);
       CheckMenuItem(TChessEditMenu->Handle, RedTurn->Command, MF_CHECKED);
      }
   else
      {
      CheckMenuItem(TChessEditMenu->Handle, BlackTurn->Command, MF_CHECKED);
      CheckMenuItem(TChessEditMenu->Handle, RedTurn->Command, MF_UNCHECKED);
      }
   EditForm->BringToFront();
}
//---------------------------------------------------------------------------
/*
主菜單項“清除”事件處理函數
把主窗體中棋盤上棋子全部擦除。
*/

void __fastcall TMainForm::ClearClick(TObject *Sender)
{
  SQUARETYPE sq;

   Modified = true;
    for (sq = 0; sq <= 0x98; sq++)
      ChessBoard[sq].piece = empty;
    UpdateChessBoard();

}
//---------------------------------------------------------------------------

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品一区二区在线| 亚洲国产人成综合网站| 亚洲欧洲日本在线| 偷窥少妇高潮呻吟av久久免费| 国产福利视频一区二区三区| 欧美精品在欧美一区二区少妇| 欧美国产精品一区二区三区| 蜜桃在线一区二区三区| 在线中文字幕不卡| 国产精品久久久久桃色tv| 日韩极品在线观看| 欧美在线观看视频一区二区三区| 国产午夜精品一区二区三区嫩草 | 午夜私人影院久久久久| 国产精品亚洲成人| 国产女人18毛片水真多成人如厕 | 日本一区二区三区免费乱视频| 亚洲小说欧美激情另类| voyeur盗摄精品| 久久久久国产一区二区三区四区 | 亚洲一区二区在线观看视频| 国产成人av资源| 精品国产乱码久久久久久闺蜜| 日一区二区三区| 欧美少妇一区二区| 一区二区免费视频| 在线视频一区二区三| 一二三区精品福利视频| 色综合av在线| 一区二区三区四区高清精品免费观看 | 99re6这里只有精品视频在线观看| 久久久国产精华| 国产麻豆视频精品| 欧美国产视频在线| 91小宝寻花一区二区三区| 亚洲品质自拍视频| 欧美韩国一区二区| 国产成人福利片| 欧美国产日韩一二三区| www.在线欧美| 亚洲乱码中文字幕综合| 在线观看日韩av先锋影音电影院| 一区二区三区免费网站| 欧美色图在线观看| 亚洲va在线va天堂| 日韩欧美的一区| 国产91精品久久久久久久网曝门| 亚洲国产精品ⅴa在线观看| 国产91精品精华液一区二区三区| 中文字幕一区二区三区在线播放| 91亚洲国产成人精品一区二三| 亚洲欧美日韩国产手机在线 | 久久精品在线观看| 国产不卡视频一区二区三区| ●精品国产综合乱码久久久久| 在线欧美日韩精品| 免费在线观看一区| 欧美激情一区三区| 久久综合一区二区| jizz一区二区| 婷婷国产在线综合| 国产日本欧洲亚洲| 91国产成人在线| 国产在线视频一区二区| 一区av在线播放| 精品国产三级电影在线观看| 99久久国产综合精品色伊| 午夜精品久久久久| 国产精品视频免费看| 欧美日韩大陆一区二区| 国产+成+人+亚洲欧洲自线| 一区二区三区精品在线| 久久综合久久综合亚洲| 91成人国产精品| 国产麻豆精品在线| 午夜成人在线视频| 中文字幕va一区二区三区| 67194成人在线观看| 国产成人免费视| 蜜臀av在线播放一区二区三区| 亚洲欧美另类久久久精品| 精品不卡在线视频| 这里只有精品免费| 色综合 综合色| 国产成人综合精品三级| 欧美96一区二区免费视频| 亚洲女子a中天字幕| 国产亚洲一二三区| 日韩精品中文字幕在线不卡尤物| 色哟哟日韩精品| 丁香啪啪综合成人亚洲小说| 蜜桃av一区二区| 午夜电影网亚洲视频| 亚洲免费视频成人| 国产精品午夜在线观看| 精品国产乱码91久久久久久网站| 欧美午夜不卡在线观看免费| 成人av资源网站| 国产成人精品免费在线| 韩日精品视频一区| 精品一区二区在线观看| 日本欧美韩国一区三区| 婷婷六月综合网| 亚洲大片在线观看| 亚洲 欧美综合在线网络| 亚洲伦在线观看| 一区二区三区四区激情 | 精品午夜一区二区三区在线观看| 亚洲二区在线视频| 一区二区三区精品在线观看| 亚洲特黄一级片| 亚洲三级在线免费观看| 国产精品久久久久久久久动漫| 久久久九九九九| 久久久www成人免费无遮挡大片| 日韩免费电影一区| 精品国产乱码久久久久久浪潮| 一个色在线综合| 夜夜揉揉日日人人青青一国产精品| 亚洲欧美在线视频观看| 中文字幕一区二区视频| 亚洲男人的天堂在线aⅴ视频| 亚洲欧美乱综合| 亚洲1区2区3区视频| 蜜臀av一级做a爰片久久| 麻豆91免费看| 国产成人在线观看| 99视频一区二区| 91精品福利在线| 欧美一区二区在线不卡| 精品国产乱码久久久久久图片| 久久久国产精品午夜一区ai换脸| 国产精品久久久久影视| 一区二区免费在线| 美女视频黄 久久| 国产成人在线视频网站| 91最新地址在线播放| 欧美性做爰猛烈叫床潮| 日韩一级片在线观看| 日本一区二区三区在线不卡 | 久久久99久久精品欧美| 综合久久综合久久| 午夜精品久久久久久不卡8050| 久久99国产精品久久99果冻传媒| 久久99蜜桃精品| 91蜜桃网址入口| 欧美一二三四区在线| 国产精品免费久久| 免费在线一区观看| www.日本不卡| 日韩欧美一级特黄在线播放| 国产精品高潮呻吟久久| 欧美aⅴ一区二区三区视频| 成人午夜电影小说| 欧美精品一二三区| 中文欧美字幕免费| 免费观看在线综合色| 99久久精品国产麻豆演员表| 日韩欧美中文一区| 亚洲精品国产视频| 国产精品中文字幕一区二区三区| 在线免费不卡视频| 国产欧美一区二区三区在线老狼| 午夜精品免费在线| 成a人片国产精品| 欧美丰满美乳xxx高潮www| 国产精品美女久久久久aⅴ | 国产精品久99| 奇米影视一区二区三区小说| 不卡在线观看av| 精品国产91乱码一区二区三区| 中文字幕在线不卡一区| 日韩国产高清在线| 色综合欧美在线视频区| 久久这里都是精品| 欧美aaaaa成人免费观看视频| 色一区在线观看| 久久综合久久综合亚洲| 日韩中文字幕麻豆| 日本韩国视频一区二区| 国产丝袜在线精品| 捆绑变态av一区二区三区| 91视频一区二区三区| 久久久久久电影| 久久se精品一区精品二区| 精品视频1区2区| 亚洲天天做日日做天天谢日日欢| 狠狠色综合色综合网络| 91精品久久久久久蜜臀| 午夜久久久久久| 欧美精品自拍偷拍| 亚洲一区影音先锋| 日本福利一区二区| 一区二区三区国产豹纹内裤在线 | 成人免费毛片片v| 国产色一区二区| 岛国精品在线观看| 国产亚洲精品aa午夜观看| 国产一区二区在线观看视频| 欧美va亚洲va国产综合|