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

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

?? treesearch.cpp

?? 《C++Builder程序設計范例--中國象棋》配書盤自述文件
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
#include <stdio.h>
#include "MainForm1.h"
#include "CDefines.h"
#include "Chess.h"
#include "Global.h"

#undef max
#undef min
#define max(a, b)  (((a) > (b)) ? (a) : (b))
#define min(a, b)  (((a) < (b)) ? (a) : (b))

bool ComputerThinking = false;
bool GotValidMove = false;

int LegalMoves;
extern bool OnlyKnOrPa;

extern double WantedTime;
WORD MessageToPost;
bool NoComputerMove = false;


static MOVETYPE MoveTemp[MAXPLY - BACK + 2];

MOVETYPE *MoveTable = &MoveTemp[-BACK];

#define     TOLERANCE       8
#define     IF_EQMOVE(a, b)     if ((a.movpiece == b.movpiece) && (a.newpos1 \
== b.newpos1) && (a.oldpos == b.oldpos) && (a.content == b.content) \
&& (a.spe == b.spe))

typedef struct
    {
        short principvar;  /*  搜索樹的主要變化  */
        MAXTYPE value,     /*  靜態局面估值 */
            evaluation;    /*  位置估值 */
    } INFTYPE;
typedef enum {mane, specialcap, norml} MOVGENTYPE;  /*  移動類型  */
typedef struct
    {
        PATHTYPE path;        /*  下一個回合的最好路線 */
        short capturesearch;  /*  吃子搜索  */
        MAXTYPE maxval;       /*  搜索樹中返回的最大值 */
        int nextply;          /*  下一個回合的搜索深度 */
        INFTYPE next;         /* 下一個回合的信息 */
        short zerowindow;     /*  寬度為零的α~β窗口  */
        MOVGENTYPE movgentype;
    } SEARCHTYPE;

typedef struct
    {
        MAXTYPE alpha, beta;
        int ply;
        INFTYPE *inf;
        MOVETYPE *bestpath;
        SEARCHTYPE *S;
    } PARAMTYPE;


short ChckTab[MAXPLY+3];
short *CheckTable = &ChckTab[1];
bool SkipSearch;


static INFTYPE startinf;     /*  一個回合的信息  */
static MAXTYPE alphawindow;  /*  α窗口值  */
static MAXTYPE repeatevalu;  /*  一個回合中的最大值 */

static MAXTYPE search(MAXTYPE alpha, MAXTYPE beta, int ply, INFTYPE *inf,
        MOVETYPE *bestpath);


/*
在信息窗體中打印深度值和著法
*/
inline void PrintMove()
{
   if (!Depth)
      {
      sprintf(buffer, "%-7d%7s", MaxDepth, MoveStr(&MoveTable[0]));
      InfoForm->SetDepthText(buffer);
      }
}

/*
 *  初始化將軍表
 */

static void RemoveKillMove(void)
{
    CheckTable[-1] = 0;
}


static DEPTHTYPE searchstatedepth;

/*
 *  備份搜索且設置對話環境
 */

static void getprogramstate(void)
{
    COLORTYPE oldplayer;

    searchstatedepth = Depth;
    while (Depth > 0)
{
        Depth--;
        oldplayer = Opponent;
        Opponent = Player;
        Player = oldplayer;
        Perform(&MoveTable[Depth], 1);   //回退一步
    }
    Depth--;
    if (Opan) TakeBackMove(&MoveTable[Depth]);
}


/*
 *  恢復搜索環境
 */

static void getsearchstate(void)
{
    COLORTYPE oldplayer;

    if (Opan) MakeMove(&MoveTable[Depth+1]);
    Depth++;
    while (Depth < searchstatedepth)
    {
        Perform(&MoveTable[Depth], 0);  //向前看一步
        oldplayer = Player;
        Player = Opponent;
        Opponent = oldplayer;
        Depth++;
    }
}

