Josh Bruce Online

Brainrottle - Gen Z Slang Wordle Game Documentation

Overview

“Brainrottle” is a modern, culturally-relevant word-guessing game inspired by Wordle, specifically featuring “brainrot” terminology and Gen Z slang. The game combines classic word puzzle mechanics with contemporary internet culture, emoji support, and multi-word phrase challenges.

Technical Architecture

Core Technologies

File Structure

brainrot/
├── index.html    # Complete self-contained game application
└── words.txt     # Optional external word list file

Game Mechanics

Core Gameplay Features

// Game configuration constants
let maxGuesses = 6;              // Standard Wordle format
let currentRow = 0;              // Current guess attempt
let gameOver = false;            // Game state management
let tileMap = {};                // Maps tile positions to elements

Multi-Word Support System

// Advanced phrase handling
todaysWordArray = todaysWord.split(' ');  // Support for multi-word phrases

// Complex tile mapping for word groups
todaysWordArray.forEach((word, wordIndex) => {
    const wordGroup = document.createElement('div');
    wordGroup.className = 'word-group';
    
    // Handle each character including emojis
    const wordChars = Array.from(word);  // Proper emoji support
});

Sophisticated Word Selection Algorithm

// Date-based deterministic word selection
function getWordForToday(words) {
    const today = new Date();
    const year = today.getFullYear();
    const month = today.getMonth() + 1;
    const day = today.getDate();
    
    // Complex hash function using multiple mathematical operations
    let hash = year * 73 + month * 31 + day * 17;
    hash = (hash * hash) % 1000000;
    hash = Math.floor(Math.sin(hash) * 10000);
    hash = Math.abs(hash);
    
    // Additional string-based mixing for consistency
    const dateString = `${year}${month}${day}`;
    for (let i = 0; i < dateString.length; i++) {
        hash = ((hash << 5) - hash) + dateString.charCodeAt(i);
        hash = hash & hash;  // 32-bit integer conversion
    }
    
    return words[Math.abs(hash) % words.length];
}

Cultural Word System

Default Brainrot Vocabulary

// Curated Gen Z slang and internet culture terms
wordList = [
    'brucey',          // Personal reference
    'skibidi',         // Viral meme reference
    'rizz',            // Charisma/charm slang
    'ohio',            // Surreal/weird reference
    'sigma',           // Alpha male terminology
    'based',           // Authentic/correct opinion
    'bussin',          // Excellent/delicious
    'no cap',          // No lie/truth
    'fr fr',           // For real, for real
    'its giving',      // It resembles/suggests
    'slay, queen!',    // Encouragement/praise
    'vibes 🔥🔥',      // Good feelings with fire emojis
    'mood 💔',         // Relatable feeling with broken heart
    'spill tea 🗣🗣'   // Share gossip with speaking emojis
];

External Word Loading

// Dynamic word list loading with error handling
async function loadWords() {
    try {
        const response = await fetch('words.txt');
        if (response.ok) {
            const text = await response.text();
            wordList = text.split('\n').filter(word => word.trim());
            if (wordList.length === 0) wordList = ['brucey'];  // Fallback
        }
    } catch (e) {
        console.log('Could not load words.txt, using default');
        // Falls back to hardcoded brainrot vocabulary
    }
}

Advanced Character Support

Emoji Integration System

// Multi-byte character handling for emojis
function isPunctuation(char) {
    // Explicitly exclude game emojis from punctuation treatment
    if (['💔', '🥀', '🔥', '🗣'].includes(char)) {
        return false;
    }
    return /[.,!?;:'"'\-–—]/.test(char);
}

// Proper emoji handling in input processing
const guessArray = Array.from(currentGuess);  // Handles multi-byte characters
const fullWordArray = Array.from(todaysWord.replace(/[\s.,!?;:'"'\-–—]/g, ''));

Special Character Keyboard

