Avatar billede ahara Nybegynder
12. oktober 2004 - 00:07 Der er 1 løsning

Spg. til spil

Hej

Sidder og har lavet et kryds og bolle spil. Mit problem er det ikke virker efter hensigten. Hvis f.eks. brugeren har 2 på stribe sætter computeren ikke sin brik på den sidste plads så brugeren ikke vinder spillet.

Nogen der kan se hvad der går galt i min minMax funktion "rekursion".

Har siddet med det i en evighed og er løbet totalt tør for ideer :-(

Mvh
AHR

************************
Kode til felt.h
************************
#include<iostream.h>

class Felt
{
    private:
        int nr;
        int vaerdi;
        int brik; //0 for tom, 1 for kryds og 2 for bolle
    public:
        Felt(int nr_x, int vaerdi_x, int brik_x)
        {
            nr=nr_x;
            vaerdi=vaerdi_x;
            brik=brik_x;
        }

        int getVaerdi(){return vaerdi;}

        void setVaerdi(int nyvaerdi){vaerdi=nyvaerdi;}

        int getNr(){return nr;}

        int getBrik(){return brik;}

        void setBrik(int nybrik){brik=nybrik;}

        char udskrivBrik()
        {
            if(brik==0){return ' ';}
           
            else if(brik==1){return 'X';}

            else{return 'O';}
        }
};

************************
Kode til main
************************
#include "Felt.h"

void visSpilleplade(Felt *feltnr)
{
    int i=0;

    while(i<9)
    {
        if(i%3==2){cout<<feltnr[i].udskrivBrik()<<endl;}
        else{cout<<feltnr[i].udskrivBrik();}
        i++;
    }
}

int taelBrikker(Felt *feltnr)
{
    int i=0;
    int counter=0;

    while(i<9)
    {
        if(feltnr[i].getBrik()!=0){counter++;}

        i++;
    }
   
    return counter;
}

int taelVaerdi(Felt *feltnr)
{
    int kryds=0;
    int bolle=0;
    int i=0;
    int sum;
   
    while(i<9)
    {
        if(feltnr[i].getBrik()==1)
        {
            kryds=kryds+feltnr[i].getVaerdi();
        }
        else if(feltnr[i].getBrik()==2)
        {
            bolle=bolle+feltnr[i].getVaerdi();
        }
        i++;
    }

    sum=kryds-bolle;

    return sum;
}

bool tictactoe(Felt *feltnr, int brik)
{
    if(feltnr[0].getBrik()==brik && feltnr[1].getBrik()==brik && feltnr[2].getBrik()==brik){return true;}
    else if(feltnr[3].getBrik()==brik && feltnr[4].getBrik()==brik && feltnr[5].getBrik()==brik){return true;}
    else if(feltnr[6].getBrik()==brik && feltnr[7].getBrik()==brik && feltnr[8].getBrik()==brik){return true;}
    else if(feltnr[0].getBrik()==brik && feltnr[3].getBrik()==brik && feltnr[6].getBrik()==brik){return true;}
    else if(feltnr[1].getBrik()==brik && feltnr[4].getBrik()==brik && feltnr[7].getBrik()==brik){return true;}
    else if(feltnr[2].getBrik()==brik && feltnr[5].getBrik()==brik && feltnr[8].getBrik()==brik){return true;}
    else if(feltnr[0].getBrik()==brik && feltnr[4].getBrik()==brik && feltnr[8].getBrik()==brik){return true;}
    else if(feltnr[2].getBrik()==brik && feltnr[4].getBrik()==brik && feltnr[6].getBrik()==brik){return true;}
    else{return false;}
}

int minMax(Felt *feltnr, int tur, int dybde)
{
    int value=0;
    int brikker=0;
    int vaerdi=0;
    int ttt=tictactoe(feltnr,2);

    if(ttt==true)
    {
        return 1000;
    }

    if(dybde==0) //Husk andre muligheder
    {
        value=taelVaerdi(feltnr);
        return value;
    }

    else if(tur==true) //Max
    {
        tur=false;
        int v, felt, old;
        int value=-1000;
       
        while(dybde>0)
        {
            dybde--;
            while(brikker<9)
            {
                if(feltnr[brikker].getBrik()==0)
                {
                    old=feltnr[brikker].getBrik();
                    feltnr[brikker].setBrik(1);
                   
                    v=minMax(feltnr, tur, dybde);
                   
                    if(v>value)
                    {
                        value=v;
                        felt=feltnr[brikker].getNr();
                    }
                    feltnr[brikker].setBrik(old);
                }
                brikker++;
            }
        }
        return felt;
    }

    else if(tur==false) //Min
    {
        tur=true;
        int v, felt, old;
        int value=1000;
       
        while(dybde>0)
        {
            dybde--;
            while(brikker<9)
            {
                if(feltnr[brikker].getBrik()==0)
                {
                    old=feltnr[brikker].getBrik();
                    feltnr[brikker].setBrik(2);

                    v=minMax(feltnr, tur, dybde);

                    if(v<value)
                    {
                        value=v;
                        felt=feltnr[brikker].getNr();
                    }
                    feltnr[brikker].setBrik(old);
                }
                brikker++;
            }
        }
        return felt;
    }
}

int main()
{
    //Felt (feltnr - værdi - brik(0 for tom, 1 for kryds og 2 for bolle))
    Felt feltnr[9]=
    {
        Felt(0,3,0),
        Felt(1,2,0),
        Felt(2,3,0),
        Felt(3,2,0),
        Felt(4,4,0),
        Felt(5,2,0),
        Felt(6,3,0),
        Felt(7,2,0),
        Felt(8,3,0)
    };

    int valg, cp;
    int brikker=0;
    int dybde=2;
    int kryds=1;
    int bolle=2;
    bool ttt=false;
    bool tur=true;

    while(brikker<5 && ttt==false)
    {
        cout<<"Indtast felt valg: ";
        cin>>valg;
        feltnr[valg].setBrik(bolle);
        ttt=tictactoe(feltnr, bolle);

        if(brikker<4 && ttt==false)
        {
            //Her skal tjekkes for 2 på stribe
            cp=minMax(feltnr, tur, dybde);
            feltnr[cp].setBrik(kryds);
            ttt=tictactoe(feltnr, kryds);
        }

        visSpilleplade(feltnr);
        brikker++;
    }

    return 0;
}
Avatar billede ahara Nybegynder
25. januar 2006 - 12:51 #1
?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester