Mert Us Matthew Hannay Logan Starr
Dependencies: mbed 4DGL-uLCD-SE
main.cpp
- Committer:
- mhannay3
- Date:
- 2022-11-11
- Revision:
- 5:b553c51b3b85
- Parent:
- 4:5798e4062350
- Child:
- 6:1c4dd5e24b8d
File content as of revision 5:b553c51b3b85:
#include "mbed.h" #include "uLCD_4DGL.h" uLCD_4DGL uLCD(p28,p27,p30); // serial tx, serial rx, reset pin; enum Piece {e, wK, bK, wQ, bQ, wR, bR, wB, bB, wN, bN, w, b}; struct coord { uint8_t x; uint8_t y; }; class BoardState { private: Piece array[64]; public: // calculates the advantage difference for the board state float calculateBoardState() { return 0.0; } // returns the piece at a given location Piece getPiece(int row, int column) { return array[column + 8 * row]; } // puts a piece at a given location void placePiece(Piece piece, int row, int column) { array[column + 8 * row] = piece; } /* removes a piece from the set position of the board returns the bit representation of the piece */ Piece removePiece(int row, int column) { Piece removedPiece = array[column + 8 * row]; array[column + 8 * row] = e; return removedPiece; } /* moves a piece from one position to another returns the captured piece */ Piece movePiece(int startRow, int startColumn, int endRow, int endColumn) { Piece movingPiece = removePiece(startRow, startColumn); Piece capturedPiece = removePiece(endRow, endColumn); placePiece(movingPiece, endRow, endColumn); return capturedPiece; } }; class GameBoard { private: BoardState boardState; static const int BOARD_DARK_COLOR = 0x769656; static const int BOARD_LIGHT_COLOR = 0xbaca44; static const int HOVER_COLOR = 0x0000ff; static const int SELECTED_COLOR = 0xff8800; // piece sprites (12 x 12) static void spritePawn(bool white, bool light, int* spriteArray) { int X = white ? 0xffffff : 0x000000; int _ = light ? BOARD_LIGHT_COLOR : BOARD_DARK_COLOR; int sprite[144] = {_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, X, X, _, _, _, _, _, _, _, _, _, X, X, X, X, _, _, _, _, _, _, _, _, X, X, X, X, _, _, _, _, _, _, _, _, _, X, X, _, _, _, _, _, _, _, _, _, _, X, X, _, _, _, _, _, _, _, _, _, X, X, X, X, _, _, _, _, _, _, X, X, X, X, X, X, X, X, _, _, _, _, X, X, X, X, X, X, X, X, _, _ }; memcpy(sprite, spriteArray, sizeof(sprite)); } static void spriteRook(bool white, bool light, int* spriteArray) { int X = white ? 0xffffff : 0x000000; int _ = light ? BOARD_LIGHT_COLOR : BOARD_DARK_COLOR; int sprite[144] = {X, X, _, X, X, _, _, X, X, _, X, X, X, X, _, X, X, _, _, X, X, _, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, _, X, X, X, _, X, X, _, X, X, X, _, _, X, X, X, _, X, X, _, X, X, X, _, _, _, X, X, _, X, X, _, X, X, _, _, _, _, X, X, _, X, X, _, X, X, _, _, _, _, X, X, _, X, X, _, X, X, _, _, _, X, X, X, X, X, X, X, X, X, X, _, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X }; memcpy(sprite, spriteArray, sizeof(sprite)); } static void spriteKnight(bool white, bool light, int* spriteArray) { int X = white ? 0xffffff : 0x000000; int _ = light ? BOARD_LIGHT_COLOR : BOARD_DARK_COLOR; int sprite[144] = {_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, X, X, _, X, X, _, _, _, _, _, _, _, X, X, _, X, X, _, _, _, _, _, X, X, X, X, X, X, _, _, _, _, _, X, X, X, X, X, _, X, _, _, _, _, _, X, X, X, X, X, X, X, _, _, _, _, _, _, _, _, X, X, X, X, _, _, _, _, _, _, _, X, X, X, X, X, _, _, _, _, _, _, X, X, X, X, X, X, X, _, _, _, _, X, X, X, X, X, X, X, X, _, _, _, X, X, X, X, X, X, X, X, X, X, _, _, X, X, X, X, X, X, X, X, X, X, _ }; memcpy(sprite, spriteArray, sizeof(sprite)); } static void spriteBishop(bool white, bool light, int* spriteArray) { int X = white ? 0xffffff : 0x000000; int _ = light ? BOARD_LIGHT_COLOR : BOARD_DARK_COLOR; int sprite[144] = {_, _, _, _, _, X, X, _, _, _, _, _, _, _, _, _, X, X, X, _, _, _, _, _, _, _, _, X, X, X, _, _, X, _, _, _, _, _, _, X, X, _, _, X, X, _, _, _, _, _, _, X, X, X, X, X, X, _, _, _, _, _, _, _, X, X, X, X, _, _, _, _, _, _, _, _, _, X, X, _, _, _, _, _, _, _, _, _, X, X, X, X, _, _, _, _, _, _, _, X, X, X, X, X, X, _, _, _, _, _, _, X, X, X, X, X, X, _, _, _, _, _, X, X, X, X, X, X, X, X, _, _, _, _, X, X, X, X, X, X, X, X, _, _ }; memcpy(sprite, spriteArray, sizeof(sprite)); } static void spriteQueen(bool white, bool light, int* spriteArray) { int X = white ? 0xffffff : 0x000000; int _ = light ? BOARD_LIGHT_COLOR : BOARD_DARK_COLOR; int sprite[144] = {_, _, _, _, _, X, X, _, _, _, _, _, _, _, X, _, _, X, X, _, _, X, _, _, X, _, X, X, _, X, X, _, X, X, _, X, X, _, X, X, _, X, X, _, X, X, _, X, X, _, X, X, _, X, X, _, X, X, _, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, _, X, X, X, X, X, X, _, X, X, X, X, X, X, _, X, X, _, X, X, X, X, _, X, X, X, X, X, X, X, X, X, X, _, _, _, X, X, X, X, X, X, X, X, _, _, _, X, X, X, X, X, X, X, X, X, X, _ }; memcpy(sprite, spriteArray, sizeof(sprite)); } static void spriteKing(bool white, bool light, int* spriteArray) { int X = white ? 0xffffff : 0x000000; int _ = light ? BOARD_LIGHT_COLOR : BOARD_DARK_COLOR; int sprite[144] = {_, _, _, _, _, X, X, _, _, _, _, _, _, _, _, _, _, X, X, _, _, _, _, _, _, _, _, X, X, X, X, X, X, _, _, _, _, _, _, X, X, X, X, X, X, _, _, _, X, X, _, _, _, X, X, _, _, _, X, X, X, X, X, X, _, X, X, _, X, X, X, X, X, _, X, X, X, X, X, X, X, X, _, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, _, X, X, X, X, _, X, X, X, _, X, X, X, X, X, X, X, X, X, X, _, _, _, X, X, X, _, _, X, X, X, _, _, _, X, X, X, X, X, X, X, X, X, X, _ }; memcpy(sprite, spriteArray, sizeof(sprite)); } public: BoardState getBoardState() { return boardState; } void setBoardState(BoardState newBoardState) { boardState = newBoardState; } // initializes the starting board state GameBoard() { // draw board for (int row = 0; row < 8; row++) { for (int column = 0; column < 8; column++) { uint64_t color; if ((row + column) % 2 == 0) { color = BOARD_DARK_COLOR; } else { color = BOARD_LIGHT_COLOR; } coord tl = getTopLeftOfSquare(row, column); uLCD.filled_rectangle(tl.x, tl.y, tl.x + 15, tl.y + 15, color); } } // draw pieces placePieceAndDraw(wR, 0, 0); placePieceAndDraw(wN, 0, 1); placePieceAndDraw(wB, 0, 2); placePieceAndDraw(wQ, 0, 3); placePieceAndDraw(wK, 0, 4); placePieceAndDraw(wB, 0, 5); placePieceAndDraw(wN, 0, 6); placePieceAndDraw(wR, 0, 7); placePieceAndDraw(bR, 7, 0); placePieceAndDraw(bN, 7, 1); placePieceAndDraw(bB, 7, 2); placePieceAndDraw(bQ, 7, 3); placePieceAndDraw(bK, 7, 4); placePieceAndDraw(bB, 7, 5); placePieceAndDraw(bN, 7, 6); placePieceAndDraw(bR, 7, 7); for (int i = 0; i < 8; i++) { placePieceAndDraw(w, 1, i); placePieceAndDraw(b, 6, i); } } // gets the pixel coordinates of the top left of the square coord getTopLeftOfSquare(int row, int column) { coord topLeft; topLeft.x = 16 * column; topLeft.y = 112 - 16 * row; return topLeft; } // PIECE MOVEMENT AND GRAPHICS FUNCTIONS // returns the piece at a given location Piece getPiece(int row, int column) { return boardState.getPiece(row, column); } /* puts the bit representation of a piece at the set position of the board assumes that the position of the board is emptied beforehand */ void placePieceAndDraw(Piece piece, int row, int column) { boardState.placePiece(piece, row, column); coord tl = getTopLeftOfSquare(row, column); int sprite[144]; switch(piece) { case wK: case bK: spriteKing(piece==wK, (row+column)%2, sprite); break; case wQ: case bQ: spriteQueen(piece==wQ, (row+column)%2, sprite); break; case wB: case bB: spriteBishop(piece==wB, (row+column)%2, sprite); break; case wN: case bN: spriteKing(piece==wN, (row+column)%2, sprite); break; case wR: case bR: spriteKing(piece==wR, (row+column)%2, sprite); break; case w: case b: spriteKing(piece==w, (row+column)%2, sprite); break; } uLCD.BLIT(tl.x + 2, tl.y + 2, 12, 12, sprite); } /* removes a piece from the set position of the board returns the bit representation of the piece */ Piece removePieceAndDraw(int row, int column) { Piece removedPiece = boardState.removePiece(row, column); coord tl = getTopLeftOfSquare(row, column); uint64_t color; if ((row + column) % 2 == 0) { color = BOARD_DARK_COLOR; } else { color = BOARD_LIGHT_COLOR; } uLCD.filled_rectangle(tl.x+2, tl.y+2, tl.x + 13, tl.y + 13, color); return removedPiece; } /* moves a piece from one position to another returns the captured piece */ Piece movePieceAndDraw(int startRow, int startColumn, int endRow, int endColumn) { Piece movingPiece = removePieceAndDraw(startRow, startColumn); Piece capturedPiece = boardState.removePiece(endRow, endColumn); placePieceAndDraw(movingPiece, endRow, endColumn); return capturedPiece; } // SQUARE BORDER GRAPHICS FUNCTIONS // removes selection border around square void unselectSquare(int row, int column) { coord tl = getTopLeftOfSquare(row, column); uint64_t color; if ((row + column) % 2 == 0) { color = BOARD_DARK_COLOR; } else { color = BOARD_LIGHT_COLOR; } uLCD.rectangle(tl.x, tl.y, tl.x + 15, tl.y + 15, color); } void hoverSquare(int row, int column) { coord tl = getTopLeftOfSquare(row, column); uLCD.rectangle(tl.x, tl.y, tl.x + 15, tl.y + 15, HOVER_COLOR); } // draws selection border around square void selectSquare(int row, int column) { coord tl = getTopLeftOfSquare(row, column); uLCD.rectangle(tl.x, tl.y, tl.x + 15, tl.y + 15, SELECTED_COLOR); } }; int main() { return 0; }