Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > minmax


Автор: kostay 2.12.2008, 03:49
может ктонибудь посмотреть, почему вся вот ета галиматья не пашет?
уте4ки памети меня не волнуют, 
у меня мин всегда -573 если глубина 7, ели 6, то макс всгда -101

asema - доска
siirto - ход
siirra - ходи
annaArvio - оцени

Код

Siirto* Generaattori::MiniMax(Asema* a, int d) {
    Asema* asema = new Asema(*a);
    Siirto* parasSiirto = NULL;
    depth = d;
    int value;
    int maxValue = -10000;
    SiirtoLista* s = new SiirtoLista(asema);

    for(int i=0; i<s->getSiirrot().size(); i++) {
        Siirto* siirto = s->getSiirrot().at(i);
        asema->siirra (siirto->getMistaX(), siirto->getMistaY(), siirto->getMihinX(), siirto->getMihinY());
        value = minMove (asema, 1, -10000, 10000);

        if (value > maxValue) {
            maxValue = value;
            parasSiirto = siirto;
        }
        if(parasSiirto==NULL)
            parasSiirto = siirto;
    }
    return parasSiirto;
}
  
int Generaattori::maxMove (Asema* a, int d, int alpha, int beta){
    Asema* asema = new Asema(*a);

    if (asema->isPeli()==false || d==depth)
        return eva->annaArvio(asema);
    
    int maxValue = 0;
    int value;
    
    SiirtoLista* s = new SiirtoLista(asema);
    
    for(int i=0; i<s->getSiirrot().size(); i++){
        Siirto* siirto = s->getSiirrot().at(i);
        asema->siirra (siirto->getMistaX(), siirto->getMistaY(), siirto->getMihinX(), siirto->getMihinY());
        value = minMove (asema, d+1, alpha, beta);
        std::cout<<"\nMin"<<value<<"\n";

        /*if (value > maxValue) {
            maxValue = value;
        }*/
        if (value > alpha) {
            alpha = value;
        }

        if (alpha > beta) {
            return beta;
        }
    }
    return alpha;
}


int Generaattori::minMove (Asema* a, int d, int alpha, int beta){
    Asema* asema = new Asema(*a);
    
    if (asema->isPeli()==false || d==depth)
        return eva->annaArvio(asema);

    int minValue = 0;
    int value;
    
    SiirtoLista* s = new SiirtoLista(asema);
    
    
    for(int i=0; i<s->getSiirrot().size(); i++){
        Siirto* siirto = s->getSiirrot().at(i);
        asema->siirra (siirto->getMistaX(), siirto->getMistaY(), siirto->getMihinX(), siirto->getMihinY());
        value = maxMove (new Asema(*asema), d+1, alpha, beta);
        std::cout<<"\nMax"<<value<<"\n";

        /*if (value > minValue) {
            minValue = value;
        }*/
        if (value < beta) {
            beta = value;
        }

        if (beta < alpha) {
            return alpha;
        }
    }
    return beta;
}


а вот оценка
Код


int Evaluointi::annaArvio(Asema* asema) {
    int colorKing;
    int enemy, enemyKing;
    int color;

    if (asema->getSiirtoVuoro()==1) {
        color = 1;
        colorKing = 3;
        enemy = 2;
        enemyKing = 4;
    }
    else {
        color=2;
        colorKing = 4;
        enemy = 1;
        enemyKing = 3;
    }

    int colorForce = 0;
    int enemyForce = 0;

    int** _lauta = asema->getAsema();

    for (int i = 0; i < 8;  i++) { 
        for (int j = 0; j < 8;  j++) {
            if(_lauta[i][j] != -1)
                if (_lauta[i][j] == color || _lauta[i][j] == colorKing)
                    colorForce += calculateValue (_lauta[i][j], i, j);
                else
                    enemyForce += calculateValue (_lauta[i][j], i, j);
        }
    }

    return colorForce - enemyForce;
}

int Evaluointi::calculateValue (int piece, int posi, int posj) {
       int value;

       if (piece == 1 )
           if (posi >= 4 && posi <= 7)
               value = 7;
           else
               value = 5;
       else if (piece != 2) 
           if (posi >= 0 && posi <= 3)
               value = 7;
           else
               value = 5;
       else
           value = 10;

       return value * _weight[posi][posj];
   }



вобшем мы как будто в поддавки играем получается, хотя не все ходы глупые
уже кучу времени убил...

Автор: Lycifer 2.12.2008, 13:02
Мне кажется по этому:  100111000110011100110100110000111100011100000001111000111 

Автор: kostay 2.12.2008, 19:48
да всё же понятно, запускаю минмакс, он рекурсивно запускает то мин то макс, ето стандартный алгоритм

вот отка что за фигня у меня происходит

комп должен просчитывать 6 ходов вперёд, тогда мин всегда одно и тоже значение
если на 7 ходов вперёд то макс одно и тоже зна4ение все ходы, макс ето свой ход тоесть компа, мин ето ход соперника, тобиш меня

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)