前端搭建打字通游戏(内附源码)

article/2025/9/23 8:07:15

The sand accumulates to form a pagoda

  • ✨ 写在前面
  • ✨ 打字通功能介绍
  • ✨ 页面搭建
  • ✨ 样式代码
  • ✨ 功能实现


✨ 写在前面

上周我们实通过前端基础实现了名言生成器,当然很多伙伴再评论区提出了想法,后续我们会考虑实现的,今天还是继续按照我们原定的节奏来带领大家完成一个打字通的小游戏,功能也比较简单简单,也是想借助这样一个简单的功能,然后来帮助大家了解我们JavaScript在前端中的作用, 在前面的文章当中我们也提及到我们在本系列的专栏是循序渐进从简单到复杂的过程,后续会带领大家用前端实现猜数字、翻卡片、扫雷、贪吃蛇等有趣的小游戏,纯前端语言实现,都会陆续带给大家。欢迎大家订阅我们这份前端小游戏的专栏。


✨ 打字通功能介绍

在这里插入图片描述

我们中间白色区域就是我们文本域,用户可以在里面输入内容,我们点击开始按钮后我们下面的倒计时就会启动,这里我们是以60秒倒计时,与此同时上面的你准备好了吗?将变成我们的文案内容,我们需要照着文案内容再文本域中进行输入,倒计时结束后我们的我们上面将变成最终的得分,然后用户可以重新点击开始,又是同样的倒计时,当然我们可以自己规定规则,大家可以自己修改变成更棒的小游戏!下面我们就按照前面的思路先来实现一下吧!


✨ 页面搭建

创建文件

首先呢我们创建我们的HTML文件,这里我就直接命名为 打字通.html 了,大家可以随意命名, 文件创建生成后我们通过编辑器打开,这里我用的是VScode, 然后初始化我们的代码结构,那在这里告诉大家一个快捷键,就是我们敲上我们英文的一个 ! 我们敲击回车直接就会给我们生成基础版本的前端代码结构。

在这里插入图片描述

搭建DOM结构

我们现在就可以再body中对着我们的效果图开始搭建我们的DOM结构了,首先的话,我们可以看到我们肯定是有一个大的盒子,我们就先来定义这个盒子我们设置类名就为bigBox,然后我们上面的你准备好了吗?我们也放一个盒子我们设置类名为container,盒子的下面是一个文本域,这个文本域我们前端可以使用 textarea 标签,标签中有一些属性,在下面我们可以看到我们用到了几个属性,首先placeholder的作用是提示文字,我们可以看没有输入内容的时候看到开始输入…字样,我们style是设置样式这里我是通过resize:none来禁止我们文本域的拖拽,大家可以先不设置这个属性然后感受一下我们文本域的右下角是有一个三角是可以对文本域进行拖拽的,这里呢我们禁止拖拽,为了保护我们后续的布局,这是我们的文本域,再往下面就是我们的按钮跟倒计时的内容,这里我们的首先添加一个盒子类名叫做operate,然后盒子里面我们添加一个按钮跟一个类名叫做timer的div,就是下面这些代码,我们可以保存代码然后看一下页面。

<div class="bigBox"><div class="container">你准备好了吗?</div><textarea name="" placeholder="开始输入..."id="" style="resize:none" cols="30" rows="10"></textarea><div class="operate"><button>开始</button><div id="timer">60</div></div>
</div>

在这里插入图片描述


✨ 样式代码

大盒子样式

上面的框架我们已经搭建出来了,其实在我们的开发过程中我们是肯定搭建一个DOM元素然后就开始编写样式的,但是这里为了方便给大家展示我们只能先搭建完所有的元素统一来配置样式,首先呢我们还是一样在我们的head中添加style标签,在里面编写我们的样式代码,老规矩先为我们的body设置上margin: 0; padding: 0;font-family: Arial, sans-serif;,内外边距都为0还有我们的字体;在我们的bigBox设置宽度50%,背景颜色,外边距上下为40px,然后水平居中,设置盒子模型为标准盒子,内边距为20px,边框圆角30px,然后盒子阴影,这个每个值什么意思我们再上篇文章中为大家讲解了,大家可以看一下;最后我们看一下效果

body {font-family: Arial, sans-serif;margin: 0;padding: 0;
}
.bigBox {width: 50%;background-color: #ac8c3e;margin: 40px auto;box-sizing: border-box;padding: 20px;border-radius: 30px;box-shadow: 0px 0px 30px 9px #939393;
}

在这里插入图片描述

