js实现一个猜数字游戏


Posted in Javascript onMarch 31, 2017

看你需要猜几次才能猜到那个正确的数字!

效果图:

js实现一个猜数字游戏

代码如下:

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title>猜数字游戏</title>
    <script type="text/javascript" charset="utf-8">
      window.onload = newgame; //页面载入的时候就开始一个新的游戏
      window.onpopstate = popState; //处理历史记录相关事件
      var state, ui; //全局变量,在newgame()方法中会对其初始化
      function newgame(playagain) {
        ui = {
          heading: null, //文档最上面的<h1>元素
          prompt: null, //要求用户输入一个猜测数字
          input: null, //用户输入猜测数字的地方
          low: null, //可视化的三个表格单元格
          mid: null, //猜测的数字范围
          high: null,
        };
        //查询这些元素中每个元素的id
        for(var id in ui) ui[id] = document.getElementById(id);
        //给input字段定义一个事件处理程序函数
        ui.input.onchange = handleGuess;
        //生成一个随机的数字并初始化游戏状态
        state = {
          n: Math.floor(99 * Math.random())+1, //整数: 0 < n <100
          low: 0, //可猜数字范围下限
          high: 100, //可猜数字范围上限
          guessnum: 0, //猜测的次数
          guess: undefined //最后一次猜测
        };
        //修改文档内容来显示该初始状态
        display(state);
        if (playagain === true)save(state);
      }
      function save(state) {
        if (!history.pushState) return; //如果pushState()方法没有定义,则什么也不做

        //将一个保存的状态和url关联起来
        var url = "#guess" + state.guessnum;

        history.pushState(state, //要保存的状态对象
        "", //状态标题:当前浏览器会忽视它
        url); //状态URL:对书签是没有用的
      }
      //这是onpopstate的事件处理程序,用于恢复历史状态
      function popState(event) {
        if (event.state) {
          //如果事件有一个状态对象,则恢复该状态
          state = event.state; //恢复历史状态
          display(state); //显示恢复的状态
        }else{
          history.replaceState(state, "", "#guess" + state.guessnum);
        }
      };
      //每次猜测一个数字的时候,都会调用此事件处理程序
      //此处理程序用于更新游戏的状态、保存游戏状态并显示游戏状态
      function handleGuess() {
        //从input字段中获取用户猜测的数字
        var g = parseInt(this.value);
        //如果该值是限定范围中的一个数字
        if ((g > state.low) && (g < state.high)) {
          //对应的更新状态
          if (g < state.n) state.low =g;
          else if (g > state.n) state.high = g;
          state.guess = g;
          state.guessnum++;
          //在浏览器历史记录中保存新的状态
          save(state);
          //根据用户猜测情况来修改文档
          display(state);
        }else{
          //无效的猜测:不保存状态
          alert("请输入大于" + state.low + "和小于" + state.high);
        }
      }
      //修改文档来显示游戏当前状态
      function display(state) {
        //显示文档的导航和标题
        ui.heading.innerHTML = document.title ="我在想一个" + state.low + "到" + state.high + "之间的数字!";

        //使用一个表格来显示数字的取值范围
        ui.low.style.width = state.low + "%";
        ui.mid.style.width = (state.high-state.low) + "%";
        ui.high.style.width = (100-state.high) + "%";

        //确保input字段是可见的、空的并且是聚焦的
        ui.input.style.visibility = "visible";
        ui.input.value = "";
        ui.input.focus();

        //根据用户最近猜测,设置提示
        if (state.guess === undefined)
          ui.prompt.innerHTML = "输入你的猜测:";
        else if (state.guess < state.n)
          ui.prompt.innerHTML = state.guess + "低了,再猜一次:";
        else if (state.guess > state.n)
          ui.prompt.innerHTML = state.guess + "高了,再猜一次:";
        else {
          //当猜对了的时候,就隐藏input字段并显示“再玩一次”按钮
          ui.input.style.visibility = "hidden";
          ui.heading.innerHTML = document.title = state.guess + "正确!";
          ui.prompt.innerHTML = "你赢了 <button onclick='newgame(true)'>再玩一次</button>";
        }
      }
    </script>
    <style>
      #prompt { font-size: 16pt;}
      table { width: 90%; margin:10px; margin-left:5%;}
      #low, #high { background-color:lightgray; height:1em; }
      #mid { background-color:green;}
    </style>
  </head>
  <body>
    <h1 id="heading">我在想一个数字...</h1>
    <table>
      <tr>
        <td id="low"></td>
        <td id="mid"></td>
        <td id="high"></td>
      </tr>
    </table>
    <label id="prompt"></label>
    <input id="input" type="text">
  </body>
