Mert Us Matthew Hannay Logan Starr
Dependencies: mbed 4DGL-uLCD-SE
Diff: main.cpp
- Revision:
- 1:cd78922f70fa
- Parent:
- 0:d16cc59110a3
- Child:
- 2:80f1d1056ae4
--- a/main.cpp Mon Nov 07 20:43:45 2022 +0000 +++ b/main.cpp Mon Nov 07 20:47:53 2022 +0000 @@ -1,12 +1,153 @@ -#include "mbed.h" +#include <bitset> + +enum Piece : u_int8_t {e, wK, bK, wQ, bQ, wR, bR, wB, bB, wN, bN, w, b}; + +struct coord { + uint8_t x; + uint8_t y; +} + +class Board { +private: + std::bitset<256> boardState; + const uint32_t BOARD_DARK_COLOR = 0x769656; + const uint32_t BOARD_LIGHT_COLOR = 0xbaca44; + const uint32_t HOVER_COLOR = 0x0000ff; + const uint32_t SELECTED_COLOR = 0xff8800; + + // piece sprites (12 x 12) + uint32_t* spritePawn(bool white, bool light) { + uint32_t X = white ? 0xffffff : 0x000000; + uint32_t _ = light ? BOARD_LIGHT_COLOR : BOARD_DARK_COLOR; + return {_, _, _, _, _, X, X, _, _, _, _, _, + _, _, _, _, X, X, X, X, _, _, _, _, + _, _, _, X, X, X, X, X, X, _, _, _, + _, _, _, X, X, X, X, X, X, _, _, _, + _, _, _, _, X, X, X, X, _, _, _, _, + _, _, _, _, _, X, X, _, _, _, _, _, + _, _, _, _, _, X, X, _, _, _, _, _, + _, _, _, _, X, X, X, X, _, _, _, _, + _, _, _, X, X, X, X, X, X, X, _, _, + _, X, X, X, X, X, X, X, X, X, X, _, + X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X}; + } + + uint32_t* spriteRook(bool white, bool light) { + uint32_t X = white ? 0xffffff : 0x000000; + uint32_t _ = light ? BOARD_LIGHT_COLOR : BOARD_DARK_COLOR; + return {X, _, _, _, _, _, _, _, _, _, _, _, + X, X, X, X, X, X, X, X, X, X, X, X, + X, X, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _}; + } + +public: + std::bitset<256> getBoardState() { + return boardState; + } + + void setBoardState(std::bitset<256> newBoardState) { + boardState = newBoardState; + } -DigitalOut myled(LED1); + // initializes the starting board state + Board() { + placePiece(wR, 0, 0); + placePiece(wN, 0, 1); + placePiece(wB, 0, 2); + placePiece(wQ, 0, 3); + placePiece(wK, 0, 4); + placePiece(wB, 0, 5); + placePiece(wN, 0, 6); + placePiece(wR, 0, 7); + placePiece(bR, 7, 0); + placePiece(bN, 7, 1); + placePiece(bB, 7, 2); + placePiece(bQ, 7, 3); + placePiece(bK, 7, 4); + placePiece(bB, 7, 5); + placePiece(bN, 7, 6); + placePiece(bR, 7, 7); + for (int i = 0; i < 8; i++) { + placePiece(w, 1, i); + placePiece(b, 6, i); + } + } + + // returns the piece at a given location + Piece getPiece(int row, int column) { + return (boardState >> (4 * (column + 8 * row))) & 15u; + } + + /* 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 placePiece(Piece piece, int row, int column) { + boardState = boardState | (piece << (4 * (column + 8 * row))); + } + + /* 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 = (boardState >> (4 * (column + 8 * row))) & 15u; + boardState = boardState & ~(15u << (4 * (column + 8 * row))); + } + + /* 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; + } + + // calculates the advantage difference for the board state + float calculateBoardState() { + return 0.0; + } + + coord getTopLeftOfSquare(int row, int column) { + coord topLeft; + topLeft.x = 16 * column; + topLeft.y = 112 - 16 * row; + } + + // 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() { - while(1) { - myled = 1; - wait(0.2); - myled = 0; - wait(0.2); - } -} + return 0; +} \ No newline at end of file