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

📄 main.cpp

📁 象棋
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	}	value = Eval();	if (value >= beta) return value; if (value > alpha) alpha = value;	if (!GenCapture()) {		if (!IsInCheck(side)) return value;		if (!Gen()) return -1000+ply;	}	if (follow_pv) Check_pv(); Sort(); best = -INFINITY;	for (i=gen_begin[ply];i<gen_end[ply] && best<beta && (clock()-tickstart)<=MOVETIME; i++) {		if (best > alpha) alpha = best;		if (MakeMove(gen_dat[i].m)) value = 1000-ply;		else value = -Quiescence(-beta, -alpha);		UnMakeMove();		if (value > best) {			best = value; pv[ply] = gen_dat[i].m;		}	}	return best;}short CChessAI::AlphaBeta(short alpha, short beta, short depth){	short i, value, best;	if (!depth) return Quiescence(alpha, beta);	if(!Gen()) return -1000+ply;	if (follow_pv) Check_pv(); Sort();	best = -INFINITY;	for (i=gen_begin[ply]; i<gen_end[ply] && best<beta; i++) {		if (best > alpha) alpha = best;		if (MakeMove(gen_dat[i].m)) value = 1000-ply;		else value = -AlphaBeta(-beta, -alpha, depth-1);		UnMakeMove();		if (value > best) {			history[gen_dat[i].m.from][gen_dat[i].m.dest] = depth;			pv[ply] = gen_dat[i].m;			best = value; if (!ply) newmove = gen_dat[i].m;		}	}	return best;}CChessAI::CChessAI(){  capbrandtotal = 0;  capgencount = 0;  brandtotal = 0;  gencount = 0;  book = NULL;  ReadingBook=true;  memcpy(color,aicolor,sizeof(color));  memcpy(piece,aipiece,sizeof(aipiece));  memcpy(materialnumber,aimaterialnumber,sizeof(aimaterialnumber));  memcpy(pointtable,aipointtable,sizeof(aipointtable));  memcpy(offset,aioffset,sizeof(aioffset));  memcpy(mailbox182,aimailbox182,sizeof(aimailbox182));  memcpy(mailbox90,aimailbox90,sizeof(aimailbox90));  memcpy(legalposition,ailegalposition,sizeof(ailegalposition));  memcpy(maskpiece,aimaskpiece,sizeof(aimaskpiece));  memcpy(knightcheck,aiknightcheck,sizeof(aiknightcheck));  memcpy(elephancheck,aielephancheck,sizeof(aielephancheck));  memcpy(kingpalace,aikingpalace,sizeof(aikingpalace));}void CChessAI::ComputerThink(void){	short best, i;	tickstart = clock(); nodecount = 0;	pv[0].from = -1;	memset(&history, 0, sizeof(history));	newmove.from = -1;	for (i=1; i<=MAX_PLY; i++) {		follow_pv = 1;		best = AlphaBeta(-INFINITY, INFINITY, i);	}	/* Display some information */	tickend = clock(); //textcolor(7);	//gotoxy(50, 4); printf("Depth            : %d", MAX_PLY);	//gotoxy(50, 5); printf("Node total       : %ld ", nodecount);	//gotoxy(50, 6); printf("Brand factor     : %.2f ", (float)brandtotal/gencount);	//gotoxy(50, 7); printf("Time (second)    : %.2f ", (tickend-tickstart)/18.23);	//gotoxy(50, 8); printf("Nodes per second : %ld ", (long)(nodecount*18.23/(tickend-tickstart+1)));	//gotoxy(50, 9); printf("Score            : %d ", best);	//gotoxy(50,11); 	//printf("Computer move    : %c%d%c%d \n", (char)(newmove.from%SIZE_X+65), (short)(SIZE_X-newmove.from/SIZE_X),	//     (char)(newmove.dest%SIZE_X+65), (short)(SIZE_X-newmove.dest/SIZE_X));	//	gotoxy(50,13); printf("Quiescen depth   : %d  ", mply);	//gotoxy(50,14); printf("Quie brand factor: %.2f ", (float)capbrandtotal/capgencount);}short CChessAI::UpdateNewMove(void){	short from, dest, p;	from = newmove.from; dest = newmove.dest; p = piece[dest];	if (from==-1) return 1;	if (p != EMPTY) materialnumber[side][p]--;	piece[dest] = piece[from]; piece[from] = EMPTY;	color[dest] = color[from]; color[from] = EMPTY;	return p == KING;}void CChess::DrawCell(short pos, short mode){    int piece_char[] = {6,5,4,3,2,1,0};//"PBENCRK+"; /* the piece letters */  int col;  if (AiRed){	  if (ai->color[pos]==REDSIDE) col=0;  	    else col=1;  }  else{	  if (ai->color[pos]==REDSIDE) col=1;  	    else col=0;  }  //if (mode==NORMAL) textbackground(0); else textbackground(1);  int x=pos%9;  int y=pos/9;  //MoveTo(pos%9, pos/9);  //cprintf("%c", piece_char[piece[pos]]);*/  if (ai->piece[pos] != 7){    if ((Moving) && (MoveQizi==pos)){      masked_stretch_blit(qizi,active_page,piece_char[ai->piece[pos]]*54,col*54,54,54,			  FromX,FromY,QIZI_WIDTH,QIZI_WIDTH);    }    else{      masked_stretch_blit(qizi,active_page,piece_char[ai->piece[pos]]*54,col*54,54,54,			  PX+x*QIZI_WIDTH,PY+y*QIZI_WIDTH,QIZI_WIDTH,QIZI_WIDTH);    }  }}void CChess::DrawBoard(){  /*  for (int i=0;i<10;i++){    int CurY=i*QIZI_WIDTH+QIZI_WIDTH/2;    line(active_page, PX+QIZI_WIDTH/2,PY+CurY,PX+PAN_WIDTH*QIZI_WIDTH - QIZI_WIDTH/2, PY+CurY,0);  }     line(active_page,PX+QIZI_WIDTH/2,PY+QIZI_WIDTH/2, PX+QIZI_WIDTH/2, PY+PAN_HEIGHT*QIZI_WIDTH - QIZI_WIDTH/2,0);  line(active_page,PX+PAN_WIDTH*QIZI_WIDTH-QIZI_WIDTH/2,PY+QIZI_WIDTH/2, PX+PAN_WIDTH*QIZI_WIDTH-QIZI_WIDTH/2,        PY+PAN_HEIGHT*QIZI_WIDTH - QIZI_WIDTH/2,0);    for (int i=1;i<8;i++){    int CurX=i*QIZI_WIDTH+QIZI_WIDTH/2;    line(active_page,PX+CurX,PY+QIZI_WIDTH/2,PX+CurX, PY+5*QIZI_WIDTH - QIZI_WIDTH/2,0);    line(active_page,PX+CurX,PY+6*QIZI_WIDTH - QIZI_WIDTH/2,PX+CurX, PY+10*QIZI_WIDTH - QIZI_WIDTH/2,0);  }  line(active_page,PX+4*QIZI_WIDTH - QIZI_WIDTH/2,PY+QIZI_WIDTH/2 ,PX+6*QIZI_WIDTH - QIZI_WIDTH/2, PY+3*QIZI_WIDTH - QIZI_WIDTH/2,0);  line(active_page,PX+6*QIZI_WIDTH - QIZI_WIDTH/2,PY+QIZI_WIDTH/2 ,PX+4*QIZI_WIDTH - QIZI_WIDTH/2, PY+3*QIZI_WIDTH - QIZI_WIDTH/2,0);  line(active_page,PX+4*QIZI_WIDTH - QIZI_WIDTH/2,PY+10*QIZI_WIDTH - QIZI_WIDTH/2 ,PX+6*QIZI_WIDTH - QIZI_WIDTH/2, PY+8*QIZI_WIDTH - QIZI_WIDTH/2,0);  line(active_page,PX+6*QIZI_WIDTH - QIZI_WIDTH/2,PY+10*QIZI_WIDTH - QIZI_WIDTH/2 ,PX+4*QIZI_WIDTH - QIZI_WIDTH/2, PY+8*QIZI_WIDTH - QIZI_WIDTH/2,0);  */    for (int i=0; i<BOARD_SIZE; i++) DrawCell(i, NORMAL);}void CChess::Update(){  int pan = 128;  int pitch = 1000;  if (State != 1) return;  if (Moving){    if ((FromX != ToX) || (FromY != ToY)){      if (ToX>FromX) { 	FromX+=3;	if (FromX>ToX) FromX=ToX;      }      if (ToX<FromX) {	FromX-=3;	if (ToX>FromX) FromX=ToX;      }      if (ToY>FromY) {	FromY+=3;	if (FromY>ToY) FromY=ToY;      }      if (ToY<FromY){	FromY-=3;	if (ToY>FromY) FromY=ToY;      }    }    else {      Moving=false;            if ((!AiTurn) && (ai->ReadingBook)){      	for (int i=0; i<4; i++) {			ai->ss[i][ai->nm] = ai->SymmetricConvert(ai->newmove.from, i);			ai->ss[i][ai->nm+1] = ai->SymmetricConvert(ai->newmove.dest, i);		}		ai->nm += 2;      }      if (ai->UpdateNewMove()){	State=2;	if (!AiTurn){	  Lose++;	}	else{	  Win++;	}	return;      }      if ((ai->IsInCheck(BLACKSIDE)) || (ai->IsInCheck(REDSIDE))){	play_sample(jiang, 255, pan, pitch, false);      }      AiTurn = !AiTurn;      ai->side = ai->xside; ai->xside = 1-ai->xside;      if (AiTurn){	ai->NextStep();	Moving=true;	MoveQizi = ai->newmove.from;	FromX = PX+ai->newmove.from % 9 *QIZI_WIDTH;	FromY = PY+ai->newmove.from / 9 *QIZI_WIDTH;	ToX = PX+ai->newmove.dest % 9 *QIZI_WIDTH;	ToY = PY+ai->newmove.dest / 9 *QIZI_WIDTH;		      }      else{	ai->Gen();	if (ai->gen_end[ai->ply] - ai->gen_begin[ai->ply] == 0){	  Lose++;	  State=2;	}	Selected=false;	}    }  }}bool CChess::ProcInput(int keycode){  switch (keycode >> 8){  case KEY_F2:    {    	if ((State==1)&&(!AiTurn)){    		State = 2;    		Friend++;    	}    }  	break;  case KEY_ENTER:    if ((State==0) || (State==2)){            if (ai) delete(ai);      ai = new (CChessAI);      AiRed = !AiRed;      AiTurn = AiRed;      HumenMoveTag=49;      ai->InitGame(AiRed);      Selected =false;      if (AiRed) {	Moving=true;	MoveQizi = ai->newmove.from;	FromX = PX+ai->newmove.from % 9 *QIZI_WIDTH;	FromY = PY+ai->newmove.from / 9 *QIZI_WIDTH;	ToX = PX+ai->newmove.dest % 9 *QIZI_WIDTH;	ToY = PY+ai->newmove.dest / 9 *QIZI_WIDTH;	      }      else{	Moving =false;      }      State=1;    }    else {      if (!AiTurn){	if (!Selected){	  if (ai->color[HumenMoveTag]==ai->side) {	    Selected = true; from = HumenMoveTag;	  }	}	else{	  int i,t = HumenMoveTag;	  if (ai->color[t]==ai->side) {	    from = t; 	  } else {	    ai->newmove.from = from; ai->newmove.dest = t;	    for (i=ai->gen_begin[ai->ply]; i<ai->gen_end[ai->ply]; i++){	      if (ai->gen_dat[i].m.from==ai->newmove.from && ai->gen_dat[i].m.dest==ai->newmove.dest){		HumenMoveTag=49;		Moving=true;		MoveQizi = ai->newmove.from;		FromX = PX+ai->newmove.from % 9 *QIZI_WIDTH;		FromY = PY+ai->newmove.from / 9 *QIZI_WIDTH;		ToX = PX+ai->newmove.dest % 9 *QIZI_WIDTH;		ToY = PY+ai->newmove.dest / 9 *QIZI_WIDTH;					from = -1;	      }	    }	  }	}      }    }    return true;  case KEY_UP:    if ((!AiTurn) &&(HumenMoveTag>=9)) HumenMoveTag-=9;    return true;  case KEY_DOWN:    if ((!AiTurn) &&(HumenMoveTag<(BOARD_SIZE-9))) HumenMoveTag+=9;    return true;  case KEY_LEFT:    if ((!AiTurn) &&(HumenMoveTag>0)) HumenMoveTag-=1;    return true;  case KEY_RIGHT:    if ((!AiTurn) &&(HumenMoveTag<(BOARD_SIZE-1))) HumenMoveTag+=1;    return true;  }  return false;}void CChess::DrawFromSelectTag(){  if (from<0) return;  int x=from%9;  int y=from/9;  rect(active_page,PX+x*QIZI_WIDTH,PY+y*QIZI_WIDTH,PX+(x+1)*QIZI_WIDTH,PY+(y+1)*QIZI_WIDTH,makecol(255,0,0));  rect(active_page,PX+x*QIZI_WIDTH+1,PY+y*QIZI_WIDTH-1,PX+(x+1)*QIZI_WIDTH-1,PY+(y+1)*QIZI_WIDTH+1,makecol(255,0,0));  rect(active_page,PX+x*QIZI_WIDTH+2,PY+y*QIZI_WIDTH-2,PX+(x+1)*QIZI_WIDTH-2,PY+(y+1)*QIZI_WIDTH+2,makecol(255,0,0));}void CChess::DrawHumenMoveTag(){  int x=HumenMoveTag%9;  int y=HumenMoveTag/9;  rect(active_page,PX+x*QIZI_WIDTH,PY+y*QIZI_WIDTH,PX+(x+1)*QIZI_WIDTH,PY+(y+1)*QIZI_WIDTH,makecol(255,0,0));  rect(active_page,PX+x*QIZI_WIDTH+1,PY+y*QIZI_WIDTH-1,PX+(x+1)*QIZI_WIDTH-1,PY+(y+1)*QIZI_WIDTH+1,makecol(255,0,0));  rect(active_page,PX+x*QIZI_WIDTH+2,PY+y*QIZI_WIDTH-2,PX+(x+1)*QIZI_WIDTH-2,PY+(y+1)*QIZI_WIDTH+2,makecol(255,0,0));}void CChess::Draw(){  blit(bg, active_page, 0, 0, 0, 0, bg->w, bg->h);  //clear_to_color(active_page,makecol(255,255,255));  if (State>0){    DrawBoard();    if ((!AiTurn)&&(!Moving)){      DrawHumenMoveTag();      DrawFromSelectTag();    }  }  textprintf_ex(active_page, font, 642, 168, 0, -1,		"%d", Win);  textprintf_ex(active_page, font, 642, 213, 0, -1,		"%d", Lose);  textprintf_ex(active_page, font, 642, 261, 0, -1,		"%d", Friend);  }bool CChess::Init(){  ai=NULL;  State = 0;  Win=Lose=Friend=0;  Moving=false;  data = load_datafile("big.dat");  if (!data) {    set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);    allegro_message("Cannot find unifont.dat in current directory.\n");    return 1;  }  font = (FONT*)data[0].dat;  qizi = load_bitmap("qizi.bmp",NULL);  bg = load_bitmap("xqbg.bmp",NULL);  jiang = load_sample("jiang.wav");  if (!jiang){    printf("Error load wav\n");  }  AiRed=false;  return true;}void CChess::Quit(){  if (ai) delete(ai);  if (data) unload_datafile(data);  destroy_bitmap(qizi);  destroy_bitmap(bg);  destroy_sample(jiang);}AIHOME_START(CChess)/*int main(){  CChessAI ai;  ai.Readbook();  return 0;  }*/

⌨️ 快捷键说明

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