PDA

View Full Version : سوال: طریقه پیاده سازی الگوریتم minimax با c++



Rezvane.R
یک شنبه 08 بهمن 1391, 11:57 صبح
سلام .
من برنامه tic tac toe رو به روش minimax نوشتم ولی درست کار نمی کنه . کسی می دونه مشکل برنامه ام کجاست ؟



#include<iostream>
#include <conio.h>
#include<ctime>
using namespace std;
class MinMax
{
public:
char a[9];
char b[9];
int VALUE;
int TURN ;
int DEPTH;
void set( int i){
TURN=i;
}

MinMax()
{
int i;
for(i=0;i<10;i++)
{
a[i]=0;
b[i]=0;
}

VALUE=0;
}
void MaxMove();
void MinMove();
void display();
char evaluate();
int evaluation(char *);
void process();

};

int MinMax::evaluation(char *a)
{
int i,VAL=0;
for(i=0;i<9;i++)
{
if(*(a+i)=='X')
{
if(i==4)
{
VAL+=100;
}
if((i==0)||(i==2)||(i==6)||(i==8))
{
VAL+=50;
}
if((i==1)||(i==3)||(i==5)||(i==7))
{
VAL+=10;
}
}
else
{
if(i==4)
{
VAL-=100;
}
if((i==0)||(i==2)||(i==6)||(i==8))
{
VAL-=50;
}
if((i==1)||(i==3)||(i==5)||(i==7))
{
VAL-=10;
}
}
}
return VAL;
}

void MinMax::MaxMove()
{
int x;
cout << " Enter your move :( between 1 to 9)" << endl << endl;
cin >> x;
x--;
if(a[x]!=0)
{
cout << " !!! sorry !!!! there is full , Try again..." << endl;
MaxMove();
}
else
a[x]='X';
TURN=2;
}
void MinMax::MinMove()
{
int index;
for(int i=0;i<9;i++)
{
if(a[i] == 0)
{
b[i]='O';
if(evaluation(b)<VALUE)
{
VALUE=evaluation(b);
index=i;
}
b[i]=0;
}
}
a[index]='O';
TURN=1;
}
void MinMax::display()
{

cout << endl;
for(int t=0;t<9;t++)
{
cout <<" "<< a[t] <<" |" << a[t+1]<< " |" << a[t+2];
t+=2;
if(t!=8)
cout << endl << "-------|-------|-------" << endl;
}
cout << endl;

}
char MinMax::evaluate()
{
int c=0;
for(int i=0; i<7; i++) /* Check Rows */
{
if(a[i]==a[i+1] && a[i+1]==a[i+2])
return a[i];
i+=2;
}
for(int i=0; i<3; i++) /* Check Columns */
{
if(a[i]==a[i+3] && a[i+3]==a[i+6])
return a[i];
}
if(a[0]==a[4] && a[4]==a[8]) /* Test Diagonals */
return a[0];

if(a[2]==a[4] && a[4]==a[6]) /* Test Diagonals */
return a[2];

for(int i=0;i<9;i++)
{
if(a[i]!=' ')
c++;
}
if(c==9)
return 'D';
return ' ';
}
void MinMax::process()
{
char ch;
do
{
if(TURN==1)
{
MaxMove();
TURN=2;
}
else
{
MinMove();
TURN=1;
}
display();
cout << endl;
ch=evaluate();
if(ch=='X')
{
display();
cout << endl;
cout <<"*** YOU WON ***"<< endl;
getch();
exit(0);
}
if(ch=='O')
{
display();
cout << endl;
cout <<"computer won !!!! !!"<< endl;
exit(0);
}
if(ch=='D')
{
display();
cout << endl;
cout <<" this play don't have Winner!!"<< endl;
exit(0);
}
}
while(ch==0);
}
int main()
{
int a=0;
MinMax play;
cout<<" tic tac toe \n ************************\n\n";
cout<<" you frist or computer ??? (you:1 | com:2) \n";
cin>>a;
if (a==1){
play.set(1);
}
else
{
play.set(2);
}
play.process();
return 0;
}