📄 main.cpp
字号:
} 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 + -