<!-- Emoji keyboard row for brainrot expressions -->
<div class="keyboard-row">
    <button class="key emoji" data-key="💔">💔</button>  <!-- Heartbreak -->
    <button class="key emoji" data-key="🥀">🥀</button>  <!-- Dead rose -->
    <button class="key emoji" data-key="🔥">🔥</button>  <!-- Fire/lit -->
    <button class="key emoji" data-key="🗣">🗣</button>  <!-- Speaking/gossip -->
</div>

Visual Design System

Dark Mode Aesthetic

/* Modern dark theme color palette */
body {
    background: #121213;        /* Deep dark background */
    color: #ffffff;             /* High contrast text */
    font-family: 'Clear Sans', 'Helvetica Neue', Arial, sans-serif;
}

/* Wordle-inspired tile colors */
.tile.correct {
    background: #538d4e;        /* Green for correct placement */
    border-color: #538d4e;
}

.tile.present {
    background: #b59f3b;        /* Yellow for wrong placement */
    border-color: #b59f3b;
}

.tile.absent {
    background: #3a3a3c;        /* Dark gray for absent letters */
    border-color: #3a3a3c;
}

Responsive Tile System

/* Adaptive tile sizing for various screen sizes */
.tile {
    width: 62px;
    height: 62px;
    border: 2px solid #3a3a3c;
    font-size: 32px;
    font-weight: bold;
    transition: all 0.2s;
}

/* Special punctuation tiles */
.tile.punctuation {
    width: 20px;                /* Narrow width for punctuation */
    height: 62px;
    font-size: 24px;
    border: none;
    color: #818384;             /* Muted color */
    margin: 0 -2px;             /* Tight spacing */
}

Advanced Animation System

Tile Interaction Animations

/* Pop animation for letter entry */
@keyframes pop {
    50% { transform: scale(1.1); }
}

.tile.filled {
    animation: pop 0.1s ease-in-out;
}

/* Flip animation for guess evaluation */
@keyframes flip {
    0% { transform: rotateX(0); }
    50% { transform: rotateX(90deg); }
    100% { transform: rotateX(0); }
}

.tile.correct, .tile.present, .tile.absent {
    animation: flip 0.5s ease-in-out;
}

Row Shake Animation

// Dynamic shake animation for invalid guesses
function shakeRow() {
    const row = document.getElementById(`row-${currentRow}`);
    row.style.animation = 'shake 0.5s';
    setTimeout(() => {
        row.style.animation = '';
    }, 500);
}

// CSS shake keyframes
@keyframes shake {
    10%, 90% { transform: translateX(-1px); }
    20%, 80% { transform: translateX(2px); }
    30%, 50%, 70% { transform: translateX(-4px); }
    40%, 60% { transform: translateX(4px); }
}

Game Logic Engine

Advanced Guess Validation

function checkGuess() {
    // Clean word processing (remove punctuation and spaces)
    const fullWordArray = Array.from(todaysWord.replace(/[\s.,!?;:'"'\-–—]/g, ''));
    const guessArray = Array.from(currentGuess);
    
    // Case-insensitive comparison while preserving emojis
    const fullWordUpper = fullWordArray.map(char => 
        char.match(/[a-z]/i) ? char.toUpperCase() : char
    );
    const guessUpper = guessArray.map(char => 
        char.match(/[a-z]/i) ? char.toUpperCase() : char
    );
    
    // Length validation
    if (guessArray.length !== fullWordArray.length) {
        showMessage('Not enough letters');
        shakeRow();
        return;
    }
}

Letter Frequency Analysis

// Sophisticated letter counting for accurate feedback
const letterCount = {};
for (let letter of fullWordUpper) {
    letterCount[letter] = (letterCount[letter] || 0) + 1;
}

// Two-pass algorithm for correct vs present determination
const result = new Array(fullWordUpper.length).fill('absent');

// First pass: mark exact matches
for (let i = 0; i < fullWordUpper.length; i++) {
    if (guessUpper[i] === fullWordUpper[i]) {
        result[i] = 'correct';
        letterCount[guessUpper[i]]--;  // Reduce available count
    }
}

// Second pass: mark present letters
for (let i = 0; i < fullWordUpper.length; i++) {
    if (result[i] === 'absent' && letterCount[guessUpper[i]] > 0) {
        result[i] = 'present';
        letterCount[guessUpper[i]]--;
    }
}

Input Management System

Multi-Modal Input Support

// Keyboard event handling
document.addEventListener('keydown', (e) => {
    if (e.key === 'Enter' || e.key === 'Backspace') {
        handleKeyPress(e.key);
    } else if (e.key.match(/^[a-zA-Z0-9]$/)) {
        handleKeyPress(e.key);
    }
});

// Direct emoji input support
document.addEventListener('input', (e) => {
    if (e.data && ['💔', '🥀', '🔥', '🗣'].includes(e.data)) {
        handleKeyPress(e.data);
    }
});

// On-screen keyboard clicks
document.querySelectorAll('.key').forEach(key => {
    key.addEventListener('click', () => {
        let keyValue = key.dataset.key;
        if (keyValue === '🗣️') keyValue = '🗣';  // Normalize emoji variants
        handleKeyPress(keyValue);
    });
});

Smart Backspace Handling

// Multi-byte character backspace (emoji-aware)
if (key === 'Backspace') {
    const chars = Array.from(currentGuess);  // Proper emoji handling
    chars.pop();                             // Remove last character
    currentGuess = chars.join('');
    updateBoard();
}

Statistics and Persistence

Comprehensive Stats Tracking

// Persistent statistics with fallback
let memoryStats = {played: 0, won: 0, streak: 0, maxStreak: 0};

function updateStats(won) {
    let stats;
    try {
        // Try localStorage first
        stats = JSON.parse(localStorage.getItem('brainrottleStats') || 
               '{"played":0,"won":0,"streak":0,"maxStreak":0}');
    } catch (e) {
        // Fallback to in-memory stats for sandboxed environments
        stats = {...memoryStats};
    }
    
    stats.played++;
    if (won) {
        stats.won++;
        stats.streak++;
        stats.maxStreak = Math.max(stats.streak, stats.maxStreak);
    } else {
        stats.streak = 0;  // Reset streak on loss
    }
    
    // Persist stats with error handling
    try {
        localStorage.setItem('brainrottleStats', JSON.stringify(stats));
    } catch (e) {
        memoryStats = stats;  // Update in-memory fallback
    }
}
<!-- Game completion modal with comprehensive stats -->
<div class="modal" id="gameOverModal">
    <h2 id="modalTitle">Nice!</h2>
    <div id="modalWord" style="font-size: 20px; margin: 10px 0;"></div>
    <div class="stats">
        <div class="stat">
            <div class="stat-number" id="gamesPlayed">0</div>
            <div class="stat-label">Played</div>
        </div>
        <div class="stat">
            <div class="stat-number" id="winPercentage">0</div>
            <div class="stat-label">Win %</div>
        </div>
        <div class="stat">
            <div class="stat-number" id="currentStreak">0</div>
            <div class="stat-label">Streak</div>
        </div>
    </div>
</div>

Victory Celebration System

Physics-Based Confetti Animation

function createConfetti() {
    const colors = ['#e74c3c', '#f39c12', '#f1c40f', '#2ecc71', '#3498db', '#9b59b6'];
    const confettiCount = 100;
    
    for (let i = 0; i < confettiCount; i++) {
        setTimeout(() => {
            const confetti = document.createElement('div');
            confetti.className = 'confetti';
            confetti.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)];
            confetti.style.left = Math.random() * 100 + '%';
            confetti.style.top = '-10px';
            
            // Physics simulation variables
            const xVelocity = (Math.random() - 0.5) * 3;
            const yVelocity = Math.random() * 3 + 2;
            const gravity = 0.1;
            const rotationSpeed = (Math.random() - 0.5) * 10;
            
            // Animation loop with realistic physics
            const animate = () => {
                x += xVelocity;
                y += vy;
                vy += gravity;          // Apply gravitational acceleration
                rotation += rotationSpeed;
                
                confetti.style.left = x + '%';
                confetti.style.top = y + 'px';
                confetti.style.transform = `rotate(${rotation}deg)`;
                
                if (y < window.innerHeight + 10) {
                    requestAnimationFrame(animate);
                } else {
                    confetti.remove();  // Cleanup fallen confetti
                }
            };
        }, i * 15);  // Staggered creation timing
    }
}

