我尝试使用alpha-beta修剪和zobrist哈希为鲍鱼游戏(作为初学者)实现minimax,然后添加哈希表一切正常(没有奇怪的行为和没有分段错误)。 现在问题是执行的移动,有时是针对错误的玩家执行的。我不知道如何或为什么
eval_board()
是我的评价函数。
AvailableMoves()
生成一串字符,其中包含当前播放器的所有可能移动。
concat()
负责处理2个字符串的连接
StringToMove()
和MoveToString
:将包含移动数据的数组转换为字符串,反之亦然。
score[hash_id]
是存储哈希的表,它是一个全局变量
在main中被malloced,我在每次移动后将每个值重新分配给""
。
score=(char**)malloc(1948*sizeof(char*));
for(f=0;f<1948;f++)
score[f]=(char*)malloc(25*sizeof(char));
for(f=0;f<1948;f++)
sprintf(score[f],"");
这是我的代码
`char* alphaBeta(int8_t deptG,int8_t dept, int16_t alpha, int16_t beta,char* current,int8_t player)
{
int16_t eval=eval_board();
char* moves= AvailableMoves(player);
int hash_id = hashZobrist();
if(strcmp(score[hash_id],"") && strcmp(substr(current,0,16),substr(score[hash_id],0,16)))
{
return score[hash_id];
}
if (dept==0 || (int16_t)strlen(moves)==0)
{
sprintf(score[hash_id],"%s",current);
concat(&score[hash_id],ToString(eval));
return score[hash_id];
}
int16_t i=0;
for (i=0;i<(int16_t)strlen(moves);i+=16)
{
execute_move(StringToMove(substr(moves,i,16)),player);
char* returnString = alphaBeta(deptG,dept-1, alpha, beta,substr(moves,i,16), player*(-1));
int16_t value = atoi(substr(returnString,16,(int16_t)strlen(returnString)-16));
undo(StringToMove(substr(moves,i,16)),player);
if (player==-1){
if (value<=beta)
{
beta=value;
if (dept==deptG)
{
current=malloc(sizeof(char)*16);
sprintf(current,"%s",substr(returnString,0,16));
}
}
}
else
{
if (value>alpha)
{
alpha=value;
if(dept==deptG)
{
current=malloc(sizeof(char)*16);
sprintf(current,"%s",substr(returnString,0,16));
}
}
}
if (alpha>=beta)
{
if (player==-1)
{
concat(¤t,ToString(beta));
return current;
}
else
{
concat(¤t,ToString(alpha));
return current;
}
}
}
if (player==-1)
{
concat(¤t,ToString(beta));
return current;
}
else
{
concat(¤t,ToString(alpha));
return current;
}
}`
PS:正如我所提到的,我是一名初学者,所以如果您发现任何错误或者我的代码或任何建议可以做得更好,请告诉我。