Task Develop a program to play the game Reversi on a computer. The design of the program shall make it possible to implement computer players of different strength. However only one (very simple) player is required for the project Implementation The program uses several classes. Each class must have its own source code and header file. Equip the header files with include guards. The following types classes and functions must be implemented. . Piece Piece is an enumeration type that represents the possible contents of a square on the board. A possible definition is enum Piece (LIGHT, DARK, EMPTY) . Piece can be defined in the header file of the Board class. Move The program represents moves by a single integer number. This number is the index of square where the new piece is placed in the board array. Move is therefore a typedef that defines Move as an appropriate integer type. NullMove NullMove is a named constant of type Move that represents a special value. It is used when a player has no legal move. Task Develop a program to play the game Reversi on a computer. The design of the program shall make it possible to implement computer players of different strength. However only one (very simple) player is required for the project Implementation The program uses several classes. Each class must have its own source code and header file. Equip the header files with include guards. The following types classes and functions must be implemented. . Piece Piece is an enumeration type that represents the possible contents of a square on the board. A possible definition is enum Piece (LIGHT, DARK, EMPTY) . Piece can be defined in the header file of the Board class. Move The program represents moves by a single integer number. This number is the index of square where the new piece is placed in the board array. Move is therefore a typedef that defines Move as an appropriate integer type. NullMove NullMove is a named constant of type Move that represents a special value. It is used when a player has no legal move