sapbot

Wordle

Feb 14th, 2026
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
HTML 16.94 KB | None | 0 0
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Expirements - Wordle</title>
  7.     <meta name="author" content="sapbot">
  8.     <style>
  9.         * {
  10.             margin: 0;
  11.             padding: 0;
  12.             box-sizing: border-box;
  13.         }
  14.  
  15.         body {
  16.             font-family: 'Clear Sans', 'Helvetica Neue', Arial, sans-serif;
  17.             background-color: #121213;
  18.             color: #ffffff;
  19.             display: flex;
  20.             flex-direction: column;
  21.             align-items: center;
  22.             min-height: 100vh;
  23.             padding: 20px;
  24.         }
  25.  
  26.         header {
  27.             width: 100%;
  28.             max-width: 500px;
  29.             border-bottom: 1px solid #3a3a3c;
  30.             padding-bottom: 15px;
  31.             margin-bottom: 20px;
  32.             text-align: center;
  33.         }
  34.  
  35.         h1 {
  36.             font-size: 2.5rem;
  37.             letter-spacing: 0.2rem;
  38.             text-transform: uppercase;
  39.             font-weight: 700;
  40.         }
  41.  
  42.         .subtitle {
  43.             color: #818384;
  44.             font-size: 0.9rem;
  45.             margin-top: 5px;
  46.         }
  47.  
  48.         #game-board {
  49.             display: grid;
  50.             grid-template-rows: repeat(6, 1fr);
  51.             gap: 5px;
  52.             margin-bottom: 30px;
  53.         }
  54.  
  55.         .row {
  56.             display: grid;
  57.             grid-template-columns: repeat(5, 1fr);
  58.             gap: 5px;
  59.         }
  60.  
  61.         .tile {
  62.             width: 62px;
  63.             height: 62px;
  64.             border: 2px solid #3a3a3c;
  65.             display: flex;
  66.             justify-content: center;
  67.             align-items: center;
  68.             font-size: 2rem;
  69.             font-weight: bold;
  70.             text-transform: uppercase;
  71.             transition: all 0.3s ease;
  72.         }
  73.  
  74.         .tile.filled {
  75.             border-color: #565758;
  76.             animation: pop 0.1s ease;
  77.         }
  78.  
  79.         .tile.correct {
  80.             background-color: #538d4e;
  81.             border-color: #538d4e;
  82.         }
  83.  
  84.         .tile.present {
  85.             background-color: #b59f3b;
  86.             border-color: #b59f3b;
  87.         }
  88.  
  89.         .tile.absent {
  90.             background-color: #3a3a3c;
  91.             border-color: #3a3a3c;
  92.         }
  93.  
  94.         .tile.flip {
  95.             animation: flip 0.5s ease;
  96.         }
  97.  
  98.         @keyframes pop {
  99.             0% { transform: scale(1); }
  100.             50% { transform: scale(1.1); }
  101.             100% { transform: scale(1); }
  102.         }
  103.  
  104.         @keyframes flip {
  105.             0% { transform: rotateX(0); }
  106.             50% { transform: rotateX(90deg); }
  107.             100% { transform: rotateX(0); }
  108.         }
  109.  
  110.         #keyboard {
  111.             display: flex;
  112.             flex-direction: column;
  113.             gap: 8px;
  114.         }
  115.  
  116.         .keyboard-row {
  117.             display: flex;
  118.             justify-content: center;
  119.             gap: 6px;
  120.         }
  121.  
  122.         .key {
  123.             height: 58px;
  124.             min-width: 43px;
  125.             background-color: #818384;
  126.             border: none;
  127.             border-radius: 4px;
  128.             color: white;
  129.             font-size: 1rem;
  130.             font-weight: bold;
  131.             cursor: pointer;
  132.             display: flex;
  133.             justify-content: center;
  134.             align-items: center;
  135.             text-transform: uppercase;
  136.             transition: all 0.2s;
  137.             padding: 0 10px;
  138.         }
  139.  
  140.         .key:hover {
  141.             background-color: #999;
  142.         }
  143.  
  144.         .key:active {
  145.             transform: scale(0.95);
  146.         }
  147.  
  148.         .key.wide {
  149.             min-width: 65px;
  150.             font-size: 0.8rem;
  151.         }
  152.  
  153.         .key.correct {
  154.             background-color: #538d4e;
  155.         }
  156.  
  157.         .key.present {
  158.             background-color: #b59f3b;
  159.         }
  160.  
  161.         .key.absent {
  162.             background-color: #3a3a3c;
  163.         }
  164.  
  165.         #message {
  166.             position: fixed;
  167.             top: 80px;
  168.             left: 50%;
  169.             transform: translateX(-50%);
  170.             background-color: white;
  171.             color: black;
  172.             padding: 16px 24px;
  173.             border-radius: 8px;
  174.             font-weight: bold;
  175.             opacity: 0;
  176.             transition: opacity 0.3s;
  177.             pointer-events: none;
  178.             z-index: 100;
  179.         }
  180.  
  181.         #message.show {
  182.             opacity: 1;
  183.         }
  184.  
  185.         #restart-btn {
  186.             margin-top: 20px;
  187.             padding: 12px 24px;
  188.             background-color: #538d4e;
  189.             color: white;
  190.             border: none;
  191.             border-radius: 4px;
  192.             font-size: 1rem;
  193.             font-weight: bold;
  194.             cursor: pointer;
  195.             display: none;
  196.         }
  197.  
  198.         #restart-btn:hover {
  199.             background-color: #6aaa64;
  200.         }
  201.  
  202.         .shake {
  203.             animation: shake 0.5s ease;
  204.         }
  205.  
  206.         @keyframes shake {
  207.             0%, 100% { transform: translateX(0); }
  208.             25% { transform: translateX(-5px); }
  209.             75% { transform: translateX(5px); }
  210.         }
  211.     </style>
  212. </head>
  213. <body>
  214.     <header>
  215.         <h1>Expirements - Wordle</h1>
  216.         <div class="subtitle">by sapbot</div>
  217.     </header>
  218.  
  219.     <div id="game-board"></div>
  220.     <div id="message"></div>
  221.     <button id="restart-btn" onclick="initGame()">Play Again</button>
  222.  
  223.     <div id="keyboard">
  224.         <div class="keyboard-row">
  225.             <button class="key" data-key="q">q</button>
  226.             <button class="key" data-key="w">w</button>
  227.             <button class="key" data-key="e">e</button>
  228.             <button class="key" data-key="r">r</button>
  229.             <button class="key" data-key="t">t</button>
  230.             <button class="key" data-key="y">y</button>
  231.             <button class="key" data-key="u">u</button>
  232.             <button class="key" data-key="i">i</button>
  233.             <button class="key" data-key="o">o</button>
  234.             <button class="key" data-key="p">p</button>
  235.         </div>
  236.         <div class="keyboard-row">
  237.             <button class="key" data-key="a">a</button>
  238.             <button class="key" data-key="s">s</button>
  239.             <button class="key" data-key="d">d</button>
  240.             <button class="key" data-key="f">f</button>
  241.             <button class="key" data-key="g">g</button>
  242.             <button class="key" data-key="h">h</button>
  243.             <button class="key" data-key="j">j</button>
  244.             <button class="key" data-key="k">k</button>
  245.             <button class="key" data-key="l">l</button>
  246.         </div>
  247.         <div class="keyboard-row">
  248.             <button class="key wide" data-key="Enter">Enter</button>
  249.             <button class="key" data-key="z">z</button>
  250.             <button class="key" data-key="x">x</button>
  251.             <button class="key" data-key="c">c</button>
  252.             <button class="key" data-key="v">v</button>
  253.             <button class="key" data-key="b">b</button>
  254.             <button class="key" data-key="n">n</button>
  255.             <button class="key" data-key="m">m</button>
  256.             <button class="key wide" data-key="Backspace">⌫</button>
  257.         </div>
  258.     </div>
  259.  
  260.     <script>
  261.         const words = [
  262.             "apple", "beach", "brain", "bread", "brush", "chair", "chess", "chest", "chief", "child",
  263.             "china", "click", "clock", "cloud", "dance", "diary", "dream", "dress", "drive", "earth",
  264.             "enemy", "entry", "faith", "field", "fight", "final", "floor", "focus", "force", "frame",
  265.             "frank", "front", "fruit", "glass", "globe", "grace", "grade", "grain", "grass", "green",
  266.             "group", "guide", "heart", "horse", "hotel", "house", "image", "index", "inner", "input",
  267.             "issue", "japan", "jewel", "judge", "knife", "knock", "layer", "level", "light", "limit",
  268.             "lunch", "major", "march", "match", "metal", "model", "money", "month", "motor", "mount",
  269.             "music", "night", "noise", "north", "novel", "nurse", "offer", "order", "other", "owner",
  270.             "panel", "paper", "party", "peace", "phase", "phone", "piece", "pilot", "pitch", "place",
  271.             "plain", "plane", "plant", "plate", "point", "pound", "power", "press", "price", "pride",
  272.             "prime", "print", "prior", "prize", "proof", "queen", "quick", "quiet", "radio", "raise",
  273.             "range", "ratio", "reply", "right", "river", "robot", "round", "route", "royal", "rural",
  274.             "scale", "scene", "scope", "score", "sense", "serve", "seven", "shall", "shape", "share",
  275.             "sharp", "sheet", "shelf", "shell", "shift", "shirt", "shock", "shoot", "short", "sight",
  276.             "skill", "sleep", "slice", "slide", "small", "smart", "smile", "smith", "smoke", "solid",
  277.             "solve", "sorry", "sound", "south", "space", "spare", "speak", "speed", "spend", "spent",
  278.             "spite", "split", "spoke", "sport", "staff", "stage", "stake", "stand", "start", "state",
  279.             "steam", "steel", "stick", "still", "stock", "stone", "store", "storm", "story", "strip",
  280.             "stuck", "study", "stuff", "style", "sugar", "suite", "super", "sweet", "table", "taste",
  281.             "teach", "terms", "thank", "theory", "thing", "think", "third", "those", "three", "threw",
  282.             "throw", "tight", "tired", "title", "today", "topic", "total", "touch", "tough", "tower",
  283.             "track", "trade", "train", "treat", "trend", "trial", "tried", "truck", "truly", "trust",
  284.             "truth", "twice", "under", "union", "unity", "until", "upper", "upset", "urban", "usage",
  285.             "usual", "valid", "value", "video", "virus", "visit", "vital", "voice", "waste", "watch",
  286.             "water", "wheel", "where", "which", "while", "white", "whole", "whose", "woman", "women",
  287.             "world", "worry", "worse", "worst", "worth", "would", "wound", "write", "wrong", "wrote",
  288.             "yield", "young", "youth", "zebra", "zoned"
  289.         ];
  290.  
  291.         let targetWord;
  292.         let currentRow = 0;
  293.         let currentTile = 0;
  294.         let gameOver = false;
  295.         let guesses = [];
  296.  
  297.         function initGame() {
  298.             targetWord = words[Math.floor(Math.random() * words.length)];
  299.             currentRow = 0;
  300.             currentTile = 0;
  301.             gameOver = false;
  302.             guesses = [];
  303.            
  304.             document.getElementById('game-board').innerHTML = '';
  305.             document.getElementById('restart-btn').style.display = 'none';
  306.            
  307.             // Create game board
  308.             for (let i = 0; i < 6; i++) {
  309.                const row = document.createElement('div');
  310.                row.className = 'row';
  311.                for (let j = 0; j < 5; j++) {
  312.                    const tile = document.createElement('div');
  313.                    tile.className = 'tile';
  314.                    tile.dataset.row = i;
  315.                    tile.dataset.col = j;
  316.                    row.appendChild(tile);
  317.                }
  318.                document.getElementById('game-board').appendChild(row);
  319.            }
  320.            
  321.            // Reset keyboard
  322.            document.querySelectorAll('.key').forEach(key => {
  323.                 key.classList.remove('correct', 'present', 'absent');
  324.             });
  325.            
  326.             console.log('Target word:', targetWord); // For debugging
  327.         }
  328.  
  329.         function showMessage(msg, duration = 2000) {
  330.             const messageEl = document.getElementById('message');
  331.             messageEl.textContent = msg;
  332.             messageEl.classList.add('show');
  333.             setTimeout(() => {
  334.                 messageEl.classList.remove('show');
  335.             }, duration);
  336.         }
  337.  
  338.         function shakeRow(row) {
  339.             const rows = document.querySelectorAll('.row');
  340.             rows[row].classList.add('shake');
  341.             setTimeout(() => {
  342.                 rows[row].classList.remove('shake');
  343.             }, 500);
  344.         }
  345.  
  346.         function updateTile(row, col, letter) {
  347.             const tile = document.querySelector(`.tile[data-row="${row}"][data-col="${col}"]`);
  348.             tile.textContent = letter;
  349.             tile.classList.add('filled');
  350.         }
  351.  
  352.         function deleteTile(row, col) {
  353.             const tile = document.querySelector(`.tile[data-row="${row}"][data-col="${col}"]`);
  354.             tile.textContent = '';
  355.             tile.classList.remove('filled');
  356.         }
  357.  
  358.         function checkWord() {
  359.             if (currentTile < 5) {
  360.                showMessage('Not enough letters');
  361.                shakeRow(currentRow);
  362.                return;
  363.            }
  364.  
  365.            const row = document.querySelectorAll('.row')[currentRow];
  366.            const tiles = row.querySelectorAll('.tile');
  367.            let guess = '';
  368.            tiles.forEach(tile => guess += tile.textContent.toLowerCase());
  369.  
  370.             if (!words.includes(guess)) {
  371.                 showMessage('Not in word list');
  372.                 shakeRow(currentRow);
  373.                 return;
  374.             }
  375.  
  376.             guesses.push(guess);
  377.            
  378.             const targetLetters = targetWord.split('');
  379.             const guessLetters = guess.split('');
  380.             const results = new Array(5).fill('absent');
  381.            
  382.             // Check for correct positions first
  383.             for (let i = 0; i < 5; i++) {
  384.                if (guessLetters[i] === targetLetters[i]) {
  385.                    results[i] = 'correct';
  386.                    targetLetters[i] = null;
  387.                }
  388.            }
  389.            
  390.            // Check for present letters
  391.            for (let i = 0; i < 5; i++) {
  392.                if (results[i] === 'correct') continue;
  393.                const index = targetLetters.indexOf(guessLetters[i]);
  394.                if (index !== -1) {
  395.                    results[i] = 'present';
  396.                    targetLetters[index] = null;
  397.                }
  398.            }
  399.  
  400.            // Animate tiles
  401.            tiles.forEach((tile, index) => {
  402.                 setTimeout(() => {
  403.                     tile.classList.add('flip', results[index]);
  404.                    
  405.                     // Update keyboard
  406.                     const key = document.querySelector(`.key[data-key="${guessLetters[index]}"]`);
  407.                     if (key) {
  408.                         if (results[index] === 'correct') {
  409.                             key.classList.remove('present', 'absent');
  410.                             key.classList.add('correct');
  411.                         } else if (results[index] === 'present' && !key.classList.contains('correct')) {
  412.                            key.classList.remove('absent');
  413.                             key.classList.add('present');
  414.                         } else if (results[index] === 'absent' && !key.classList.contains('correct') && !key.classList.contains('present')) {
  415.                            key.classList.add('absent');
  416.                         }
  417.                     }
  418.                 }, index * 300);
  419.             });
  420.  
  421.             setTimeout(() => {
  422.                 if (guess === targetWord) {
  423.                     gameOver = true;
  424.                     showMessage('Genius!', 3000);
  425.                     document.getElementById('restart-btn').style.display = 'block';
  426.                 } else if (currentRow === 5) {
  427.                     gameOver = true;
  428.                     showMessage(targetWord.toUpperCase(), 3000);
  429.                     document.getElementById('restart-btn').style.display = 'block';
  430.                 } else {
  431.                     currentRow++;
  432.                     currentTile = 0;
  433.                 }
  434.             }, 1500);
  435.         }
  436.  
  437.         function handleInput(key) {
  438.             if (gameOver) return;
  439.            
  440.             if (key === 'Enter') {
  441.                 checkWord();
  442.             } else if (key === 'Backspace') {
  443.                 if (currentTile > 0) {
  444.                     currentTile--;
  445.                     deleteTile(currentRow, currentTile);
  446.                 }
  447.             } else if (/^[a-zA-Z]$/.test(key) && currentTile < 5) {
  448.                updateTile(currentRow, currentTile, key.toUpperCase());
  449.                 currentTile++;
  450.             }
  451.         }
  452.  
  453.         // Keyboard event listeners
  454.         document.addEventListener('keydown', (e) => {
  455.             if (e.key === 'Enter') {
  456.                 handleInput('Enter');
  457.             } else if (e.key === 'Backspace') {
  458.                 handleInput('Backspace');
  459.             } else if (/^[a-zA-Z]$/.test(e.key)) {
  460.                 handleInput(e.key.toLowerCase());
  461.             }
  462.         });
  463.  
  464.         // On-screen keyboard
  465.         document.querySelectorAll('.key').forEach(key => {
  466.             key.addEventListener('click', () => {
  467.                 const keyValue = key.dataset.key;
  468.                 if (keyValue === 'Enter') {
  469.                     handleInput('Enter');
  470.                 } else if (keyValue === 'Backspace') {
  471.                     handleInput('Backspace');
  472.                 } else {
  473.                     handleInput(keyValue);
  474.                 }
  475.             });
  476.         });
  477.  
  478.         // Initialize game on load
  479.         initGame();
  480.     </script>
  481. </body>
  482. </html>
Advertisement
Add Comment
Please, Sign In to add comment