Statusbars for stront tamagotchi game
This commit is contained in:
commit
dbc6e8c548
16
.vscode/c_cpp_properties.json
vendored
Normal file
16
.vscode/c_cpp_properties.json
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
{
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Linux",
|
||||
"includePath": [
|
||||
"${workspaceFolder}/**"
|
||||
],
|
||||
"defines": [],
|
||||
"compilerPath": "/usr/bin/clang",
|
||||
"cStandard": "c17",
|
||||
"cppStandard": "c++17",
|
||||
"intelliSenseMode": "linux-clang-x64"
|
||||
}
|
||||
],
|
||||
"version": 4
|
||||
}
|
135
strontgame.ino
Normal file
135
strontgame.ino
Normal file
@ -0,0 +1,135 @@
|
||||
#include <Wire.h>
|
||||
#include <Adafruit_SSD1306.h>
|
||||
|
||||
// OLED display size
|
||||
#define SCREEN_WIDTH 128
|
||||
#define SCREEN_HEIGHT 64
|
||||
|
||||
// Create display object
|
||||
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
|
||||
|
||||
// Pin assignments
|
||||
#define FEED_BUTTON_PIN 2
|
||||
#define POOP_BUTTON_PIN 3
|
||||
|
||||
// Game constants
|
||||
#define MAX_FOOD 100
|
||||
#define MAX_POOP 100
|
||||
#define FOOD_BAR_Y 0
|
||||
#define POOP_BAR_Y 8
|
||||
#define BAR_HEIGHT 7
|
||||
#define BAR_WIDTH 120
|
||||
#define BAR_X 4
|
||||
#define BAR_LABEL_X 0
|
||||
#define BAR_LABEL_WIDTH 4
|
||||
#define YELLOW_BAR_HEIGHT 16
|
||||
|
||||
// Game state
|
||||
int food = MAX_FOOD / 2;
|
||||
int poop = MAX_POOP / 2;
|
||||
bool gameOver = false;
|
||||
unsigned long lastUpdate = 0;
|
||||
const unsigned long updateInterval = 1000; // ms
|
||||
|
||||
void drawBars() {
|
||||
// Draw yellow background for status area
|
||||
display.fillRect(0, 0, SCREEN_WIDTH, YELLOW_BAR_HEIGHT, SSD1306_WHITE);
|
||||
// Draw Food bar label (F)
|
||||
display.setTextColor(SSD1306_BLACK);
|
||||
display.setCursor(BAR_LABEL_X, FOOD_BAR_Y);
|
||||
display.print("F");
|
||||
// Draw Poop bar label (P)
|
||||
display.setCursor(BAR_LABEL_X, POOP_BAR_Y);
|
||||
display.print("P");
|
||||
// Draw Food bar
|
||||
int foodBarLen = (food * BAR_WIDTH) / MAX_FOOD;
|
||||
display.fillRect(BAR_X, FOOD_BAR_Y, foodBarLen, BAR_HEIGHT, SSD1306_BLACK);
|
||||
display.drawRect(BAR_X, FOOD_BAR_Y, BAR_WIDTH, BAR_HEIGHT, SSD1306_BLACK);
|
||||
// Draw Poop bar
|
||||
int poopBarLen = (poop * BAR_WIDTH) / MAX_POOP;
|
||||
display.fillRect(BAR_X, POOP_BAR_Y, poopBarLen, BAR_HEIGHT, SSD1306_BLACK);
|
||||
display.drawRect(BAR_X, POOP_BAR_Y, BAR_WIDTH, BAR_HEIGHT, SSD1306_BLACK);
|
||||
}
|
||||
|
||||
void drawGameOver(const char* message) {
|
||||
display.clearDisplay();
|
||||
display.setTextColor(SSD1306_WHITE);
|
||||
display.setCursor(0, 24);
|
||||
display.setTextSize(1);
|
||||
display.println("GAME OVER!");
|
||||
display.println(message);
|
||||
display.display();
|
||||
}
|
||||
|
||||
void setup() {
|
||||
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
|
||||
while (true); // Don't proceed, loop forever
|
||||
}
|
||||
pinMode(FEED_BUTTON_PIN, INPUT_PULLUP);
|
||||
pinMode(POOP_BUTTON_PIN, INPUT_PULLUP);
|
||||
display.clearDisplay();
|
||||
drawBars();
|
||||
display.display();
|
||||
lastUpdate = millis();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
if (gameOver) return;
|
||||
// Handle buttons (active LOW)
|
||||
bool feedPressed = digitalRead(FEED_BUTTON_PIN) == LOW;
|
||||
bool poopPressed = digitalRead(POOP_BUTTON_PIN) == LOW;
|
||||
static bool lastFeedPressed = false;
|
||||
static bool lastPoopPressed = false;
|
||||
|
||||
// Feed button: increase food, increase poop a bit
|
||||
if (feedPressed && !lastFeedPressed) {
|
||||
food += 15;
|
||||
if (food > MAX_FOOD) food = MAX_FOOD;
|
||||
poop += 5;
|
||||
if (poop > MAX_POOP) poop = MAX_POOP;
|
||||
}
|
||||
// Poop button: decrease poop
|
||||
if (poopPressed && !lastPoopPressed) {
|
||||
poop -= 20;
|
||||
if (poop < 0) poop = 0;
|
||||
}
|
||||
lastFeedPressed = feedPressed;
|
||||
lastPoopPressed = poopPressed;
|
||||
|
||||
// Food decreases, poop increases over time
|
||||
if (millis() - lastUpdate > updateInterval) {
|
||||
lastUpdate = millis();
|
||||
food--;
|
||||
if (food < 0) food = 0;
|
||||
if (food > 0) poop++;
|
||||
if (poop > MAX_POOP) poop = MAX_POOP;
|
||||
}
|
||||
|
||||
// Check game over conditions
|
||||
if (food == 0) {
|
||||
gameOver = true;
|
||||
drawGameOver("Starved!");
|
||||
return;
|
||||
}
|
||||
if (food == MAX_FOOD) {
|
||||
gameOver = true;
|
||||
drawGameOver("Overate! Exploded!");
|
||||
return;
|
||||
}
|
||||
if (poop == MAX_POOP) {
|
||||
gameOver = true;
|
||||
drawGameOver("Poop explosion!");
|
||||
return;
|
||||
}
|
||||
if (poop == 0) {
|
||||
gameOver = true;
|
||||
drawGameOver("Constipation!");
|
||||
return;
|
||||
}
|
||||
|
||||
// Redraw bars
|
||||
display.clearDisplay();
|
||||
drawBars();
|
||||
display.display();
|
||||
delay(50);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user