盒子内部布局

为我们类名为container的盒子也就是上面的你准备好了吗?盒子设置居中,然后通过text-align: center;设置文字居中,内边距为20px,大家可以保存看一下效果;这里就不一一展示效果了,然后我们为中间的文本域,设置宽度100%,高度200px,外边距上下位20px左右为0,然后我们设置他的边框为none,不展示边框,下面就是文本域下面的区域,我们用了一个类名叫做operate的盒子来包裹按钮跟倒计时,我们为这个盒子设置宽度为20%,然后水平居中,字体居中,继续设置里面的botton按钮,字体大小24px,内边距上下为10px,左右为20px,背景颜色为 #007bff 字体颜色白色,边框设置为none不展示,圆角为5px,在通过cursor: pointer;鼠标悬浮为手状;最后在设置我们id为timer的倒计时,字体大小为48px,然后外边距上下左右都是20px;保存代码我们看一下效果;

.container {margin: 0 auto;text-align: center;padding: 20px;
}textarea {width: 100%;height: 200px;margin: 20px 0;font-size: 20px;border: none;
}.operate {width: 20%;margin: 0 auto;text-align: center;
}button {font-size: 24px;padding: 10px 20px;background-color: #007bff;color: #fff;border: none;border-radius: 5px;cursor: pointer;
}#timer {font-size: 48px;margin: 20px;
}

在这里插入图片描述


✨ 功能实现

那么代码写到这里呢,其实我们页面已经搭建完整了,但是我们的页面现在处于纯静态页面,也就是说仅仅用于展示, 现在还没有任何的效果,我们想要实现动态的一些交互效果就需要用到我们的JS来完成,下面呢我们就从几个方面来实现我们整体的效果;

获取所需元素和内容

首先呢我们知道点击开始之后,上面的你准备好了吗就要换成我们的范文,首先我们先声明变量来放我们的范文,我们声明变量text值就是我们的范文内容,这给大家找了一段英文的;我们还要通过document.querySelector先获取我们的元素后面会使用;然后我们先为我们的文本域设置内容为空;

  const text ="Believe in yourself and all that you are. Know that there is something inside you that is greater than any obstacle. This quote by Christian D. Larson reminds us that we all have the power within us to overcome any obstacle we may face. When we have confidence in ourselves and our abilities, we can achieve great things. So, let's trust ourselves, believe in our dreams, and work hard to make them a reality.";const container = document.querySelector(".container");const input = document.querySelector("textarea");const button = document.querySelector("button");const timer = document.getElementById("timer");input.value = "";

为按钮注册事件

通过addEventListener为按钮注册时间,我们在函数中首先把倒计时设置为60秒,然后清空我们输入框和范文的内容,然后我们调用startGame函数。

// 添加按钮点击事件监听器
button.addEventListener("click", () => {// 设置倒计时时间timer.textContent = "60";// 清空输入框和输出文本区域input.value = "";container.textContent = "";// 启动游戏startGame();
});

启动游戏

