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

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

?? _gamer.cpp

?? 利用c++編寫的帶人工智能的跳棋程序。屏幕的中央是棋盤
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
    
    /* 下面這個語句段用來對FarWin和NearWin進行判斷和改變,以達到在不同情況下采取不同的搜索方法之目的*/
    //-----------------------開始----------------------------------
    for(i=0;i<10;i++)					// 搜尋是否有走到目的節點的棋子
    {
        if( tNodes[ 120-MyChessman[i] ].Chessman  == type )
            data[0].Score += ReachAim;			// 若本方有,則給評估函數值加ReachAim(10*27)
        else if( tNodes[ MyChessman[i] ].Chessman == enemy )
            data[1].Score += ReachAim;			// 若對手有,則給評估函數值加ReachAim(10*27)
    }
    if( FarWin == 1 )					// 若雙方棋子還沒有交鋒,則FarWin為真(非零值)
    {
        if( MyChessman[0] == 0 )			// 若游戲者原來占據棋盤的正上方,則Pos[0][9]是最
            if( Pos[0][9] > Pos[1][0] )			// 前端的棋子,Pos[1][0]是對手最前端的棋子	
                FarWin = 0;				// 交鋒,則FarWin為假(零值)
        else if( Pos[0][0] < Pos[1][9] )		// 若游戲者原來占據棋盤的正下方,則Pos[0][0]是最
           						// 前端的棋子,Pos[1][9]是對手最前端的棋子
                 FarWin = 0;				// 交鋒,則FarWin為假(零值)
    }
    else						// 若雙方棋子已經交鋒
    if( NearWin!=1)
    {
        if( data[0].Score > 8*ReachAim )		// 若已有至少8個棋子到達目的地,即馬上要結束
            NearWin = 1;				// 則NearWin 為真(非零值)
        if( MyChessman[0] == 0 )			// 若游戲者原來占據棋盤的正上方,則Pos[0][0]是最
            if( Pos[0][0] > Pos[1][9] )                 // 后端的棋子,Pos[1][9]是對手最后端的棋子	
                NearWin = 1;				// 雙方的棋子已經離開,則NearWin 為真(非零值)
        else if( Pos[0][9] < Pos[1][0] )		// 若游戲者原來占據棋盤的正下方,則Pos[0][9]是最
        						// 后端的棋子,Pos[1][0]是對手最后端的棋子
                 NearWin = 1;				// 雙方的棋子已經離開,則NearWin 為真(非零值)
    }
    
    if( data[0].Score == 10*ReachAim )    		// 若10個棋子全部到達目的地,則將評估值置為最大
    {							// 返回
            data[0].Score = 20000;
            return data[0];
    }
    
    data[0].Score = data[1].Score = 0 ;			// 最后將評估函數值重置為零,下面開始真正的評估
    //-----------------------------結束-----------------------------------------------------
    
    // 開始評估
    _Coodinate cood[2],iCood;
    k = 120-MyChessman[0];				// k為目的地中的最遠節點的序號
    cood[0] = tNodes[k].cood;				// cood[0]存放最遠目的節點的坐標
    cood[1] = tNodes[ MyChessman[0] ].cood;		// cood[1]存放本方初始最后面節點的坐標
    int t,m;
    for( j = 0;j<2;j++)
    {
        for(i=Sumdis=0;i<10;i++)			// 一次循環完成所有節點(本方或對手)與最遠
        {						// 目的節點(或本方初始最后面節點)的距離評估值
            iCood = tNodes[ Pos[j][i] ].cood;
            t = abs(cood[j].x-iCood.x);			// 每個節點與最遠目的節點(本方初始最后面節點)
            						// 的橫坐標之差的絕對值
            m = abs(cood[j].y-iCood.y);			// 每個節點與最遠目的節點(本方初始最后面節點)
            						// 的縱坐標之差的絕對值
            m *= 1.15;           			// 將縱坐標之差的絕對值乘1.15
            m += t;					// 將兩個值相加
            m = m/10;					// 將這個和除以10
            Sumdis +=  m*m;				// 將上面得到的結果平方和累積
        }
        if( cood[j].y > 100 )    			// 若本方原來占據了正上方,則t=0
            t = 0;             		 		
        else t = 5;					// 若本方原來占據了正下方,則t=5
        for(i = t;i < t+4;i++)				// 若走后邊的棋子則有加分
           if( (h = tNodes[ Pos[j][i+1] ].cood.y - tNodes[ Pos[j][i] ].cood.y ) > 50 )
               Sumdis += (h-1)*150/27;
        data[j].Score += DisStep*( 20000 - Sumdis ) ;	// 得到該游戲者的評估值
    }
    if( NearWin == 0 && FarWin == 0 )			// 若處于中盤階段則需要從本方的評估值中
    							// 減掉對手的評估值與權重的乘積
        data[0].Score  -= data[1].Score*EnemyScoreQuotiety;
	return data[0];
}
//---------------------------------------------------------------------------------------------
void _Robot::GetAllMyPath(_Path *AllPath,_Nodes *tNodes,int type)	
{							// 取得所有可走路徑的函數,參數分別為指向存放所有
							// 可走位置數組的指針,指向棋盤的指針,游戲者序號
							// 將結果記錄在第一個參數中
    int n,i,k,j;
    int chess[10];  					// 記錄當前10個棋子位置的數組
    for(i=k=0;i<121;i++)  				// 搜索10個指定棋子的位置
    {
        if( tNodes[i].Chessman == type )
             chess[k++] = i;
        tNodes[i].visited = 0;				// 所有的棋子目前都沒有被訪問
    }
    _Nodes Node;
    for(i=0;i<10;i++)					// 對10個棋子進行循環
    {
        n=0;
        AllPath[i].count = 0;				// 第i個棋子可走的位置有0個
        AllPath[i].start =chess[i];			// 記錄第i個棋子起始點序號
        Node=tNodes[AllPath[i].start];			// 當前是棋盤上的第i個棋子的起始點
        for(j=0;j<6;j++)				// 判斷相鄰的位置是否可以走棋,若是,則記為可走節點
        	if( Node.pointers[j] != 0 )
                if(Node.pointers[j]->Chessman == 0)
	                Node.pointers[j]->visited =1;

        DFS2(AllPath[i].start,tNodes);			// 判斷其他的位置是否能夠走棋
        for(k=0;k<121;k++)				// 記錄所有可以走棋的位置于Allpath數組中
            if(tNodes[k].visited ==1)
            {
                AllPath[i].path[n++]=k;
                tNodes[k].visited = 0;
            }
        AllPath[i].count=n;				// 所有可走的位置的總數
    }
}

//---------------------------------------------------------------------------------------------
_EvalueData _Robot::Search(_Nodes *tNodes,int Depth)	// 全搜索法,參數分別為指向棋盤的指針和搜索深度
{
    int i,j,Enemy;
    _EvalueData MaxData,NowData;			// 存放最大評估值和當前評估值的評估結構體
    _Path AllPath[10];   				// 存放十個棋子的可走位置
    MaxData.Score = -1000;				// 最大評估值初始化為-1000
    _GamerQuen *tQuen;					// 游戲者順序的鏈表
    Depth--;                         			// 深度減1many !turns!
    GetAllMyPath(AllPath,tNodes,gamerID);         	// 取得所有可以走的位置
    if( gamerID == 1 )					// 確定對手的序號
        Enemy = 2;
    else Enemy = 1;
    for(i=j=0;i<10;i++)          			// 對10個棋子進行循環
	for(j=0;j<AllPath[i].count;j++)   		// 對該棋子的所有可走節點進行循環
		{
							// 走到某個節點
		tNodes[ AllPath[i].path[j] ].Chessman = tNodes[ AllPath[i].start ].Chessman;
		tNodes[ AllPath[i].start ].Chessman = 0;
            	if(Depth == 0)				// 若搜索深度為0,評估當前的棋局
                	NowData = Evalue(tNodes,gamerID,Enemy);	
            	else 					// 若搜索深度不為0,則遞歸調用Search
            		NowData = Search(tNodes,Depth); 
		if( NowData.Score > MaxData.Score )  	// 若當前的棋局比較好,則替換最大評估函數值
			{
                 	MaxData.Score = NowData.Score;
                 	MaxData.start = AllPath[i].start ;
                 	MaxData.end = AllPath[i].path[j];
            		}
							// 將這一步走回去,回到原來的狀態
		tNodes[ AllPath[i].start ].Chessman = tNodes[ AllPath[i].path[j] ].Chessman;
		tNodes[ AllPath[i].path[j] ].Chessman = 0;
		}
    return MaxData;					// 返回最大的評估值
}