</html>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
jQuery实现contains方法不区分大小写的方法
Feb 13 Javascript
JavaScript判断是否为数字的4种方法及效率比较
Apr 01 Javascript
用NODE.JS中的流编写工具是要注意的事项
Mar 01 Javascript
JavaScript动态添加css样式和script标签
Jul 19 Javascript
微信小程序 Page()函数详解
Oct 17 Javascript
jquery拼接ajax 的json和字符串拼接的方法
Mar 11 Javascript
图解Javascript——作用域、作用域链、闭包
Mar 21 Javascript
微信小程序 页面跳转传值实现代码
Jul 27 Javascript
p5.js入门教程之平滑过渡(Easing)
Mar 16 Javascript
vue中将html字符串转换成html后遇到的问题小结
Dec 10 Javascript
Vue中的nextTick作用和几个简单的使用场景
Jan 25 Vue.js
React服务端渲染原理解析与实践
Mar 04 Javascript
微信小程序页面间通信的5种方式
Mar 31 #Javascript
ES6新特性之Symbol类型用法分析
Mar 31 #Javascript
微信小程序 后台登录(非微信账号)实例详解
Mar 31 #Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
Mar 31 #Javascript
ES6新特性之Object的变化分析
Mar 31 #Javascript
ES6新数据结构Set与WeakSet用法分析
Mar 31 #Javascript
ES6新数据结构Map功能与用法示例
Mar 31 #Javascript
You might like
php中使用__autoload()自动加载未定义类的实现代码
2013/02/06 PHP
深入PHP magic quotes的详解
2013/06/17 PHP
ThinkPHP快速入门实例教程之数据分页
2014/07/01 PHP
合格的PHP程序员必备技能
2015/11/13 PHP
Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作
2017/06/30 PHP
jQuery使用手册之 事件处理
2007/03/24 Javascript
javascript下arguments,caller,callee,call,apply示例及理解
2009/12/24 Javascript
利用js 进行输入框自动匹配字符的小例子
2013/06/29 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
innerHTML动态添加html代码和脚本兼容多个浏览器
2014/10/11 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
Bootstrap导航条的使用和理解3
2016/12/14 Javascript
利用Angular+Angular-Ui实现分页(代码加简单)
2017/03/10 Javascript
简述Angular 5 快速入门
2017/11/04 Javascript
JavaScript实现为事件句柄绑定监听函数的方法分析
2017/11/14 Javascript
Node层模拟实现multipart表单的文件上传示例
2018/01/02 Javascript
PHPStorm中如何对nodejs项目进行单元测试详解
2019/02/28 NodeJs
vue 实现小程序或商品秒杀倒计时
2019/04/14 Javascript
微信小程序点击view动态添加样式过程解析
2020/01/21 Javascript
浅析vue cli3 封装Svgicon组件正确姿势(推荐)
2020/04/27 Javascript
Ajax获取node服务器数据的完整步骤
2020/09/20 Javascript
[01:09]DOTAPLUS——DOTA2的新时代
2018/04/04 DOTA
[55:16]Mski vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
Python 26进制计算实现方法
2015/05/28 Python
python实现识别相似图片小结
2016/02/22 Python
python配置grpc环境
2019/01/01 Python
ERLANG和PYTHON互通实现过程详解
2019/07/05 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
wxPython实现整点报时
2019/11/18 Python
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
MIXIT官网:俄罗斯最大的化妆品公司之一
2020/01/25 全球购物
Vuori官网:运动服装的终级表现
2021/01/27 全球购物
初一科学教学反思
2014/01/27 职场文书
工程负责人任命书
2014/06/06 职场文书
行政处罚告知书
2015/07/01 职场文书
导游词之五台山
2019/10/11 职场文书