Spg. til spil
HejSidder 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;
}