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

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

?? _gamer.cpp

?? 利用c++編寫的帶人工智能的跳棋程序。屏幕的中央是棋盤
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//此文件定義了游戲者類以及由它派生出的human和robot類
#include "_Gamer.h"
#include <iostream.h>
#include<conio.h>
#include<math.h>
#define ReachAim 		10*27			// 棋子達到目的地的加分
#define DisStep 		1
#define EnemyScoreQuotiety 	0.95
#define ConverDepth 		550
#define DisjointVal 		1


void _Gamer::Init(int *IDandChess,_Nodes* p)		// 游戲者的初始化,參數分別為指向含有游戲者序號和
							// 該游戲者所擁有的棋子的數組指針,指向棋盤的指針
{
	Nodes=p;  					// 獲得棋盤上的所有棋子
	Sellect=-1;					// 沒有選定棋子
	Aimplace=-1;					// 沒有目的節點
	gamerID=IDandChess[0];				// IDandChess[]數組的第一個元素即為gamerID
	for(int i=0;i<10;i++)				// 給游戲者的棋子賦值,從棋盤reset函數中獲得初始的
							// 棋子的節點序號
	{
		MyChessman[i]=IDandChess[i+1];
	}
}

//---------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------
_Message _Human::Input()				// 消息控制
{
	static int position=60;				// position置為60即在棋盤的最中央
	_Message msg;					// 用于返回的消息
	char ch;
	int p,q,i,j,k;
	ch=getch();  					// 獲得棋盤輸入的信息
	i=position;					// i是當前的選擇框位置
	switch(ch)
	{
		 case 'Q':				// Q則退出
				msg.wparam=EXIT;
				return  msg;
		 break;
		 case 'q':				// Q則退出
				msg.wparam=EXIT;
				return  msg;
		 break;
		 case 'R':				// R則重新開局
				msg.wparam=RESTART;
				return msg;
		 break;
		 case 'r':				// R則重新開局
				msg.wparam=RESTART;
				return msg;
		 break;
		 case 'H':				// H則為悔棋
				msg.wparam=REGRET;
				return msg;
		 break;
		 case 'h':				// H則為悔棋
				msg.wparam=REGRET;
				return msg;
		 break;
		 case 'a':				// a為向左移動
			 if(i!=0) 			// 如果不是最頂端的棋子,則向左移動一格,
				position=i-1;		// 若已是最左端,則移動到上一行最右邊的節點
							// 若是最頂端則不作移動
			 msg.wparam=MOVESELLECT;	// 消息類型為移動選擇框
			 msg.lparam=position;		// msg.lparam為當前選擇框所在的節點序號
			 return  msg;
		  break;
		  case 'A':				// a為向左移動
			 if(i!=0) 			// 如果不是最頂端的棋子,則向左移動一格,
				position=i-1;		// 若已是最左端,則移動到上一行最右邊的節點
							// 若是最頂端則不作移動
			 msg.wparam=MOVESELLECT;	// 消息類型為移動選擇框
			 msg.lparam=position;		// msg.lparam為當前選擇框所在的節點序號
			 return  msg;
		  break;
		  case 'd':				// d為向右走棋
			  if(i!=120)			// 如果不是最底端棋子的話,右移一格,若已是最
				position=i+1;		// 右端,則移動到下一行的最左邊的節點
							// 若是最底端則不作移動
			  msg.lparam=position;		// msg.lparam為當前選擇框所在的節點序號
			  msg.wparam=MOVESELLECT;	// 消息類型為移動選擇框
			  return  msg;
		  break;
		  case 'D':				// d為向右走棋
			  if(i!=120)			// 如果不是最底端棋子的話,右移一格,若已是最
				position=i+1;		// 右端,則移動到下一行的最左邊的節點
							// 若是最底端則不作移動
			  msg.lparam=position;		// msg.lparam為當前選擇框所在的節點序號
			  msg.wparam=MOVESELLECT;	// 消息類型為移動選擇框
			  return  msg;
		  break;
		  case 'w':				// w為向上走棋
			  k=i;
			  if(i!=0)
			  {
				  p=Nodes[i].cood.x;	// 取得當前節點的位置坐標
				  q=Nodes[i].cood.y;
				  for(;abs(Nodes[i-1].cood.y-Nodes[i].cood.y)<3;i--);
							// 若序號為i-1的節點和序號為i的節點在同一行則循環(沒有循環體)
				  i--;			// 找到上一行最右端的棋子
				  for(j=i-1;abs(Nodes[i].cood.y-Nodes[j].cood.y)<3;j--)
							// 序號為i的節點和序號為j的節點在同一行,循環
					  if(abs(Nodes[j].cood.x-p)<abs(Nodes[i].cood.x-p))
							// 尋找橫坐標與開始時的橫坐標最相近的點
						i=j;	// 找到這個點
			  }
			  position=i;
			  msg.wparam=MOVESELLECT;	// 消息類型為移動選擇框
			  msg.lparam=position;		// msg.lparam為當前選擇框所在的節點序號
			  return msg;
			 break;
		 case 'W':				// w為向上走棋
			  k=i;
			  if(i!=0)
			  {
				  p=Nodes[i].cood.x;	// 取得當前節點的位置坐標
				  q=Nodes[i].cood.y;
				  for(;abs(Nodes[i-1].cood.y-Nodes[i].cood.y)<3;i--);
							// 若序號為i-1的節點和序號為i的節點在同一行則循環(沒有循環體)
				  i--;			// 找到上一行最右端的棋子
				  for(j=i-1;abs(Nodes[i].cood.y-Nodes[j].cood.y)<3;j--)
							// 序號為i的節點和序號為j的節點在同一行,循環
					  if(abs(Nodes[j].cood.x-p)<abs(Nodes[i].cood.x-p))
							// 尋找橫坐標與開始時的橫坐標最相近的點
						i=j;	// 找到這個點
			  }
			  position=i;
			  msg.wparam=MOVESELLECT;	// 消息類型為移動選擇框
			  msg.lparam=position;		// msg.lparam為當前選擇框所在的節點序號
			  return msg;
			 break;

		 case 's':				// s為向下走棋
			  k=i;
			  if(i!=120)
			  {
				  p=Nodes[i].cood.x;	// 取得當前節點的位置坐標
				  q=Nodes[i].cood.y;
				  for(;abs(Nodes[i+1].cood.y-Nodes[i].cood.y)<3;i++);
							// 序號為i+1的節點和序號為i的節點在同一行
				  i++;			// 找到下一行最左端的棋子
				  for(j=i+1;abs(Nodes[j].cood.y-Nodes[i].cood.y)<3;j++)
							// 序號為i的節點和序號為j的節點在同一行
					if(abs(Nodes[j].cood.x-p)<abs(Nodes[i].cood.x-p))
							// 尋找橫坐標與開始時的橫坐標最相近的點
						i=j;	// 找到這個點
			  }
			  position=i;
			  msg.wparam=MOVESELLECT; 	// 消息類型為移動選擇框
			  msg.lparam=position;		// msg.lparam為當前選擇框所在的節點序號
			  return msg;
			  break;
		 case 'S':				// s為向下走棋
			  k=i;
			  if(i!=120)
			  {
				  p=Nodes[i].cood.x;	// 取得當前節點的位置坐標
				  q=Nodes[i].cood.y;
				  for(;abs(Nodes[i+1].cood.y-Nodes[i].cood.y)<3;i++);
							// 序號為i+1的節點和序號為i的節點在同一行
				  i++;			// 找到下一行最左端的棋子
				  for(j=i+1;abs(Nodes[j].cood.y-Nodes[i].cood.y)<3;j++)
							// 序號為i的節點和序號為j的節點在同一行
					if(abs(Nodes[j].cood.x-p)<abs(Nodes[i].cood.x-p))
							// 尋找橫坐標與開始時的橫坐標最相近的點
						i=j;	// 找到這個點
			  }
			  position=i;
			  msg.wparam=MOVESELLECT; 	// 消息類型為移動選擇框
			  msg.lparam=position;		// msg.lparam為當前選擇框所在的節點序號
			  return msg;
			  break;
		 case ' ':				// 空格為選定棋子
			 if(this ->Sellect==-1)		// 如果游戲者還未選定棋子
				msg.wparam=SELLECT;	// 則消息類型為選子
			 else
				msg.wparam=MOVECHESSMAN;// 否則為走棋
			 msg.lparam=position;		// msg.lparam為當前選擇框所在的節點序號
			 return msg;
			 break;
		 default:break;
	 }
	 msg.wparam=REINPUT;				// 什么都沒有則重新輸入
	 return msg;
}