inline bool UsableMessage(MSG msg)
{
  if (msg.hwnd != Application->MainForm->Handle || msg.message != WM_COMMAND)
      return false;
   return true;
}
static void MessageScan()
{
   MSG msg;

   if (!::PeekMessage(&msg, Application->MainForm->Handle, 0, 0, PM_REMOVE))
      return;

   if (Analysis)
      {
      switch (msg.message)
         {
         case WM_SETCURSOR :
            ::DispatchMessage(&msg);
            break;
         case WM_COMMAND :
            if ((msg.wParam -(MainForm->Stop->Command))==0)
               {
               SkipSearch = true;
               AutoPlay = false;
               }
           break;
         default:
            ::TranslateMessage(&msg);
            ::DispatchMessage(&msg);
            break;
         }
      }
   else
      {
      switch (msg.message)
         {
         case WM_LBUTTONDOWN :
            getprogramstate();
            NoComputerMove = true;
            GotValidMove = false;
            ::DispatchMessage(&msg);
            NoComputerMove = false;
            if (Opan && !MultiMove && GotValidMove)
               {
               IF_EQMOVE(KeyMove, MoveTable[Depth + 1])
                  {
                      SkipSearch = false;
                      GotValidMove = false;
                      EnterKeyMove();
                      StartAnalysis();
                      PrintBestMove(&MainPath[0], MainEvaluat);
                      MainForm->Menu=MainForm->TChessThinkMenu; //動態設置主窗體主菜單
                      Screen->Cursor=TCursor(crWaitCursor);
                  }
               else
                  SkipSearch = true;
               }
            getsearchstate();
            break;
         default:
            if (UsableMessage(msg))
               {
               SkipSearch = true;
              if (msg.message != WM_PAINT)
                 ::PostMessage(Application->MainForm->Handle, msg.message, msg.wParam, msg.lParam);

               }
            else
               {
              ::TranslateMessage(&msg);
              ::DispatchMessage(&msg);
               }
            break;
         }
      }
}


/*
 *  檢查以前是否生成過棋子移動
 */

short generatedbefore(PARAMTYPE *P)
{

    if (P->S->movgentype != mane)
    {
        IF_EQMOVE(MoveTable[Depth], P->bestpath[Depth]) return 1;
    }
    return 0;
}


/*
 *  測試剪枝。剪枝值包含最大可能估值
 */

inline short cut(MAXTYPE cutval, PARAMTYPE *P)
{
    short ct = 0;

    if (cutval <= P->alpha)
    {
	ct = 1;
        if (P->S->maxval < cutval) P->S->maxval = cutval;
    }
    return ct;
}


/*
  執行移動,計算估值,測試剪枝等。
 */

static short update(PARAMTYPE *P)
{
    short selection;

    AddNode(&Nodes);
    P->S->nextply = P->ply - 1;      /*  計算下一個回合  */
    if (Level == matesearch)  /*  將死搜索  */
    {
        Perform(&MoveTable[Depth], 0);  /*  向前看一步 */
        /*  檢查移動是否合法  */

       if (Attacks(Opponent, PieceTable[Player][0].isquare)
          || (Repetition(0) >= 2))
           goto TAKEBACKMOVE;

            if (!Depth) LegalMoves++;
        CheckTable[Depth] = 0;
        P->S->next.value = P->S->next.evaluation = 0;
        if (P->S->nextply <= 0)  /* 計算將軍并執行剪枝 */
        {
	    if (!P->S->nextply)
                CheckTable[Depth] = Attacks(Player,
                    PieceTable[Opponent][0].isquare);
	    if (!CheckTable[Depth])
                if (cut(P->S->next.value, P)) goto TAKEBACKMOVE;
        }
        goto ACCEPTMOVE;
    }
    /*  在第一輪中保證有限的特殊吃子優先得到搜索 */
    if (MaxDepth <= 1)
        if (P->S->capturesearch && Depth >= 2)
            if (!((MoveTable[Depth].content < MoveTable[Depth].movpiece)
                || (P->S->movgentype == specialcap) || (MoveTable[Depth].oldpos
                == MoveTable[Depth-2].newpos1)))
                goto CUTMOVE;
            /*  計算下一步靜態增量估值  */
    P->S->next.value = -P->inf->value + StatEvalu(&MoveTable[Depth]);
    /* 計算將軍表(只計算能將軍的移動)不能算是一個回合 */
    CheckTable[Depth] = PieceAttacks(MoveTable[Depth].movpiece, Player,
        MoveTable[Depth].newpos1, PieceTable[Opponent][0].isquare);
    if (CheckTable[Depth]) P->S->nextply = P->ply;
        /*  在最后的吃子搜索中進行選擇  */
    selection = ((P->S->nextply <= 0) && !CheckTable[Depth] && (Depth > 0));
    if (selection)   /*  檢查估值  */
	if (cut(P->S->next.value + 0, P)) goto CUTMOVE;
    Perform(&MoveTable[Depth], 0);  /*  向前看一步  */
    /*  檢查移動是否合法  */
       if (Attacks(Opponent, PieceTable[Player][0].isquare)
          || (Repetition(0) >= 2))
           goto TAKEBACKMOVE;
    if (!Depth)
    {
        LegalMoves++;
        P->S->next.value += random(4);
    }
    P->S->next.evaluation = P->S->next.value;
ACCEPTMOVE:
    if (Analysis)
      PrintMove();
    return 0;
TAKEBACKMOVE:
    Perform(&MoveTable[Depth], 1);  //回退一步
CUTMOVE:
    if (Analysis)
       PrintMove();
    return 1;
}


