Io personalmente ho utilizzato nella mia applicazione una enum PieceType per il tipo del pezzo e una semplice variabile booleana white memorizzata nella classe Piece.
Ma non penso che questo aspetto faccia una gran differenza.

Strutturare il resto invece è una bella rogna .

Curiosità : è una traccia che hai trovato in giro o è un compito assegnato da un professore ? Nel secondo caso dovresti farti un'idea di quanto devi "spingerti in profondità" : come ti ha già fatto notare @schumy2000 il testo richiede anche di implementare l'inserimento di mosse, controllare la correttezza della mossa, e aggiornare la scacchiera.

Questo, oltre a implicare l'ovvio fatto che ti devi preoccupare di ogni movimento a seconda del pezzo, pone una serie di problematiche che in un "programma serio" non puoi tralasciare, te ne cito solo alcune :

- Prima di effettuare ogni mossa (o dopo ovviamente) devi controllare che non ci sia una posizione di scacco matto, stallo o una situazione di insufficienza di pezzi che terminerebbe all'istante la partita.
- Oltre alla correttezza della mossa in sé (nel senso che il movimento del pezzo è compatibile con la posizione specificata), dovresti controllare che nell'effettuare il movimento il tuo pezzo non ne incontri altri per strada (ad eccezione del cavallo ovviamente) e che la casella di arrivo non sia occupata da un pezzo di chi muove, o che il re non si sposti in una casella minacciata dall'avversario.
- Anche se la mossa supera il precedente requisito devi assicurarti che compiendo la mossa in questione non si vada a creare una posizione di scacco (per chi muove) o che una eventuale precedente posizione di scacco debba essere rimossa con la mossa corrente.

Non sono cose proprio tanto banali