//-------------------------------------------------------------------------------------
_Message _Robot::Input()
{
	_Message msg;					// 傳遞消息的變量
	SearchDepth=4;					// 搜索深度為4
	Think();					// 思考的過程
	msg.wparam=MOVECHESSMAN;			// 只有移動棋子這一種消息
    	msg.lparam=Aimplace;				// 目的節點
    	return msg;
}

_Robot::_Robot()                   			// Robot的構造函數
{
    GamerType = 0;					// 游戲者類型為0,即電腦控制
    GamerQuen = 0;					// 游戲者順序列表為空
    SearchDepth = 4;       				// 搜索深度是4
    NearWin = 0;					// 表示還沒有進入中盤
    FarWin = 1;					 	// 表示是剛開局
}

_Robot::~_Robot()                          		// Robot的析構函數
{
    _GamerQuen *t;					// 用于釋放游戲者順序鏈表指針的中間變量
    while( GamerQuen != 0 )                		// 從前往后析構(刪除指針)
    {
        t = GamerQuen;
        if(t->Next != 0)
        {
            GamerQuen = t->Next ;
            delete t;
            t = 0;
        }
        else break;
    }
    delete t;
    t = 0;
}

//-------------------------------------------------------------------------------------
void _Robot::Think()					// 電腦玩家的思考
{
	_Nodes tNodes[121];				// 存放棋盤的臨時數組
	_EvalueData data,data2,data3;			// 存放全搜索的不同深度的評估值
	for(int i=0;i<121;i++)  			// 將棋盤拷貝到tNodes中
	{
    	tNodes[i] = Nodes[i];
        for(int j=0;j<6;j++)  				// 指針的拷貝需要特別注意
            if( Nodes[i].pointers[j] != NULL )
                tNodes[i].pointers[j] = &tNodes[ Nodes[i].pointers[j]->index ];
    	}
    	/* 通常情況下,電腦玩家只需一步或者兩步就可以勝利,但是由于搜索的深度大于這個步數,電腦會
    	繼續搜索,以至于左右走動而不能夠贏棋,下面的代碼就是為了解決這個問題是寫的 */
    if( NearWin ==1 || FarWin ==1)         		// 如果將要勝利,則搜索一步或者兩步,
    {                            			// 取得其中的較大的評估值
        data = Search(tNodes,1); 			// 存放較大的評估值
        data2 = Search(tNodes,2);			// 搜索一步
        data3 = Search(tNodes,3);			// 搜索兩步
        if( data.Score < data2.Score )
            data = data2;
        if( data.Score < data3.Score )
            data = data3;
    }
    else						//若離勝利還遠,則采用剪枝法搜索
        data = aBSearch(tNodes,SearchDepth,20000);
    Sellect = data.start ;				// 確定要選擇的棋子
    Aimplace = data.end ;				// 確定目的節點
}

