codice:
#include <iostream>
using namespace std;
class ChessPiece
{
public:
ChessPiece(){color=-2;type=' ';}
int color; //0 black 1white
char type;//p:pawn b:bishop r:Rook q:queen k:king n:knight
virtual int move(int i,int j,ChessPiece ** game){cout<<endl<<"No Piece moving"<<endl; return -1; }
};
class King : public ChessPiece
{
public:
King::King(char k);
int move(int i,int j,ChessPiece ** game);
};
class Pawn : public ChessPiece
{
public:
Pawn::Pawn(char p);
virtual int move(int i,int j,ChessPiece ** game);
};
class Rook : virtual public ChessPiece
{
public:
Rook::Rook(){}
Rook::Rook(char r);
virtual int move(int i,int j,ChessPiece ** game);
};
class Bishop : virtual public ChessPiece
{
public:
Bishop::Bishop(){}
Bishop::Bishop(char b);
virtual int move(int i,int j,ChessPiece ** game);
};
class Knight : public ChessPiece
{
public:
Knight::Knight(char n);
virtual int move(int i,int j,ChessPiece ** game);
};
class Queen : public Rook, public Bishop
{
public:
Queen::Queen(char p);
int move(int i,int j,ChessPiece ** game);
};
ChessPiece ** Game(char ** cGame);
int check(ChessPiece ** game);
#include "header.h"
#include <string>
using namespace std;
ChessPiece ** Game(char ** cGame)
{
ChessPiece ** game;
game=new ChessPiece *[8];
for(int i=0;i<=7;i++)
{
game[i]=new ChessPiece[8];
for(int j=0;j<=7;j++)
{
char piece=cGame[i][j];
switch(piece)
{
case 'k':
{
game[i][j]= King(piece);
break;
}
case 'K':
{
game[i][j]= King(piece);
break;
}
case 'q':
{
game[i][j]= Queen(piece);
break;
}
case 'Q':
{
game[i][j]= Queen(piece);
break;
}
case 'b':
{
game[i][j]= Bishop(piece);
break;
}
case 'B':
{
game[i][j]= Bishop(piece);
break;
}
case 'r':
{
game[i][j]= Rook(piece);
break;
}
case 'R':
{
game[i][j]= Rook(piece);
break;
}
case 'n':
{
game[i][j]= Knight(piece);
break;
}
case 'N':
{
game[i][j]= Knight(piece);
break;
}
case 'p':
{
game[i][j]= Pawn(piece);
break;
}
case 'P':
{
game[i][j]= Pawn(piece);
break;
}
case '.':
{
game[i][j]= ChessPiece();
break;
}
}
}
}
return game;
}
int check(ChessPiece ** game)
{
int loser=-1;
for(int i=0;i<=7 && loser==-1;i++)
{
for(int j=0;j<=7 && loser==-1;j++)
{
if(game[i][j].color!=-2)
loser=game[i][j].move(i,j,game);
}
}
return loser;
}
#include "stdafx.h"
#include "header.h"
#include <string>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
char ** cGame ;
string s1="..k.....ppp.pppp.........R...B..................PPPPPPPPK.......";
int i=0;
cGame=new char *[8];
for (int w=0;w<=7;w++)
{
cGame[w]=new char[8];
for(int k=0;k<=7;k++)
{
cGame[w][k]=s1[i];
cout<<cGame[w][k];
i++;
}
cout<<endl;
}
i=0;
cout<<endl;
ChessPiece ** game=Game(cGame);
for (int w=0;w<=7;w++)
{
for(int k=0;k<=7;k++)
{
cout<<"("<<game[w][k].type<<","<<game[w][k].color<<")";
i++;
}
cout<<endl;
}
int loser=check(game);
switch(loser)
{
case -1:{cout<<"Game #d: no king is in check."<<endl; break;}
case 0:{cout<<"Game #d: black king is in check."<<endl; break;}
case 1:{cout<<"Game #d: white king is in check."<<endl; break;}
default :{cout<<"prob"<<endl; break;}
}
cout<<loser<<endl;
int a=0;
cin>>a;
return 0;
}
Credo che comunque, come ho scritto in precedenza , il problema stia nella prima porzione di codice che ho postato e in particolare sulla chiamata di move(). Ho fatto delle prove e scrivendo :
PieceChess * p=new King('k');
int loser=p.move(i,j,game);
funziona tutto.
Invece evidentemente nei metodi check() e game() faccio qualcosa di diverso, ma non capisco bene cosa.
Scrivendo
codice:
ChessPiece ** game;
game=new ChessPiece *[8];
for(int i=0;i<=7;i++)
{
game[i]=new ChessPiece[8];
for(int j=0;j<=7;j++)
{
char piece=cGame[i][j];
game[i][j]= King(piece);
break;
}
}
int loser=game[0][0].move(0,0,game);
Cosa cambia rispetto a :
PieceChess * p=new King('k');
int loser=p.move(i,j,game);