/*
給予和棋加分或罰分,如果無法取勝的話就定為和棋
 */

static short drawgame(SEARCHTYPE *S)
{
    int drawcount;
    REPEATTYPE searchrepeat;
    SIXTYTYPE searchsixty;

    if (Depth == 1)
    {
        searchsixty = SixtyMoveCnt();
        searchrepeat = Repetition(0);
       	if (searchrepeat >= 3)
        {
            S->next.evaluation = 0;
	    return 1;
	}

        drawcount = 0;
        if (searchsixty >= 116)  /*  58次移動中沒有吃子 */
            drawcount = 3;
        else
        {
            if (searchrepeat >= 2)  /*  第二次重復  */
                drawcount = 2;
            else if (searchsixty >= 20)  /*  10次移動中沒有吃子  */
               drawcount = 1;
        }
        S->next.value += (repeatevalu / 4) * drawcount;
	S->next.evaluation += (repeatevalu / 4 ) * drawcount;
    }
    if (Depth >= 3)
    {
        searchrepeat = Repetition(1);
        if (searchrepeat >= 2)       /*  連續重復算平局  */
        {
            S->next.evaluation = 0;
	    return 1;
        }
    }
    return 0;  //能贏就要贏
}


/*
根據計算出的路線和最大值更改最好路線和最大估值
 */

inline void updatebestpath(PARAMTYPE *P)
{
    memcpy(P->bestpath, &P->S->path[0], sizeof(PATHTYPE));
    /* *bestpath = P->S->path; */
    P->bestpath[Depth] = MoveTable[Depth];
    if (!Depth)
    {
        MainEvaluat = P->S->maxval;
        if (Level == matesearch)
            P->S->maxval = alphawindow;
        if (Analysis) PrintBestMove(&MainPath[0], MainEvaluat);
    }
}


/*
棋路樹搜索程序的內部循環。MoveTable[Depth]表包含了移動。
 */