//---------------------------------------------------------------------------------------------
_EvalueData _Robot::aBSearch(_Nodes *tNodes,int Depth,int ParentScore)
{							// 剪枝搜索法,參數分別為指向棋盤的指針,
							// 搜索深度,上一層的評估值
    int i,j,Enemy;
    _EvalueData MaxData,NowData;			// 存放最優評估值和當前評估值的評估結構體
    _Path AllPath[10];   				// 存放10個棋子可走位置的數組
    _GamerQuen *tQuen;					// 指向游戲者順序的鏈表
    Depth--;						// 搜索深度減1
    if( GamerQuen->GamerId == gamerID) 			// 根據當前節點的歸屬決定它的初值
        MaxData.Score = -20000;          		
    else
        MaxData.Score = 20000;
    GetAllMyPath(AllPath,tNodes,GamerQuen->GamerId);   	// 取得所有可以走的位置
    for(i=j=0;i<10;i++)          			// 對10個棋子進行循環
	for(j=0;j<AllPath[i].count;j++)   		// 對每個可走的位置進行循環
		{
							// 走到某個可走的位置
		tNodes[ AllPath[i].path[j] ].Chessman = tNodes[ AllPath[i].start ].Chessman;
		tNodes[ AllPath[i].start ].Chessman = 0;
            						// 轉到下一個游戲者
            	tQuen = GamerQuen,GamerQuen = GamerQuen->Next;
	        if(Depth == 0)				// 若搜索的深度已經為0
            		{				// 確定對手的序號
                	if( GamerQuen->GamerId == gamerID) 
                    		Enemy = GamerQuen->EnemyId ;
                	else Enemy = GamerQuen->GamerId ;
                					// 評估當前的棋局
                	NowData = Evalue(tNodes,gamerID,Enemy);
            		}
            	else 					// 若搜索的深度不為0,則遞歸搜索
            		NowData = aBSearch(tNodes,Depth,MaxData.Score); 

            	if( GamerQuen->GamerId == gamerID ) 	// 若當前游戲者正是原來的游戲者
            	{					
                	if( NowData.Score <= ParentScore ) 	
                	{				// 若當前評估函數值小于初值,則減掉這一支
                    					// 將初值賦給最優評估值
                    		MaxData.Score = ParentScore;
                    					// 將這一步再走回去
                    		tNodes[ AllPath[i].start ].Chessman = tNodes[ AllPath[i].path[j] ].Chessman;
		    		tNodes[ AllPath[i].path[j] ].Chessman = 0;
		        	GamerQuen = tQuen;	// 將游戲者轉回去
                    		return MaxData;
                	}
                	else if( NowData.Score < MaxData.Score )
	    		{				// 若當前評估函數值優于(大于等于)初值,保留
	    						// 將當前值賦給最優評估值
                     		MaxData.Score = NowData.Score;	
                     		MaxData.start = AllPath[i].start ;
                     		MaxData.end = AllPath[i].path[j];
                	}
             	}
             	else					// 若當前的游戲者已經是原來游戲者的對手
             	{
                	if( NowData.Score >= ParentScore ) 	
                	{				// 若當前的評估值大于等于初值,則減掉這一支
                					// 將初值賦給最優評估值
                    		MaxData.Score = ParentScore;	
                    		tNodes[ AllPath[i].start ].Chessman = tNodes[ AllPath[i].path[j] ].Chessman;
	            		tNodes[ AllPath[i].path[j] ].Chessman = 0;
                    		GamerQuen = tQuen;	// 將游戲者轉回去
                    		return MaxData;
                	}
                	else if( NowData.Score > MaxData.Score )
                	{				// 若當前評估值優于(小于)初值,保留
                					// 將當前值賦給最優評估值
                     		MaxData.Score = NowData.Score;	
                     		MaxData.start = AllPath[i].start ;
                     		MaxData.end = AllPath[i].path[j];
                	}
             	}

							// 將這一步走回去,得到最初的狀態		
    		tNodes[ AllPath[i].start ].Chessman = tNodes[ AllPath[i].path[j] ].Chessman;
    		tNodes[ AllPath[i].path[j] ].Chessman = 0;
                GamerQuen = tQuen;			// 將游戲者轉回去
		}
    return MaxData;					// 返回最優的評估值結構體
}
void  _Robot::DFS2(int start,_Nodes *tNodes)
{
    _Nodes *pNode=NULL;

    for(int i=0;i<6;i++)				//遍歷一個節點的周圍六個節點
		{
			pNode=tNodes[start].pointers[i];
			if( pNode!=NULL )
				if( pNode->pointers[i]!=NULL )
					if(pNode->Chessman!=0&&pNode->pointers[i]->Chessman==0&&pNode->pointers[i]->visited==0)
					{
            	    	pNode->pointers[i]->visited = 1;
						DFS2(pNode->pointers[i]->index,tNodes);
					}
		}
}

