/* LCD Coin Collecting Minigame for Arduino Uno by Nova */ #include LiquidCrystal lcd(12, 11, 5, 4, 3, 2); byte coinL[8] = { B01110, B11111, B00000, B11111, B01110, B00000, B00000, B00000, }; byte coinLM[8] = { B01110, B11111, B00000, B11111, B01110, B00000, B01110, B11111, }; byte coinML[8] = { B00000, B00000, B00000, B00000, B00000, B00000, B01110, B11111, }; byte coinR[8] = { B00000, B00000, B00000, B01110, B11111, B00000, B11111, B01110, }; byte coinRM[8] = { B11111, B01110, B00000, B01110, B11111, B00000, B11111, B01110, }; byte coinMR[8] = { B11111, B01110, B00000, B00000, B00000, B00000, B00000, B00000, }; byte playerML[8] = { B00000, B00000, B00000, B00000, B00000, B00000, B00000, B01100, }; byte playerMR[8] = { B01100, B00000, B00000, B00000, B00000, B00000, B00000, B00000, }; byte empty[8] = { B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, }; bool coins[4][3]; unsigned long nextCoinTime = 0; unsigned long coinTimeBuffer = 1000; bool buttonLPressed = false; bool buttonRPressed = false; int playerPosition = 1; int score = 0; void setup() { lcd.begin(16, 2); lcd.createChar(byte(0), playerML); // Setup custom characters lcd.createChar(1, coinL); lcd.createChar(2, coinLM); lcd.createChar(3, coinML); lcd.createChar(4, coinR); lcd.createChar(5, coinRM); lcd.createChar(6, coinMR); lcd.createChar(7, playerMR); analogWrite(6, 26); // Set LCD contrast pinMode(7, INPUT_PULLUP); // Setup buttons pinMode(8, INPUT_PULLUP); } void loop() { if(millis() > nextCoinTime) { moveCoins(); spawnCoins(); updateCoinDisplay(); nextCoinTime = millis() + coinTimeBuffer; } movePlayer(); updatePlayerDisplay(); collectCoins(); } void moveCoins() { for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) coins[i][j] = coins[i+1][j]; } } void spawnCoins() { bool twoCoins = random(1,3) > 1; int randomPosition = random(0,3); for(int i = 0; i < 3; i++) coins[3][i] = (i == randomPosition) ^ (twoCoins); } void updateCoinDisplay() { for(int i = 0; i < 4; i++) { updateCoinRow(i); } } void updateCoinRow(int i) { lcd.setCursor(i+1, 0); if(coins[i][0] && coins[i][1]) lcd.write(2); else if(coins[i][0]) lcd.write(1); else if(coins[i][1]) lcd.write(3); else lcd.write(' '); lcd.setCursor(i+1, 1); if(coins[i][2] && coins[i][1]) lcd.write(5); else if(coins[i][2]) lcd.write(4); else if(coins[i][1]) lcd.write(6); else lcd.write(' '); } void movePlayer() { if(digitalRead(7)) { buttonLPressed = false; } else if(!buttonLPressed) { buttonLPressed = true; playerPosition--; } if(digitalRead(8)) { buttonRPressed = false; } else if(!buttonRPressed) { buttonRPressed = true; playerPosition++; } } void updatePlayerDisplay() { if(playerPosition < 1) { playerPosition = 0; lcd.setCursor(0, 0); lcd.write(B00100111); lcd.setCursor(0, 1); lcd.write(' '); } else if(playerPosition > 1) { playerPosition = 2; lcd.setCursor(0, 0); lcd.write(' '); lcd.setCursor(0, 1); lcd.write(B00101100); } else { lcd.setCursor(0, 0); lcd.write(byte(0)); lcd.setCursor(0, 1); lcd.write(7); } } void collectCoins() { if(coins[0][playerPosition]) { score++; coins[0][playerPosition] = false; updateCoinRow(0); updateScore(); } } void updateScore() { lcd.setCursor(8, 0); lcd.print(score); }