教你用JavaScript實現調皮的字母

来源:https://www.cnblogs.com/xFeater/archive/2022/12/25/17003923.html
-Advertisement-
Play Games

案例介紹 歡迎來到我的小院,我是霍大俠,恭喜你今天又要進步一點點了!我們來用JavaScript編程實戰案例,製作提高打字速度的小游戲-調皮的字母。點擊與屏幕上字母相對應的按鍵,若按鍵與出現的字母一致,則可以獲得相應的分數。 案例演示 根據屏幕上隨機出現的字母來點擊鍵盤上對應的按鍵,可自行調節字母下 ...


調皮的字母-豎-封面.jpg

案例介紹

歡迎來到我的小院,我是霍大俠,恭喜你今天又要進步一點點了!
我們來用JavaScript編程實戰案例,製作提高打字速度的小游戲-調皮的字母。點擊與屏幕上字母相對應的按鍵,若按鍵與出現的字母一致,則可以獲得相應的分數。

案例演示

根據屏幕上隨機出現的字母來點擊鍵盤上對應的按鍵,可自行調節字母下落的速度以及時間間隔,還會有分數統計。


源碼學習

進入核心代碼學習,我們先來看HTML中的核心代碼。

<!-- 有個小院-興趣編程 -->
<body>
    <!-- onkeydown 事件會在用戶按下一個鍵盤按鍵時發生keydown()事件 -->
    <input type="text" id="input" onkeydown="keydown()">
    <div id="ground">
        <label for="interval">生成間隔:</label>
        <input type="number" id="interval" value="100">
        <br>
        <label for="speed">下落速度:</label>
        <input type="number" id="speed" value="5">
        <input type="button" value="重新開始" onclick="gameStart()">
        <input type="button" value="重置時間" onclick="location.reload()">
        <p id="hint">3</p>
        <p id="score">分數: <span id="scorenum">0</span></p>
    </div>
    <!-- 主體部分 -->
    <div id="container"></div>
    <script src="../js/調皮的字母.js"></script>
</body>

然後再讓我們來看CSS核心代碼,CSS主要是對要頁面部件的樣式進行設置。

*{
    margin: 0;
    padding: 0;
    overflow: hidden;
}
#input{
    display:block;
    width: 100%;
    height: 100%;
    position:absolute;
    cursor: default;
    background: rgb(156, 83, 83);
}
/* 底部的顯示 */
#ground{
    width: 100%;
    height:200px;
    position:absolute;
    padding-top: 80px;
    bottom:0;
    background-color: #4d292c;
}
/* 下落的字母 */
.stone{
    background-size: 100% 100%;
    position:absolute;
    bottom:1200px;
    width: 80px;
    height:80px;
    text-align: center;
    line-height:80px;
    font-size: 40px;
    color:white;
    overflow:hidden;
    transform-origin: center;
}
label{
    color: white;
    margin-left: 20px;
}
input[type="number"] {
    width:100px;
    height: 40px;
    font-size: 30px;
    margin-top: 30px;
}
input[type="button"] {
    padding-left:10px;
    width: 200px;
    padding-right: 10px;
    height: 50px;
    font-size: 18px;
    margin-left: 300px;
}
/* 提示 */
#hint{
    position: absolute;
    top:10px;
    right: 10px;
    font-size: 35px;
    color:red;
}
/* 分數的顯示 */
#score{
    position: absolute;
    top:60px;
    left:50%;
    text-align: center;
    font-size: 30px;
    color:white;
}

讓我們來編寫核心的JavaScript代碼,首先聲明相關的變數。通過countdown()方法設置時間倒計時,分數初始化為0。getElementById()方法獲取id對應的組件。設置定時器,併在每次游戲重新開始前對定時器進行清除。random()方法獲取隨機字母以及隨機位置,並將字母添加到容器里。for()迴圈遍歷每一個字母修改屬性,設置游戲結束的位置。removeChild()方法移除最前面的字母,更新分數。