Mobile Optimization

Responsive Design System

/* Mobile-first responsive breakpoints */
@media (max-width: 480px) {
    .tile {
        width: min(50px, calc((100vw - 100px) / 10));
        height: min(50px, calc((100vw - 100px) / 10));
        font-size: min(28px, calc((100vw - 100px) / 10 * 0.5));
    }
    
    .tile.punctuation {
        width: 15px;
        font-size: 18px;
    }
    
    .key {
        height: 50px;
        font-size: 12px;
        min-width: calc((100vw - 80px) / 10);
    }
    
    .key.emoji {
        font-size: 16px;
        min-width: calc((100vw - 60px) / 8);
    }
}

Touch-Friendly Interface

Cultural and Educational Impact

Gen Z Language Integration

// Brainrot terminology examples in default word list:
// 'skibidi' - Viral nonsense phrase from YouTube
// 'rizz' - Shortened form of "charisma"
// 'ohio' - Represents something weird or surreal
// 'sigma' - Alpha male archetype terminology
// 'bussin' - Slang for excellent or delicious
// 'no cap' - Phrase meaning "no lie" or "truth"

Educational Benefits

  1. Language Evolution: Documents contemporary slang evolution
  2. Cultural Literacy: Helps understanding of internet culture
  3. Generational Bridge: Connects different age groups through shared gameplay
  4. Vocabulary Expansion: Introduces players to new terminology
  5. Pattern Recognition: Develops word-guessing and deduction skills

Performance Characteristics

Optimization Features

Browser Compatibility

// Modern browser feature requirements:
// - ES6 Array.from() for emoji support
// - CSS Grid and Flexbox for layout
// - LocalStorage with graceful degradation
// - RequestAnimationFrame for smooth animations
// - CSS custom properties for theming

Security and Privacy

Data Protection Features

Sandboxed Operation

// Error-resistant storage handling
try {
    localStorage.setItem('brainrottleStats', JSON.stringify(stats));
} catch (e) {
    // Graceful fallback to in-memory storage
    memoryStats = stats;
}

Future Enhancement Opportunities

Gameplay Features

  1. Custom Word Lists: User-uploadable vocabulary sets
  2. Difficulty Levels: Variable word lengths and complexity
  3. Daily Challenges: Special themed days with unique word sets
  4. Multiplayer Mode: Competitive or collaborative gameplay
  5. Hint System: Optional clues for educational purposes

Technical Improvements

  1. Progressive Web App: Offline functionality and app-like experience
  2. Accessibility: Screen reader support and high contrast mode
  3. Internationalization: Multi-language brainrot terminology
  4. Advanced Analytics: Gameplay pattern insights (privacy-preserving)
  5. Sound Effects: Audio feedback for interactions

Cultural Expansion

  1. Regional Slang: Location-specific terminology variants
  2. Historical Evolution: Archive of slang term evolution
  3. Community Contributions: User-submitted word suggestions
  4. Educational Mode: Definitions and etymology for terms
  5. Meme Integration: Visual memes associated with terms

Code Quality Assessment

Strengths

Areas for Enhancement

Conclusion

Brainrottle represents an innovative adaptation of the classic Wordle format, successfully integrating contemporary internet culture with sophisticated technical implementation. The game demonstrates advanced understanding of modern web development, Unicode handling, responsive design, and cultural relevance.

Technical Rating: 9.1/10

The application successfully bridges the gap between traditional word games and modern internet culture, creating an engaging experience that resonates with contemporary audiences while maintaining technical excellence and accessibility standards.