Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Tekoäly vectoreille

mika132 [19.01.2011 23:38:47]

#

Eli annan tekoälyni arvot vectoreille ja käytän niitä kisassa. Kuitenkin tämän hetken koodi jää jumiin. Jumittaa pelin.. mitään ei tapahdu.

Debuggasin koodin tulostamalla konsoliin ja semenee kyllä oikein läpi mutta silti peli jää jumiin.

std::vector<Racer::RacersInRace>::iterator kisaa = RacerRace.begin();
while(kisaa != Game::RacerRace.end()){
    kisaa->x_jana = (kisaa->x + std::cos(kisaa->kulma) * kisaa->Ajotaito);
    kisaa->y_jana = (kisaa->y - std::sin(kisaa->kulma) * kisaa->Ajotaito);

    kisaa->x_jana2 = (kisaa->x + std::cos(kisaa->kulma) * kisaa->Hermot);
    kisaa->y_jana2 = (kisaa->y - std::sin(kisaa->kulma) * kisaa->Hermot);
    std::vector<Tracks::TracksBlock>::iterator seinaa = Seinat.begin();
    cout <<"kisaa" << endl;
    while(seinaa != Game::Seinat.end()){
        if (kisaa->x_jana >= seinaa->seinan_x && kisaa->x_jana <= seinaa->seinan_x + seinaa->seinan_leveys) {
            if (kisaa->y_jana >= seinaa->seinan_y && kisaa->y_jana <= seinaa->seinan_y + seinaa->seinan_korkeus) {
                kisaa->Jarruta=true;
            }
        }
        if (kisaa->x_jana >= seinaa->seinan_x+seinaa->poisx && kisaa->x_jana <= seinaa->seinan_x + seinaa->seinan_leveys+50) {
            if (kisaa->y_jana >= seinaa->seinan_y+seinaa->poisy && kisaa->y_jana <= seinaa->seinan_y + seinaa->seinan_korkeus+50) {
                kisaa->Jarruta=false;
            }
        }
        cout <<"seinaa" << endl;
        seinaa++;

    }
    std::vector<Tracks::AIpoint>::iterator aii= aipoint.begin();
    while(aii != Game::aipoint.end()){
        if (kisaa->x_jana2 >= aii->seinan_x && kisaa->x_jana2 <= aii->seinan_x + aii->seinan_leveys) {
            if (kisaa->y_jana2 >= aii->seinan_y && kisaa->y_jana2 <= aii->seinan_y + aii->seinan_korkeus) {
                if (aii->OikeeVasen == 1) {
                    kisaa->kulma = Racer::KaannaAutoaVasemmalle(kisaa->kulma);
                }
                if (aii->OikeeVasen == 2) {
                    kisaa->kulma = Racer::KaannaAutoaOikealle(kisaa->kulma);
                }
            }
        }
        cout <<"aii "<< endl;
        aii++;
    }
    if (TimeLeftSpeed() == 0) {
        if (kisaa->Jarruta == true) {
            if (kisaa->nopeus >= 0.3) {
                kisaa->nopeus-=0.8;
            }
            if (kisaa->nopeus <= 0.2999999) {
                kisaa->nopeus=0.3;
            }
        } else {
            if (kisaa->nopeus >= 3) {
                kisaa->nopeus=3;
            } else {
                kisaa->nopeus+=0.5;
            }
        }
    }
    cout <<"ajo" << endl;
    kisaa->x+=std::cos(kisaa->kulma) * kisaa->nopeus;
    kisaa->y-=std::sin(kisaa->kulma) * kisaa->nopeus;
kisaa++;
}

olisiko mitään vinkkejä?

Metabolix [19.01.2011 23:57:08]

#

Mitään jumittumiseen liittyvää ei näy juuri tuossa. Oletko jotenkin selvittänyt, mihin ohjelma oikeasti jumittuu? Jos et ole, selvitä se heti äläkä arvuuttele muilta. Jos ohjelma ei jumitu tuohon, se varmaankin jumittuu johonkin muualle, joten kannattaa tutkia muutkin osat ohjelmasta.

Lisäksi voisit kirjoittaa ohjelman paljon selvemmin käyttämällä järkevästi funktioita.

Kirjoita tekoälyn toiminta funktioon.

// Tee funktio YHDEN AUTON tekoälyä varten.
void tekoaly(Auto& a) {
    // Täällä siis lasketaan, mitä TÄMÄ YKSI AUTO tekee.
}

Kutsu sitten kyseistä funktiota jokaiselle autolle.

// Tässä käydään läpi kaikki tietokoneen ohjaamat autot.
for (std::vector<Auto>::iterator i = autot.begin(); i != autot.end(); ++i) {
    // Tässä kutsutaan sitä funktiota YHDELLE AUTOLLE.
    tekoaly(*i);
}

C++:n standardikirjaston avulla tuo funktion kutsuminen onnistuu vielä helpommin:

#include <algorithm>

// Tässä kutsutaan funktiota jokaiselle autolle.
std::for_each(autot.begin(), autot.end(), tekoaly);

_Pete_ [19.01.2011 23:57:43]

#

mika132 kirjoitti:

Eli annan tekoälyni arvot vectoreille ja käytän niitä kisassa. Kuitenkin tämän hetken koodi jää jumiin. Jumittaa pelin.. mitään ei tapahdu.

Debuggasin koodin tulostamalla konsoliin ja semenee kyllä oikein läpi mutta silti peli jää jumiin.

olisiko mitään vinkkejä?

Debuggaa oikeassa debuggerissa ja steppaat koodia niin huomaat missä se jää jumiin.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta