diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..080e70d --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,10 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ], + "unwantedRecommendations": [ + "ms-vscode.cpptools-extension-pack" + ] +} diff --git a/src/main.cpp b/src/main.cpp index afa9984..7df2ca5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -190,74 +190,74 @@ bool isBoardFull() int8_t scanBoard() { memset(winMask, 0, sizeof(winMask)); - auto check = [&](int c, int r, int dc, int dr) + auto check = [&](int column, int row, int columnOffset, int rowOffset) { - int8_t p = board[c][r]; - if (p != 0 && board[c + dc][r + dr] == p && board[c + 2 * dc][r + 2 * dr] == p && board[c + 3 * dc][r + 3 * dr] == p) + int8_t postion = board[column][row]; + if (postion != 0 && board[column + columnOffset][row + rowOffset] == postion && board[column + 2 * columnOffset][row + 2 * rowOffset] == postion && board[column + 3 * columnOffset][row + 3 * rowOffset] == postion) { - for (int i = 0; i < 4; i++) - winMask[getIdx(c + i * dc, 7 - (r + i * dr))] = true; - return p; + for (int index = 0; index < 4; index++) + winMask[getIdx(column + index * columnOffset, 7 - (row + index * rowOffset))] = true; + return postion; } return (int8_t)0; }; - for (int r = 0; r < 6; r++) - for (int c = 0; c < 4; c++) + for (int row = 0; row < 6; row++) + for (int column = 0; column < 4; column++) { - int8_t res = check(c, r, 1, 0); + int8_t res = check(column, row, 1, 0); if (res) return res; } - for (int r = 0; r < 3; r++) - for (int c = 0; c < 7; c++) + for (int row = 0; row < 3; row++) + for (int column = 0; column < 7; column++) { - int8_t res = check(c, r, 0, 1); + int8_t res = check(column, row, 0, 1); if (res) return res; } - for (int r = 0; r < 3; r++) - for (int c = 0; c < 4; c++) + for (int row = 0; row < 3; row++) + for (int column = 0; column < 4; column++) { - int8_t res = check(c, r, 1, 1); + int8_t res = check(column, row, 1, 1); if (res) return res; } - for (int r = 3; r < 6; r++) - for (int c = 0; c < 4; c++) + for (int row = 3; row < 6; row++) + for (int column = 0; column < 4; column++) { - int8_t res = check(c, r, 1, -1); + int8_t res = check(column, row, 1, -1); if (res) return res; } return 0; } -int minimax(int depth, int alpha, int beta, bool isMax, int8_t aiP, int8_t huP, int8_t rootCol) +int minimax(int depth, int alpha, int beta, bool isMax, int8_t aiPlayer, int8_t humanPlayer, int8_t rootCol) { if (depth >= current_look_ahead - 1) - updateThinkingVisuals(aiP, rootCol); + updateThinkingVisuals(aiPlayer, rootCol); else yield(); // Check for wins within minimax int8_t win = scanBoard(); - if (win == aiP) + if (win == aiPlayer) return 1000 + depth; - if (win == huP) + if (win == humanPlayer) return -1000 - depth; if (depth == 0 || isBoardFull()) return 0; int order[] = {3, 2, 4, 1, 5, 0, 6}; int best = isMax ? -2000 : 2000; - for (int c : order) + for (int column : order) { - int r = getFirstEmptyRow(c); - if (r != -1) + int row = getFirstEmptyRow(column); + if (row != -1) { - board[c][r] = isMax ? aiP : huP; - int val = minimax(depth - 1, alpha, beta, !isMax, aiP, huP, (depth == current_look_ahead ? c : rootCol)); - board[c][r] = 0; + board[column][row] = isMax ? aiPlayer : humanPlayer; + int val = minimax(depth - 1, alpha, beta, !isMax, aiPlayer, humanPlayer, (depth == current_look_ahead ? column : rootCol)); + board[column][row] = 0; if (isMax) { best = max(best, val); @@ -275,48 +275,48 @@ int minimax(int depth, int alpha, int beta, bool isMax, int8_t aiP, int8_t huP, return best; } -void performAiMove(int8_t aiP) +void performAiMove(int8_t aiPlayer) { - int huP = (aiP == 1) ? 2 : 1; + int humanPlayer = (aiPlayer == 1) ? 2 : 1; int bestScore = -30000; int bestCol = 3; int originalPly = current_look_ahead; current_look_ahead = (gameState == DEMO) ? demoPly : getDynamicPly(); - for (int c = 0; c < COLS; c++) + for (int column = 0; column < COLS; column++) { - int r = getFirstEmptyRow(c); - if (r != -1) + int row = getFirstEmptyRow(column); + if (row != -1) { - board[c][r] = aiP; - if (scanBoard() == aiP) + board[column][row] = aiPlayer; + if (scanBoard() == aiPlayer) { - board[c][r] = 0; - bestCol = c; + board[column][row] = 0; + bestCol = column; goto finalize; } - board[c][r] = huP; - if (current_look_ahead >= 2 && scanBoard() == huP) + board[column][row] = humanPlayer; + if (current_look_ahead >= 2 && scanBoard() == humanPlayer) { - board[c][r] = 0; - bestCol = c; + board[column][row] = 0; + bestCol = column; goto finalize; } - board[c][r] = 0; + board[column][row] = 0; } } - for (int c : {3, 2, 4, 1, 5, 0, 6}) + for (int column : {3, 2, 4, 1, 5, 0, 6}) { - int r = getFirstEmptyRow(c); - if (r != -1) + int row = getFirstEmptyRow(column); + if (row != -1) { - board[c][r] = aiP; - int score = minimax(current_look_ahead, -30000, 30000, false, aiP, huP, c); - board[c][r] = 0; + board[column][row] = aiPlayer; + int score = minimax(current_look_ahead, -30000, 30000, false, aiPlayer, humanPlayer, column); + board[column][row] = 0; if (score > bestScore) { bestScore = score; - bestCol = c; + bestCol = column; } } } @@ -328,9 +328,9 @@ void performAiMove(int8_t aiP) } finalize: current_look_ahead = originalPly; - moveDiscToCol(activeCol, bestCol, aiP, 100); + moveDiscToCol(activeCol, bestCol, aiPlayer, 100); delay(450); - animateDrop(bestCol, aiP); + animateDrop(bestCol, aiPlayer); } // --- Web Portal --- @@ -338,9 +338,9 @@ finalize: void handleRoot() { String html = "
" - ""; + ""; html += "