//-------------------------------------------------------------------------------------
_EvalueData _Robot::Evalue(_Nodes *tNodes,int type,int enemy)	
{							// 評估函數,參數分別為指向棋盤的指針,
							// 游戲者序號,對手的序號

    _EvalueData data[2] = { {0,0,0},{0,0,0} };		//存放本方和對手的評估函數值
    int Pos[2][10],k=0,h=0,i,j,walkway,Sumdis;
    _Nodes *tnode;
    for(i=0;i<121;i++)					// 找到棋盤上屬于本方和對手的棋子
    {
        if( tNodes[i].Chessman == type )		// pos[0]中存放本方的十個棋子
            Pos[0][k++] = i ;
        else if( tNodes[i].Chessman == enemy )		// pos[1]中存放對手的十個棋子
                 Pos[1][h++] = i ;
    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕中文字幕一区| 午夜精品久久一牛影视| 一区二区三区四区视频精品免费 | 精品国产一区二区三区忘忧草 | 成人av免费在线| 欧美老肥妇做.爰bbww| 国产午夜一区二区三区| 热久久久久久久| 99久久免费精品高清特色大片| 日韩欧美中文字幕公布| 亚洲自拍都市欧美小说| 国产丶欧美丶日本不卡视频| 日韩欧美在线观看一区二区三区| 一区二区三区四区国产精品| 成人污污视频在线观看| 日韩精品一区二区三区swag| 亚洲一区二区在线视频| 99re6这里只有精品视频在线观看| 精品国产一区二区三区av性色| 丝袜美腿成人在线| 欧美日韩亚洲高清一区二区| 日韩码欧中文字| 99久久99精品久久久久久| 国产欧美日韩三区| 国产精品77777竹菊影视小说| 日韩欧美一级在线播放| 蜜臀av性久久久久蜜臀aⅴ流畅 | 97久久久精品综合88久久| 久久久夜色精品亚洲| 久久av老司机精品网站导航| 欧美一区二区三区思思人| 五月天一区二区三区| 制服丝袜在线91| 午夜视频在线观看一区二区三区| 91蜜桃网址入口| 亚洲精品视频一区二区| 色欲综合视频天天天| 一区二区三区精品久久久| 一本到高清视频免费精品| 亚洲综合色噜噜狠狠| 色呦呦日韩精品| 午夜精品福利一区二区蜜股av | 成人av免费在线| 国产精品第13页| 91麻豆免费观看| 尤物av一区二区| 欧美日韩国产区一| 日韩成人免费电影| 欧美精品一区二区三区视频| 国产美女视频91| ●精品国产综合乱码久久久久| 一本大道av伊人久久综合| 亚洲一区二区在线观看视频 | 日本最新不卡在线| 精品嫩草影院久久| 成人午夜在线免费| 一区二区三区四区在线播放| 日韩一区二区三区视频| 国产成人啪免费观看软件| 亚洲精品精品亚洲| 欧美一区二区三区四区视频| 国产成人av资源| 亚洲一区二区三区在线播放| 日韩视频一区二区三区在线播放 | 激情久久五月天| 国产精品精品国产色婷婷| 欧美日韩一区在线观看| 国内欧美视频一区二区| 亚洲免费在线观看视频| 欧美一区二区三区免费在线看| 国产成人综合在线播放| 亚洲成人综合视频| 国产精品国产精品国产专区不片| 欧美日韩免费不卡视频一区二区三区| 九九视频精品免费| 一二三四社区欧美黄| 26uuu久久综合| 欧美性一二三区| 成人一级视频在线观看| 日本午夜一本久久久综合| 亚洲色图都市小说| 精品剧情在线观看| 欧美日韩国产综合视频在线观看| 国产a精品视频| 美女久久久精品| 一区二区三区四区中文字幕| 国产区在线观看成人精品| 91精品国产91久久久久久最新毛片| 成人小视频免费在线观看| 免费观看91视频大全| 亚洲一区二区三区三| 国产欧美精品区一区二区三区| 欧美一区二区二区| 欧美日韩在线免费视频| 94-欧美-setu| 成人动漫中文字幕| 国产成人免费在线视频| 精品在线免费视频| 日本一不卡视频| 午夜激情综合网| 一区二区三区四区高清精品免费观看 | 久久久久国产精品麻豆| 日韩精品一区二区三区在线播放 | 日韩一区二区视频在线观看| 欧美三级日韩在线| 在线观看区一区二| 在线亚洲免费视频| 91九色最新地址| 在线免费亚洲电影| 色八戒一区二区三区| 99久久99久久久精品齐齐| av在线一区二区| 不卡大黄网站免费看| 国产精品性做久久久久久| 国产真实精品久久二三区| 麻豆成人久久精品二区三区小说| 日韩黄色片在线观看| 蜜桃免费网站一区二区三区| 麻豆中文一区二区| 美女爽到高潮91| 国产乱子伦一区二区三区国色天香| 免费不卡在线观看| 狠狠色狠狠色综合| 夫妻av一区二区| 91在线一区二区| 91国偷自产一区二区开放时间| 色哟哟国产精品| 欧美日韩和欧美的一区二区| 欧美蜜桃一区二区三区| 日韩精品影音先锋| 国产日韩欧美一区二区三区乱码 | 国产99久久久国产精品| 成人黄色综合网站| 色综合天天综合狠狠| 欧美性欧美巨大黑白大战| 日韩一区二区三区四区五区六区| 精品成人a区在线观看| 亚洲国产激情av| 亚洲综合久久久久| 精品一区二区三区在线视频| 国产成人精品免费| 在线欧美日韩国产| 欧美电视剧在线看免费| 中文字幕欧美三区| 亚洲高清视频中文字幕| 久久99国产精品麻豆| 99国产精品久久久久久久久久| 欧美亚洲综合色| 久久久久久久精| 亚洲综合男人的天堂| 久久精品理论片| 99久久er热在这里只有精品15| 欧美日韩在线电影| 国产日韩欧美高清在线| 亚洲成av人**亚洲成av**| 国产精品中文有码| 欧美日韩一区成人| 国产精品美女久久久久久久网站| 亚洲va欧美va天堂v国产综合| 国产又粗又猛又爽又黄91精品| 色婷婷精品大视频在线蜜桃视频| 精品美女一区二区| 午夜精品一区二区三区电影天堂| 国产成人在线影院| 91精品国产91久久久久久最新毛片| 国产精品免费久久| 另类小说综合欧美亚洲| 在线免费观看视频一区| 国产日产精品1区| 久久99国产精品久久99果冻传媒| 色狠狠综合天天综合综合| 国产视频在线观看一区二区三区 | 成人理论电影网| 欧美成人video| 图片区小说区国产精品视频| 成人毛片在线观看| 精品久久久久久久久久久久久久久| 亚洲精品国产一区二区精华液| 国产精品乡下勾搭老头1| 欧美一级搡bbbb搡bbbb| 亚洲mv在线观看| 日本精品一区二区三区四区的功能| 日本一区二区三区国色天香| 九九九精品视频| 日韩一区二区三区在线视频| 亚洲成人激情综合网| 色88888久久久久久影院按摩| 国产精品久久久久国产精品日日 | 在线精品视频一区二区三四| 中文子幕无线码一区tr| 国产一区二区精品久久| 精品裸体舞一区二区三区| 琪琪一区二区三区| 777欧美精品| 石原莉奈在线亚洲二区| 欧美高清视频在线高清观看mv色露露十八 | 久久精品视频网| 国产剧情一区在线| 欧美精品一区二区精品网| 久久国产婷婷国产香蕉|