//有個小院-興趣編程
// 生成字母的間隔
var interval = 50;
// 計數,如果和間隔一樣就下落
var time = interval;
// 下落的速度
var speed = 5;
// 判斷游戲是否結束
var gameOver = false;
// 生成的字元從這裡隨機取
var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// 作為setInterval的返回值
var down;
// 分數
var score = 0;
// 開始倒計時
function countdown() {
    score = 0;
    document.getElementById('scorenum').innerHTML = score;
    // 倒計時3,2,1
    let hint = document.getElementById('hint');
    // 倒計時
    var countTime = 3;
    // 設置定時器
    let count = setInterval(() => {
        hint.innerHTML = countTime;
        if (!countTime) {
            clearInterval(count);
            hint.innerHTML = '游戲開始!';
            document.getElementById('input').focus();
            down = setInterval(fall, 20);
        }
        countTime -= 1;
    }, 500);
}
countdown();
// 字母下降
function fall() {
    let stones = document.getElementsByClassName('stone');
    // 如果次數達到設定的值,生成一個新的字母
    if (time == interval) {
        let newStone = document.createElement('div');
        newStone.setAttribute('class', 'stone');
        // 隨機字元
        newStone.innerHTML = str[Math.round(Math.random() * 25)];
        // 隨機位置
        newStone.style.left = `${Math.round(Math.random() * 80) + 10}%`
        // 獲取容器
        let container = document.getElementById('container');
        // 把生成的字母添加到容器里
        container.appendChild(newStone);
        time = 0;
    }
    // 遍歷每一個字母,修改屬性,實現下落
    for (let i = 0; i < stones.length; i++) {
             // 計算下落的距離,賦值給style.bottom
        let distance = parseInt(getComputedStyle(stones[i]).bottom) - speed;
        stones[i].style.bottom = `${distance}px`;
        // 距離小於 150px 表示接觸到地板,游戲結束
        if (distance < 260) {
            document.getElementById('hint').innerHTML = '游戲結束!'
            gameOver = true;
            clearInterval(down);
        }
    }
    time ++;
}
// 按下按鍵觸發的事件
function keydown() {
    // 晚1ms清空input里的字元,不然有可能清空失敗
    setTimeout(() => {
        document.getElementById('input').value = '';
    }, 1);
    // 如果游戲結束,停止觸發
    if (gameOver)
        return;
    // 遍歷所有的字母,如果和鍵盤輸入的值相同則移除最前面的字母
    let stones = document.getElementsByClassName('stone');
    for (let i = 0; i < stones.length; i++) {
        // 判斷字母的值是否和鍵盤輸入的值相同
        if (arguments.callee.caller.arguments[0].key.toUpperCase() == stones[i].textContent) {
            let die = stones[i];
            die.innerHTML = '';
            setTimeout(() => {
                die.parentElement.removeChild(die);
                die = null;
            }, 300);
            // 更新分數
            score ++;
            document.getElementById('scorenum').innerHTML = score;
            break;
        }
    }
}
// 按下 重新開始鍵 觸發的事件
function gameStart() {
    // 如果游戲沒結束則不能重新開始,防止下落抖動
    if (!gameOver)
        return;
    // 從輸入框獲取各項參數
    interval = document.getElementById('interval').value;
    time = interval;
    speed = document.getElementById('speed').value;
    // 清空容器里的字母
    let container = document.getElementById('container');
    while (container.children.length) {
        container.children[0].remove();
    }
    gameOver = false;
    countdown();
}

記得關註我,每天學習一點點

你覺得這個游戲,最吸引你的地方在哪裡?

全網可搜:小院里的霍大俠, 免費獲取簡單易懂的實戰編程案例。編程/就業/副業/創業/資源。
私微信:huodaxia_xfeater
二維碼: http://www.yougexiaoyuan.com/images/weixin_huodaxia.jpg
公眾號:有個小院(微信公眾號:yougexiaoyuan)
github:yougexiaoyuan (視頻源碼免費獲取)
(部分素材來源於互聯網,如有保護請聯繫作者)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在VsCode中搭建C/C++運行環境需要先安裝以下插件 1、安裝c/c++插件 2、安裝code runner插件 當然也可以安裝一些其他的美化插件根據個人習慣,但是以上這兩個是必裝的。 安裝好插件後來到插件主頁點擊卸載旁邊的小齒輪選擇擴展設置 找到擴展設置中的下圖選項並打上勾即可,設置完後重啟V ...
  • 返回值類型後置語法,是為瞭解決函數返回值類型依賴於參數而導致難以確定返回值類型的問題。有了這種語法以後,對返回值類型的推導就可以用清晰的方式(直接通過參數做運算)描述出來,而不需要像 C++98/03 那樣使用晦澀難懂的寫法。 在泛型編程中,可能需要通過參數的運算來得到返回值的類型。比如如下的代碼: ...
  • 大家好,我是王有志,歡迎來到《Java面試都問啥?》的第一篇技術文章。 這個系列會從Java部分開始,接著是MySQL和Redis的內容,同時會繼續更新數據結構與演算法的部分,這樣在第一階段,我們就完成了面試“三幻神”的挑戰。 Java的部分從併發編程開始,接著是Java虛擬機,最後是集合框架。至於J ...
  • 一個簡單的C#實例。包括:GRPC文件的創建生成、服務端和客戶端函數類庫的封裝、創建服務端和客戶端調用測試。若有錯誤或更好的方法還請指正。 1、創建並生成GRPC服務文件 (1)打開vs2022,創建新項目控制台應用(其他應用好像不行)。 (2)需要安裝三個nuget包,如圖: (3)項目添加新建項 ...
  • 在前面隨筆介紹的基於SqlSugar的WInform端管理系統中,數據提供者是直接訪問資料庫的方式,不過窗體界面調用數據介面獲取數據的時候,我們傳遞的是標準的介面,因此可擴展性比較好。我曾經在隨筆《基於SqlSugar的開發框架循序漸進介紹(5)-- 在服務層使用介面註入方式實現IOC控制反轉》中介... ...
  • 在實際應用開發中,隨著項目業務逐漸複雜,耦合度會越來越高,維護成本也會直線上升,所以解耦也變得越來越重要。Prism框架為WPF開發中解耦提供了非常便捷的應用。今天主要以一個簡單的小例子,簡述WPF開發中Prism框架的簡單應用,如有不足之處,還請指正。 ...
  • AIR32F103CBT6 和 AIR32F103CCT6 分別帶 32K Byte和 64K Byte 記憶體. 對於48pin封裝的 AIR32F103, 32K和64K的記憶體已經是市面上M3晶元中相當不錯的容量, 至於64pin封裝的AIR32F103RPT6, 96K的記憶體只在市場上的高端型號... ...
  • 近年來,有關數據泄露相關的新聞事件屢見不鮮,不斷地引發大眾的討論和擔憂。各家企業都或多或少在承受相關的數據安全風險,這種可能性會給企業運行帶來額外的風險,包括大眾的質疑以及政府的處罰等。 Facebook超5億用戶個人數據遭到泄露; Elector Software投票應用泄露超650萬以色... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...