static short loopbody(PARAMTYPE *P)
{
    COLORTYPE oldplayer;
    short lastanalysis;

    if (generatedbefore(P)) return 0;
    if (Depth < MAXPLY)
    {
        P->S->path[Depth + 1] = ZeroMove;
        if (P->S->movgentype == mane)
            memmove(&P->S->path[0], P->bestpath, sizeof(PATHTYPE));
            /* P->S->path = *bestpath; */
    }
    /*  Principvar 意味著主要變著的搜索 */
    /*  零窗口意味著寬度為0的α~β窗口  */
    P->S->next.principvar = 0;
    P->S->zerowindow = 0;
    if (P->inf->principvar)
        if (P->S->movgentype == mane)
            P->S->next.principvar = (P->bestpath[Depth+1].movpiece != empty);
        else
            P->S->zerowindow = (P->S->maxval >= P->alpha);
REPEATSEARCH:
    if (update(P)) return 0;
    if (Level == matesearch)  /*  無子可動、將死時停止搜索  */
        if ((P->S->nextply <= 0) && !CheckTable[Depth]) goto NOTSEARCH;
    if (drawgame(P->S)) goto NOTSEARCH;
    if (Depth >= MAXPLY)
        goto NOTSEARCH;
    /*  使用遞歸調用搜索分析下一個回合 */
    oldplayer = Player;
    Player = Opponent;
    Opponent = oldplayer;
    Depth++;
    if (P->S->zerowindow)
        P->S->next.evaluation = -search(-P->alpha - 1, -P->alpha, P->S->nextply,
                &P->S->next, &P->S->path[0]);
    else
        P->S->next.evaluation = -search(-P->beta, -P->alpha, P->S->nextply,
                &P->S->next, &P->S->path[0]);
    Depth--;
    oldplayer = Opponent;
    Opponent = Player;
    Player = oldplayer;
NOTSEARCH:
    Perform(&MoveTable[Depth], 1);  /*  退回一步  */
    if (SkipSearch)
        return 1;
    lastanalysis = Analysis;  /*  掃描消息并檢查是否設置 SkipSearch  */
    MessageScan();
    if (!SkipSearch)
        if (Analysis && !SingleStep && ((!Depth) || !lastanalysis))
        {
            StopTime(&ChessClock);
            if (MainEvaluat > alphawindow)
                SkipSearch = ChessClock.totaltime >= (WantedTime * 1.5);
        }
    if (Analysis && (MaxDepth <= 1))
        SkipSearch = 0;
    P->S->maxval = max(P->S->maxval, P->S->next.evaluation);  /*  更改最大值 */
    IF_EQMOVE(P->bestpath[Depth], MoveTable[Depth])  /*  走子沒有變化的話,更改最好路線 */
        updatebestpath(P);
    if (P->alpha < P->S->maxval)      /*  更改α窗口并檢查剪枝 */
    {
        updatebestpath(P);
        if (P->S->maxval >= P->beta)
            return 1;
        /*  調整最大值,在原來最大值的基礎上加上一個容忍常數  */
        if (P->ply >= 2  && P->inf->principvar && !P->S->zerowindow)
            P->S->maxval = min(P->S->maxval + TOLERANCE, P->beta - 1);
        P->alpha = P->S->maxval;
        if (P->S->zerowindow && ! SkipSearch)
        {
            /*  全寬度搜索(一個不漏) */
            P->S->zerowindow = 0;
            goto REPEATSEARCH;
        }
    }
    return SkipSearch;
}


