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 :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; }
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
Cosa cambia rispetto a :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);
PieceChess * p=new King('k');
int loser=p.move(i,j,game);

Rispondi quotando