C - minimax与zobrist没有发送正确的玩家执行

时间:2017-02-13 12:53:08

标签: c artificial-intelligence hashtable alpha-beta-pruning minmax

我尝试使用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(&current,ToString(beta));
              return current;
            }
            else
            {
              concat(&current,ToString(alpha));
              return current;
            }
        }
    }
    if (player==-1)
    {
      concat(&current,ToString(beta));
      return current;
    }
    else
    {
      concat(&current,ToString(alpha));
      return current;
    }
}`
PS:正如我所提到的,我是一名初学者,所以如果您发现任何错误或者我的代码或任何建议可以做得更好,请告诉我。

0 个答案:

没有答案