[refactor] Renamed all single letter variables to more meaningfull names.
This commit is contained in:
Vendored
+10
@@ -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"
|
||||
]
|
||||
}
|
||||
+54
-54
@@ -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 ---
|
||||
@@ -446,7 +446,7 @@ void loop()
|
||||
{
|
||||
if (gameState >= 2 || gameState == DEMO)
|
||||
{
|
||||
for (int i = 0; i < 10; i++)
|
||||
for (int index = 0; index < 10; index++)
|
||||
{
|
||||
fadeToBlackBy(leds, NUM_LEDS, 32);
|
||||
FastLED.show();
|
||||
@@ -528,8 +528,8 @@ void loop()
|
||||
{
|
||||
if (menuMode < 2)
|
||||
{
|
||||
int8_t aiP = (menuMode == 0) ? 2 : 1;
|
||||
performAiMove(aiP);
|
||||
int8_t aiPlayer = (menuMode == 0) ? 2 : 1;
|
||||
performAiMove(aiPlayer);
|
||||
winnerPlayer = scanBoard();
|
||||
if (winnerPlayer != 0)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user