上面的代码我们是通过点击按钮然后来用到我们下面的startGame函数,我们在这个函数的前面的首先要声明一个变量countdown用来承接定时器的销毁,在函数中首先呢我们要将按钮禁用,倒计时期间不能重复点击,然后我们将范文展示再我们的container元素中,然后我们运用定时器setInterval,第一参数是一个函数,第二个参数是隔多少秒,下面的意思就是每秒执行一次函数,在函数中我们首先获取到倒计时现在的数值,第一次这里肯定为60,然后这里我们申明常量remainingTime来接受当前秒数-1,我们还有一个判断就是如果当前描述是0那么我们就执行endGame函数,然后我们对描述进行赋值就完成了我们的倒计时效果;下面呢我们继续写endGame函数。

  let countdown;function startGame () {// 游戏开始后,禁用按钮button.disabled = true;// 显示文本container.textContent = text;// 启动倒计时countdown = setInterval(() => {const remainingTime = parseInt(timer.textContent) - 1;if (remainingTime === 0) {// 时间用完,游戏结束endGame();}timer.textContent = remainingTime;}, 1000);}

暂停游戏

endGame函数中我们首先就是停止倒计时,也就是销毁定时器,我们刚才说到了我们申明了一个变量用来承接定时器,这里的销魂我们就可以通过变量来;然后我们要计算得分,计算得分的函数呢我们下面讲解,首先这里你要知道计算得分的函数是调用后返回分数即可,然后我们将分数显示再范文区域,并且取消按钮的禁用;

function endGame () {// 停止倒计时clearInterval(countdown);// 计算得分const score = calculateScore();const scoreMessage = `你的得分是 ${score} 分!`;container.textContent = scoreMessage;// 显示按钮和计时器// button.style.display = "block";// timer.style.display = "block";button.disabled = false;
}

分数的计算

在上面我们结束游戏的函数中调用了计算分数的calculateScore 函数,在这个函数中我们需要按照规则生成分数并且返回,看下面首先我们将文本域、范文内容通过.trim()移除两端的空格,并且赋值给变量,然后我们通过split将所有内容按照空格进行拆分,然后我们进行循环每个单词进行一一对应如果相等则分数++,最后将分数return出去,调用的地方就可以直接拿到了。

function calculateScore () {const userText = input.value.trim();const correctText = text.trim();const userWords = userText.split(" ");const correctWords = correctText.split(" ");let score = 0;for (let i = 0; i < userWords.length; i++) {console.log(userWords[i], correctWords[i])if (userWords[i] === correctWords[i]) {score++;}}return score;
}

上面这些就是我们实现的整体思路跟代码,当然这里你完全可以按照自己的私聊来编写逻辑,上面也只是完成小小的功能,大家可以结合自己的想法编写,然后在这里呢有个小小的点,就是我是为了大家能够跟得上逻辑然后按照用户行为的先后顺序来介绍的,当然这样写也没有问题,但是还是建议大家函数要写在调用的前面,比如我们的启动游戏的函数是再按钮点击的时候调用的,那我们可以把启动游戏的函数代码写在点击事件的前面会更好以写;下面的完整代码也给到大家了哦!还有一点就是为了用户体验我们可以禁止用户复制,直接把范文复制到文本域好像不太好,我们可以再css代码的body中添以下代码;

body {font-family: Arial, sans-serif;margin: 0;padding: 0;-moz-user-select: none;/*火狐*/-webkit-user-select: none;/*webkit浏览器*/-ms-user-select: none;/*IE10*/-khtml-user-select: none;/*早期浏览器*/-o-user-select: none;user-select: none;
}

完整代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>body {font-family: Arial, sans-serif;margin: 0;padding: 0;-moz-user-select: none;/*火狐*/-webkit-user-select: none;/*webkit浏览器*/-ms-user-select: none;/*IE10*/-khtml-user-select: none;/*早期浏览器*/-o-user-select: none;user-select: none;}.bigBox {width: 50%;background-color: #ac8c3e;margin: 40px auto;box-sizing: border-box;padding: 20px;border-radius: 30px;box-shadow: 0px 0px 30px 9px #939393;}.container {margin: 0 auto;text-align: center;padding: 20px;}textarea {width: 100%;height: 200px;margin: 20px 0;font-size: 20px;border: none;}.operate {width: 20%;margin: 0 auto;text-align: center;}button {font-size: 24px;padding: 10px 20px;background-color: #007bff;color: #fff;border: none;border-radius: 5px;cursor: pointer;}#timer {font-size: 48px;margin: 20px;}</style>
</head><body><div class="bigBox"><div class="container">你准备好了吗?</div><textarea name="" placeholder="开始输入..." id="" style="resize:none" cols="30" rows="10"></textarea><div class="operate"><button>开始</button><div id="timer">60</div></div></div><script>const text ="Believe in yourself and all that you are. Know that there is something inside you that is greater than any obstacle. This quote by Christian D. Larson reminds us that we all have the power within us to overcome any obstacle we may face. When we have confidence in ourselves and our abilities, we can achieve great things. So, let's trust ourselves, believe in our dreams, and work hard to make them a reality.";const container = document.querySelector(".container");const input = document.querySelector("textarea");const button = document.querySelector("button");const timer = document.getElementById("timer");input.value = "";let countdown;function startGame () {// 游戏开始后,禁用按钮button.disabled = true;// 显示文本container.textContent = text;// 启动倒计时countdown = setInterval(() => {const remainingTime = parseInt(timer.textContent) - 1;if (remainingTime === 0) {// 时间用完,游戏结束endGame();}timer.textContent = remainingTime;}, 1000);}function endGame () {// 停止倒计时clearInterval(countdown);// 计算得分const score = calculateScore();const scoreMessage = `你的得分是 ${score} 分!`;container.textContent = scoreMessage;button.disabled = false;}function calculateScore () {const userText = input.value.trim();const correctText = text.trim();const userWords = userText.split(" ");const correctWords = correctText.split(" ");let score = 0;for (let i = 0; i < userWords.length; i++) {console.log(userWords[i], correctWords[i])if (userWords[i] === correctWords[i]) {score++;}}return score;}// 添加按钮点击事件监听器button.addEventListener("click", () => {// 设置倒计时时间timer.textContent = "60";// 清空输入框和输出文本区域input.value = "";container.textContent = "";// 启动游戏startGame();});</script>
</body></html>

本期推荐

在这里插入图片描述

原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!


http://chatgpt.dhexx.cn/article/XOIqQBy9.shtml

相关文章

Android+按键精灵代码,安卓按键精灵怎么编写脚本 编写脚本教程

按键精灵评分&#xff1a; 大小&#xff1a;23.96MB 语言&#xff1a;简体中文 授权&#xff1a;免费版下载地址 在安卓上使用按键精灵&#xff0c;可以模拟我们抢红包、抢火车票&#xff0c;而且连自动签到也是可以的&#xff0c;只要我们编写好脚本就可以了。那么安卓按键精灵…

手游问道服务器维护到几点,问道手游10月27日更新什么?维护到几点?

问道手游10月27日更新什么内容&#xff1f;问道手游10月27日维护到几点&#xff1f;相信很多玩家想知道吧&#xff0c;接下来就跟随小编一起来看看吧&#xff0c;希望对大家有所帮助。 10月27号更新了什么内容 各位亲爱的道友&#xff1a; 为保证服务器的运行稳定和服务质量&am…

记一次小白的手游脚本破解过程及难题

最近因为一直有玩一个网游&#xff0c;发现一款直接内置进手游lua脚本的辅助。于是来了兴趣&#xff0c;开始研究。 这是那款辅助的安装包&#xff0c; 里面的文件是这样的&#xff0c;妈呀连个后缀都没有我要怎么弄&#xff0c;因为我也是个半懂不懂的小白&#xff0c;于是开始…

问道手游服务器维护,问道手游公测服务器版本更新维护公告

小编给大家带来了问道手游公测服务器版本更新维护公告&#xff0c;想了解更多问道手游攻略&#xff0c;敬请关注18183问道手游专区。 各位亲爱的道友&#xff1a; 为保证服务器的运行稳定和服务质量&#xff0c;《问道》手游所有公测服务器(内测专区除外)将于2017年03月02日04:…

问道手游服务器维护,问道手游停服维护公告

问道手游停服维护公告&#xff0c;问道手游是一款大型Q版MMORPG回合制手游&#xff0c;问道手游将在11月24日上午8点进行一次停服维护&#xff0c;期间将对之前测试时出现的一些问题进行修复&#xff0c;预计维护时间为一个小时&#xff0c;请玩家们注意开服时间。 问道手游海报…

手游自动挂机脚本开发历程

事件起因 国庆节期间&#xff0c;因为工作相对闲暇&#xff0c;自己鬼使神差地下载了一个梦幻西游手游玩了几天&#xff0c;结果一周就这么过去了&#xff0c;一玩起游戏来&#xff0c;那就是白驹过隙啊。节日过后&#xff0c;游戏自然是没时间再玩了&#xff0c;毕竟有一大堆…

问道手游服务器修改密码,问道手游账号安全设置及找回密码教程 玩转问道

问道手游账号安全设置及找回密码教程,小编教你畅玩问道!问道手游是一款非常受大家欢迎的回合制游戏,但是很多小伙伴们还不知道自己的雷霆账号怎么安全设置和找回密码,下面小编给大家带来的就是这方面的教程,希望能够帮助到大家。 运行游戏后在登录界面会显示雷霆游戏的SDK,在登…

《问道》手游职业选择攻略

问道手游道友们!是时候显示你的身手啦,在这激动人心的时刻&#xff0c;新手玩家们心中是不是在犹豫选择哪个职业比较好呢?就让迷糊给大家带来有关新手职业选择的推荐吧,希望能够帮大家&#xff01;《问道》手游新人职业选择攻略 金职业 外形炫酷,一身正义&#xff0c;也是众…

问道手游服务器修改,分享一下自己架设问道手游经验和教程【图文篇】

1.分享一下自己搭建问道的经验(以图文的形式来说下),如有写的不对的地方希望指正下。 2.搭建时所需要的东西。注意本帖都不提供资源下载,需要自己在论坛找 a.服务器一台 b.搭建环境 c.资源包(包括前端,启动端,游戏客户端) 3.服务器设置(本帖以腾讯云服务器windows service2…

问道手游服务器配置文件,问道手游脚本视频教程

问道手游脚本视频教程 [2021-02-15 06:06:16] 简介: php去除nbsp的方法:首先创建一个PHP代码示例文件;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐:《PHP视频教 系统运维 在数据…

问道手游-0基础架设教程

前言 本次教程使用的是问道魔改版的一个服务端、问道传奇、里面地图玩法基本与传奇类似 准备工具 1、Windows系统服务器一台 2、问道传奇服务端 开始架设 1、把准备好的问道传奇服务端解压到服务器D盘根目录记住必须得是根目录 不在根目录会导致快捷方式失效&#xff08;服务器…

问道手游加点模拟器 一个可用的在线版问道加点模拟器

问道手游加点模拟器 一个可用的在线版问道加点模拟器 问道手游是一款自由加点的游戏所以角色的加点就是玩家非常关注的。今天&#xff0c;虐游网专门为此制作了问道手游角色加点模拟器 &#xff0c;用来帮助玩家更好的对自己的角色进行加点&#xff0c;一起来看下吧。 欢迎各位…

Python做手游自动刷图脚本,问道手游目前很火,此脚本应用泛滥!

效果: 叙述: 所有玩刷副本类游戏的朋友都会觉得很枯燥,一次又一次的重复性工作甚至让许多朋友放弃了那款游戏。最近问道手游很火,网络上出现了许多自动刷道的脚本,但是这款例外,因为它是由脚本之王Python实现。 说明: 脚本:避免重复动作,模拟鼠标和键盘的操作 外挂…

5.IP地址介绍及VLSM

一、IPv4编址方案 IP(v4)地址由32位二进制数组成&#xff0c;这些位被划分为4个字节&#xff0c;中间用“.”号隔开&#xff0c;每组8位&#xff0c;以十进制数形式表示。分为网络地址和主机地址两个部分。 IP地址&#xff1a;192.168.1.1 子网掩码&#xff1a;255.255.255.0…

【计算机网络】基础概念总结7-VLSM可变长子网掩码

7 VLSM概念 上节说到我们使用无类域间路由&#xff08;Classless Inter-Domain Routing&#xff0c;CIDR&#xff09;可以将路由集中起来&#xff0c;在路由表中更灵活地定义地址。 它不区分 A 类、B 类、C 类地址&#xff0c;而是使用 CIDR 前缀的值指定地址中作为网络 ID 的…

计算机网络:pka实验——设计和实施VLSM划分

大学实验 实验九 设计和实施VLSM编制方案 实验目标&#xff1a; 掌握VLSM编址方法为设备规划与分配IP地址并检验连接 实验场景&#xff08;背景&#xff09;&#xff1a; 在本练习中&#xff0c;您需要在一个真实的网络中规划IP地址&#xff0c;使用 /24 网络地址设计 VLSM …

8.2.1.4 -设计和实施 VLSM 编址方案

没有废话&#xff0c;直接上过程 接下来根据要求&#xff0c;对网络进行子网划分 接下来根据划分&#xff0c;进行子网的配置&#xff1a; 1 此处是对路由器building1进行配置 对子网1进行分配 同样对子网2进行分配: 注意此处要根据实验要求进行分配&#xff1a; 此处要…

子网划分(VLSM)和子网汇总(CIDR)

IP地址的组成 IP地址由两部分组成&#xff1a;网络地址 主机地址 IP地址分为IPV4和IPV6地址 IPV4地址由32位的0和1组成&#xff0c;现在IPV4地址全球已经枯竭 IPV6地址由128位的0和1组成&#xff0c;IPV6的发明&#xff0c;让地球的每一粒沙子都有一个IP地址 IPv4地址&#xf…

计算机网络VLSM题型解题思路及过程

1.定义 VLSM&#xff1a;可变长度子网掩码 2.解题依据 &#xff08;1&#xff09;哪个子网需要的IP数量多&#xff0c;优先给谁分配。 &#xff08;2&#xff09;分配时&#xff0c;应该遵循从小到大依次分配原则。 3.举例说明 本人学习过程中使用的课本教材是谢希仁 编著…

VLSM(可变长子网掩码)

vlsm 百科名片 vlsm子网设计 VLSM(可变长子网掩码) 是为了有效的使用无类别域间路由&#xff08;CIDR&#xff09;和路由汇总来控制路由表的大小&#xff0c;网络管理员使用先进的IP寻址技术&#xff0c;VLSM就是其中的常用方式&#xff0c;可以对子网进行层次化编址&#xff0…