下五子棋的bot 五子棋演算法

2021-09-25 01:07:29 字數 4222 閱讀 2367

#include#include#include#include#include#include "jsoncpp/json.h" // c++編譯時預設包含此庫  

#define n 7 //每個節點的分支數

//以下為各棋型的識別碼 //權重

#define win 1 //4000

#define lose 2 //-4000

#define flex4 3 //2000

#define flex4 4 //-2000

#define block4 5 //1000

#define block4 6 //-1000

#define flex3 7 //1000

#define flex3 8 //-1000

#define block3 9 //400

#define block3 10 //-600

#define flex2 11 //400

#define flex2 12 //-600

#define block2 13 //100

#define block2 14 //-150

#define flex1 15 //100

#define flex1 16 //-150

using namespace std;

using namespace json;

char board[15][15]; //當前棋盤

//給棋盤board[15][15]賦值

void placeat(int x,int y,int d)

//複製棋盤a到b

int copy_board(char a[15][15],char b[15][15])

} return 0;

}//複製取反後的棋盤a到b

int inv_board(char a[15][15],char b[15][15]);

for(i=0;i<15;i++) }

return 0;

}//棋型辨識陣列

int score[3][3][3][3][3][3];

//給棋型辨識陣列賦值

int init_score()

}//白衝四

else if(x==0&&y==4||ix==0&&iy==4)

}//黑眠三

else if(x==3&&y==0||ix==3&&iy==0)

}//白眠三

else if(x==0&&y==3||ix==0&&iy==3)

}//黑眠二

else if(x==2&&y==0||ix==2&&iy==0)

}//白眠二

else if(x==0&&y==2||ix==0&&iy==2)}}

}}

}} }

return 0;

}struct evaluation

;//對棋盤a的局勢進行評分

struct evaluation evaluate(char a[15]);

int i,j,s;

int stat[4][17]=;

int stat[17];

struct evaluation evaluation;

//棋型統計

/* 0 1 2 ... 14

1 2. .

. 14

*/ for(i=0;i<15;i++) }

for(j=0;j<15;j++) }

for(i=0;i<10;i++) }

for(i=5;i<15;i++) }

s=0;

//初步評分累加

for(i=1;i<17;i++)

evaluation.result=0; //記錄當前棋局的結果,沒有人 勝出則為 0.

//勝

if(stat[1]>0)

//負

else if(stat[2]>0)

//對手衝

四、活四

else if(stat[4]>0||stat[6]>0)

//對手無衝

四、活四

else if(stat[4]==0&&stat[6]==0)

}}

//活四

if(stat[3]>0)

//雙衝四

else if(stat[5]>=2)

//衝四活三

else if(k>0)

//對手有活三

else if(stat[8]>0&&stat[5]==0)

//雙活三

else if(stat[7]>=2&&stat[8]==0)

}evaluation.score=s;

return evaluation;

}struct points

;//評估出最佳的n個待定落子點

struct points seek_points(char a[15]);

for(k=0;k0)

}} }

for(i=0;i<15;i++)

if(j-k>=0&&j-k<15)

}if(j+k>=0&&j+k<15)}}

} }//對於棋盤a上的空點,評估在該處落子後的局勢

for(i=0;i<15;i++)

}} int w;

//篩選最佳的n個點

for(k=0;kw)

}} //best_points.eva[0]是評估的n個裡的最高收益,-w>3000,可以結束,因為收益已經很小

if( (k>0) && ((best_points.eva[0]-w)>3000) ) break;

best_points.eva[k]=w;

best_points.exi[k]=1;

worth[best_points.coo_x[k]][best_points.coo_y[k]]=-1000000; }

the_end:

return best_points;

}struct decision

;//全域性變數-記錄決策的落子位置

struct decision decision;

int level_limit=6;

//博弈樹minmax遞迴分析 alphabeta剪枝

int analyse(char a[15],int level,int alpha,int beta)

else if(level%2==0)}}

//剪枝策略

if(beta<=alpha) break;

} return alpha; }

else if(level%2==1)

//換手後下的子

for (int i = 2; i < turnnum_rsp; i++)

placeat(input["requests"][turnnum_rsp]["x"].asint(),input["requests"][turnnum_rsp]["y"].asint(),2);

} //未達第六回合或未換手

else

placeat(input["requests"][turnnum_rsp]["x"].asint(),input["requests"][turnnum_rsp]["y"].asint(),2);

} }//己方先手

else

//換手後下的子

for (int i = 2; i < turnnum_rsp; i++)

placeat(input["requests"][turnnum_rsp]["x"].asint(),input["requests"][turnnum_rsp]["y"].asint(),2);

} //未達到第五回合或未換手

else

placeat(input["requests"][turnnum_rsp]["x"].asint(),input["requests"][turnnum_rsp]["y"].asint(),2);

} }value ret;

if(start())

else if(input["requests"][zero]["x"] != -1&&turnid == 1)

else

} else

fastwriter writer;

cout

}

窮舉五子棋

本想窮舉五子棋必勝點,可惜呀,這貨窮舉太不現實了,寫出來了,根本沒辦法執行出來結果 include include include define rl 17 char s 14 int five rl rl void init void void print void int cs int i,in...

普通 五子棋

五子棋 五子棋是世界智力運動會競技專案之一,是一種兩人對弈的純策略型棋類遊戲,是世界智力運動會競技專案之一,通常雙方分別使用黑白兩色的棋子,下在棋盤直線與橫線的交叉點上,先形成5子連線者獲勝。棋具與圍棋通用,起源於中國上古時代的傳統黑白棋種之一。主要流行於華人和漢字文化圈的國家以及歐美一些地區,是世...

網路五子棋

最近空限,完成之前未完成的網路五子棋,它是面向tcp協議通訊協議,通訊協議及效果如下 package cn.com.client public class protocol img tcp協議提供了一種可靠的資料傳輸服務,它是一種面向連線的資料傳輸協議。在資料傳輸之前,通訊節點之間必須建立起連線。為...