/*
 *  在新的位置生成吃子移動
 */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本不卡一区二区| aaa国产一区| 从欧美一区二区三区| 在线视频中文字幕一区二区| 在线播放一区二区三区| 18欧美亚洲精品| 国产美女精品一区二区三区| 欧美无人高清视频在线观看| 国产欧美日韩久久| 免费欧美日韩国产三级电影| 色婷婷久久久亚洲一区二区三区| 欧美成人午夜电影| 视频一区视频二区在线观看| 一本久久精品一区二区| 欧美激情在线一区二区三区| 蜜臀91精品一区二区三区 | 男人的天堂久久精品| 99精品视频在线观看| 久久久精品天堂| 久久丁香综合五月国产三级网站| 欧美吻胸吃奶大尺度电影| 综合欧美亚洲日本| 不卡的电影网站| 国产精品三级av| 粉嫩aⅴ一区二区三区四区五区| 日韩欧美中文一区二区| 日本成人在线不卡视频| 欧美男人的天堂一二区| 亚洲二区在线视频| 欧美性色欧美a在线播放| 亚洲精品乱码久久久久久久久| 成人精品在线视频观看| 日本中文字幕一区二区视频 | 精品一区二区三区免费视频| 欧美日韩国产另类一区| 亚洲一区二区三区四区在线免费观看| 91丨九色porny丨蝌蚪| 综合久久久久久久| 91亚洲男人天堂| 亚洲影视资源网| 欧美日韩国产高清一区| 天涯成人国产亚洲精品一区av| 欧美精品免费视频| 老司机免费视频一区二区三区| 日韩亚洲欧美综合| 国产一区二区三区视频在线播放| 久久久欧美精品sm网站| 高清久久久久久| 亚洲免费色视频| 欧美三区免费完整视频在线观看| 亚洲电影在线播放| 日韩亚洲欧美综合| 成人毛片老司机大片| 亚洲人吸女人奶水| 56国语精品自产拍在线观看| 久久精品国产免费| 中文一区二区在线观看| 日本高清不卡一区| 麻豆91精品视频| 日本一区二区三区电影| 欧洲av一区二区嗯嗯嗯啊| 美女精品自拍一二三四| 中文字幕不卡的av| 欧美日韩精品一区二区天天拍小说| 免费在线观看日韩欧美| 中文字幕欧美日本乱码一线二线| 色综合久久综合网97色综合| 日韩国产欧美在线播放| 欧美极品美女视频| 欧美片网站yy| 成人av资源下载| 日韩不卡一区二区| 亚洲欧美在线aaa| 日韩视频一区二区在线观看| av资源网一区| 免费观看一级特黄欧美大片| 国产精品久久久久久亚洲毛片 | 国产精品午夜免费| 欧美久久久久久久久中文字幕| 加勒比av一区二区| 亚洲综合激情另类小说区| 精品国产免费视频| 欧美午夜精品免费| 久久午夜色播影院免费高清| 麻豆国产欧美日韩综合精品二区| 18欧美乱大交hd1984| 日韩一区二区影院| 91视频xxxx| 国产成人a级片| 日本va欧美va瓶| 一区二区三区日韩欧美精品| 久久99久久久欧美国产| 3d成人h动漫网站入口| 91精品久久久久久久91蜜桃| 成人av手机在线观看| 久久久久久久久久看片| 91啪亚洲精品| 91视视频在线观看入口直接观看www | 亚洲综合在线免费观看| www.亚洲在线| 亚洲电影一区二区三区| 国产视频一区二区三区在线观看| 欧美成人精品1314www| 在线视频国产一区| av一二三不卡影片| 成人美女视频在线观看| 国模一区二区三区白浆| 日本va欧美va精品发布| 一区二区在线观看免费| 国产精品剧情在线亚洲| 国产日韩精品久久久| 亚洲精品在线免费播放| 欧美一区三区二区| 3751色影院一区二区三区| 欧美视频在线观看一区| 91黄色小视频| 欧美在线影院一区二区| 91成人免费在线| 91国模大尺度私拍在线视频| 99热精品国产| 色猫猫国产区一区二在线视频| 成人妖精视频yjsp地址| 成人伦理片在线| 99r精品视频| 一本一道久久a久久精品综合蜜臀| 成人美女在线观看| 91色视频在线| 91成人国产精品| 欧美日韩中文国产| 91精品欧美福利在线观看| 欧美一级欧美一级在线播放| 精品剧情在线观看| 久久一二三国产| 国产精品毛片高清在线完整版 | 中文av一区特黄| 亚洲人亚洲人成电影网站色| 一区二区三区在线免费播放| 亚洲国产欧美在线人成| 婷婷六月综合亚洲| 狠狠色丁香九九婷婷综合五月| 国产精品羞羞答答xxdd| av午夜精品一区二区三区| 91黄色免费网站| 日韩视频在线你懂得| 国产欧美日韩不卡| 一区二区三区蜜桃网| 青椒成人免费视频| 成人美女在线观看| 欧美日韩国产综合视频在线观看 | 成人免费福利片| 欧美日韩精品一区二区三区蜜桃| 日韩精品一区二区三区视频 | 国产伦精品一区二区三区免费迷| 北条麻妃国产九九精品视频| 欧美在线观看18| 欧美本精品男人aⅴ天堂| 国产精品久久久一本精品| 亚洲制服丝袜av| 国精产品一区一区三区mba视频| 成人黄色软件下载| 制服丝袜亚洲精品中文字幕| 日本一区免费视频| 婷婷开心久久网| av一区二区三区黑人| 日韩欧美一级精品久久| 亚洲色图在线视频| 国产在线观看免费一区| 欧美视频一二三区| 国产精品视频一二三| 日韩av二区在线播放| 91视频国产观看| 国产亚洲精品中文字幕| 性做久久久久久免费观看欧美| 国产99久久久久| 日韩欧美色电影| 亚洲国产成人av好男人在线观看| 国产福利一区二区三区| 欧美一区二区三区喷汁尤物| 亚洲免费三区一区二区| 国产夫妻精品视频| 日韩精品自拍偷拍| 亚洲国产wwwccc36天堂| 99久久婷婷国产精品综合| www精品美女久久久tv| 天天综合日日夜夜精品| 91在线云播放| 国产精品热久久久久夜色精品三区 | 亚洲精品第1页| 东方欧美亚洲色图在线| 26uuu成人网一区二区三区| 青青草精品视频| 欧美酷刑日本凌虐凌虐| 亚洲国产日韩在线一区模特 | 成人性视频免费网站| 欧美精品一区二区三区久久久| 日韩av一区二区三区四区| 欧美在线看片a免费观看| 亚洲综合一二三区| 日本道在线观看一区二区| 中文字幕字幕中文在线中不卡视频|