//---------------------------------------------------------------------------------------------
void _Robot::GetCondition(int **ids,int count)          //_Robot初始化中將會用到
{
    _GamerQuen *t;					// 指向游戲者鏈表的指針
    int i;
    GamerQuen = new _GamerQuen();               	// 創建新的游戲者列表
    GamerQuen->GamerId = ids[0][0];             	// 賦值第一個游戲者
    if( GamerQuen->GamerId % 2 == 0 )			// 若游戲者序號為奇數,則該游戲者對手序號為本序號+1
            GamerQuen->EnemyId = GamerQuen->GamerId - 1;
    else 						// 若游戲者序號為偶數,則該游戲者對手序號為本話號-1
    	    GamerQuen->EnemyId = GamerQuen->GamerId + 1;
    t = GamerQuen;                              	// t指向游戲者列表的第一個游戲者
    for( i=1;i<count;i++)                       	// 將游戲者的順序輸入到列表中
    {						
        GamerQuen->Next = new _GamerQuen();		// 創建新的游戲者鏈表元素
        GamerQuen = GamerQuen->Next;			// 為新的游戲者鏈表元素賦值
        GamerQuen->GamerId = ids[i][0];			// 確定這個元素的對手是誰
        if( GamerQuen->GamerId % 2 == 0 )
            GamerQuen->EnemyId = GamerQuen->GamerId - 1;
        else GamerQuen->EnemyId = GamerQuen->GamerId + 1;
    }
    GamerQuen->Next = t;                     		// 將最后一個鏈表元素next指針指向第一個元素
    for( i=0;i<count;i++)                    		// 使gamerquen指向當前游戲者
        if(GamerQuen->GamerId == gamerID)
            break;
        else GamerQuen = GamerQuen->Next;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品美女久久久久久2018| 久久精品国产精品亚洲精品| 日本不卡的三区四区五区| 精品一区二区综合| 欧美日韩日日夜夜| 亚洲国产精品黑人久久久| 日韩高清在线观看| 一本大道综合伊人精品热热| 国产午夜亚洲精品羞羞网站| 亚洲电影在线播放| 丰满少妇在线播放bd日韩电影| 欧美无砖砖区免费| 亚洲美女屁股眼交3| 高清shemale亚洲人妖| 91精品欧美久久久久久动漫| 亚洲欧美日韩在线播放| 国产成人a级片| 26uuu精品一区二区三区四区在线| 亚洲综合一区二区| 91亚洲国产成人精品一区二区三| 久久久亚洲国产美女国产盗摄| 免费日韩伦理电影| 日韩三级电影网址| 日韩国产精品91| 欧美人体做爰大胆视频| 亚洲综合久久久| 91麻豆精品在线观看| 国产精品久久久久aaaa| 成人一二三区视频| 国产女同互慰高潮91漫画| 国产麻豆成人精品| 久久久不卡网国产精品一区| 亚洲少妇中出一区| 国产综合久久久久影院| 欧美成人vr18sexvr| 天堂va蜜桃一区二区三区漫画版| 91黄色免费网站| 日韩av在线免费观看不卡| 成人高清伦理免费影院在线观看| 日韩欧美美女一区二区三区| 免费人成黄页网站在线一区二区| 欧美一区二区三区影视| 麻豆成人久久精品二区三区小说| 日韩欧美电影一二三| 精品中文字幕一区二区| 国产婷婷色一区二区三区| 成人一区二区三区在线观看 | 在线欧美小视频| 亚洲欧美日韩久久| 欧美色视频在线| 日本女优在线视频一区二区| 欧美va亚洲va香蕉在线 | 免费成人深夜小野草| 精品理论电影在线观看| 国产成人av电影| 亚洲少妇30p| 欧美人牲a欧美精品| 经典三级在线一区| 中文字幕一区在线观看| 欧美视频在线一区二区三区| 全国精品久久少妇| 久久精品夜夜夜夜久久| 色诱视频网站一区| 毛片一区二区三区| 国产精品久久99| 欧美日韩精品电影| 国产乱码字幕精品高清av| 亚洲免费资源在线播放| 日韩一二三区视频| av激情成人网| 日韩精品亚洲一区二区三区免费| 久久久不卡影院| 欧美军同video69gay| 成人午夜电影网站| 喷水一区二区三区| 亚洲人亚洲人成电影网站色| 日韩视频一区二区在线观看| 91香蕉视频mp4| 麻豆国产欧美日韩综合精品二区| 国产精品情趣视频| 日韩无一区二区| 99久久精品一区二区| 免费成人小视频| 亚洲一区二区四区蜜桃| 欧美极品aⅴ影院| 欧美一二区视频| 欧美视频一区二区| av色综合久久天堂av综合| 久久99久久99| 午夜精品久久久久久久久久| 国产目拍亚洲精品99久久精品| 欧美色手机在线观看| 99久久er热在这里只有精品66| 蜜桃一区二区三区在线| 一区二区三区电影在线播| 国产午夜亚洲精品理论片色戒| 欧美精品xxxxbbbb| 欧美在线观看一区| 99这里只有精品| 成人综合在线视频| 国产精品亚洲一区二区三区妖精| 首页国产欧美日韩丝袜| 一区二区三区四区乱视频| 中文字幕av不卡| 欧美精品一区二区三| 日韩欧美一二三四区| 4438亚洲最大| 91精品国产91热久久久做人人| 色婷婷精品大视频在线蜜桃视频| 成人av资源网站| 国产91精品一区二区| 国产原创一区二区| 国产精品自拍一区| 国产酒店精品激情| 国产不卡高清在线观看视频| 国产伦精品一区二区三区在线观看| 日产欧产美韩系列久久99| 天天色综合天天| 水野朝阳av一区二区三区| 午夜精品久久久久久久99樱桃| 亚洲精品成人在线| 亚洲午夜久久久久久久久久久 | 91影视在线播放| 97精品超碰一区二区三区| 91网页版在线| 在线精品视频小说1| 欧美精品vⅰdeose4hd| 欧美一区二区三区免费观看视频| 在线不卡中文字幕播放| 日韩欧美电影一二三| 久久丝袜美腿综合| 亚洲特级片在线| 亚洲二区视频在线| 美腿丝袜亚洲一区| 国产一区久久久| av中文字幕一区| 欧美日韩一区二区三区视频| 日韩免费电影一区| 日本一区二区三区四区在线视频| 国产精品免费视频观看| 亚洲综合激情另类小说区| 天堂蜜桃91精品| 国产一区二区三区蝌蚪| 成人av综合一区| 欧美嫩在线观看| 国产视频一区二区三区在线观看| 综合久久久久综合| 全国精品久久少妇| www.亚洲精品| 在线不卡中文字幕播放| 国产精品沙发午睡系列990531| 一区二区三区小说| 国产精品自在在线| 在线观看国产91| 国产日韩欧美精品一区| 亚洲女人的天堂| 国产一区二区三区在线看麻豆| 99在线精品免费| 欧美成人三级电影在线| 中文字幕视频一区二区三区久| 香蕉加勒比综合久久| 国产suv一区二区三区88区| 在线观看成人小视频| 国产亚洲视频系列| 肉肉av福利一精品导航| 成人免费视频一区| 欧美一区二区播放| 亚洲欧美日韩在线| 国产精一区二区三区| 在线不卡中文字幕播放| 亚洲人成网站影音先锋播放| 久久er精品视频| 欧美美女一区二区三区| 国产精品毛片高清在线完整版| 捆绑调教一区二区三区| 91久久精品网| 国产精品久久久久毛片软件| 蜜臀久久99精品久久久久宅男| 色综合色狠狠天天综合色| 国产调教视频一区| 久久成人免费日本黄色| 欧美日韩国产高清一区二区 | 免费观看日韩电影| 欧美在线播放高清精品| 国产精品久久毛片av大全日韩| 麻豆视频一区二区| 91精品国产91久久综合桃花 | 日韩免费高清av| 天天综合色天天| 欧美体内she精高潮| 一区二区三区四区在线免费观看| 成人小视频免费观看| 26uuu另类欧美亚洲曰本| 蜜乳av一区二区| 欧美一区二区三级| 日韩高清不卡一区二区三区| 欧美三级在线视频| 亚洲成人免费视频| 91 com成人网| 日韩电影在线观看一区|