用 JS 做一个数独游戏(二)

在 上一篇博客 中,我们通过 Node 运行了我们的 JavaScript 代码,在控制台中打印出来生成好的数独终盘。为了让我们的数独游戏能有良好的体验,这篇博客将会为生成好的数独终盘做一个比较完善的界面。最终的效果如下:

你也可以访问网页上的 demo 进行数独游戏的体验。

完善挖洞算法

上一篇博客 中提到过挖洞算法,实际上那并不完整,因为算法里面只有生成数独终盘的部分,并没有进行挖洞处理(也就是隐藏部分格子)。为了补充完整挖洞的算法,我们在 Game 对象里面加上随机隐藏格子的代码:

// class Game
/*** 挖去一部分格子,将属性设为隐藏*/
digBoard() {let dig = 0, block;for(let i = 0; i < 3; i++) {for(let j = 0; j < 3; j++) {for( let k = 0; k < this.digTimes; k++) {block = this.board.getBlockGrids(i, j);dig   = Math.floor( Math.random() * 9 );if( block[dig].isVisible() ) {// avoid duplicated hidingblock[dig].setVisible(false);} }}}// Utils.printAll(this.board);
}

实际上就是很简单的取随机数,在每个 block 块(一个块是一个 3x3 的大方格)中进行 n 次循环,每次循环都将随机的数作为索引,修改块中的 grid 对象的 visible 属性,将其设为隐藏。

挖洞法比较简单,通过预设的三种难度:

Game.DifficutyEasy = 1;
Game.DifficutyNormal = 2;
Game.DifficutyHard = 3;

每种难度隐藏不同数目的格子,然后只要将其显示在界面上即可。

编写界面代码

界面是用网页的方式实现的,主要的 html 代码如下:

<div align="center"><div id="gamediv" align="center"></div><div><p id="result-label" class="result-normal"></p></div><hr /><div id="time"><p id="time-label">00:00:00</p></div><div id="difficuty"><input type="radio" name="difficuty" value="1" onmouseup="changeDifficuty(this.value)" checked="checked" />Easy<input type="radio" name="difficuty" value="2" onmouseup="changeDifficuty(this.value)" /> Normal<input type="radio" name="difficuty" value="3" onmouseup="changeDifficuty(this.value)" /> Hard</div><div id="buttons"><button onclick="genBoard()" type="button">Restart game</button><button onclick="tu.startTimer()" type="button">Start Game</button></div>
</div>
<script src="./NumberPlaceCore.js"></script>
<script src="./game.js"></script>

预留了一个 div 用于显示数独棋盘。有用时记录,两个按钮,和难度选择。

数独棋盘的显示是由 JavaScript 代码完成的。首先查找页面中是否已有数独棋盘,若已有棋盘,则先将其删除,再重新创建,这样做是为了重新开始游戏后保证页面中只有一个棋盘。

let tBoard;
tBoard = document.getElementById("board");
if( tBoard ) {tBoard.remove();
}
tBoard = document.createElement("table");

然后通过循环依次创建各个格子,对于未显示的值的格子,将其用一个 input 组件表示,留给玩家填数字,最后将填充好的格子添加到预览的 div 中:

let tr, td, grid, value;
let ginput;
for(let i = 0; i < 9; i++) {tr = document.createElement("tr");for(let j = 0; j < 9; j++) {td = document.createElement("td");value = g.getValueAt(new Number(i), new Number(j));td.setAttribute("class", "grid-show");if( value ) {td.innerHTML = value;}else {ginput = document.createElement("input");inputs.push(ginput);// ... 省略部分代码td.appendChild(ginput);}tr.appendChild(td);}tBoard.appendChild(tr);
}gamediv.appendChild(tBoard);

其中有个 inputs 数组用于记录待填的格子,每当玩家向格子中填一个数,就会调用函数 placeGrid,将玩家填写的值传递给底层的 board 对象。每次填写数字时,都会判断一次是否所有的待填格子都已经填充完毕:

function checkInputs() {let valid = true;inputs.forEach( e => {if( !e.value ) {valid = false;}});return valid;
}

若该函数返回 true 的话,那么就应该提示用于游戏结束,给出结果,例如:

总结

这一部分其实比较简单,涉及到较多的内容是通过 JavaScript 代码对 DOM 进行操作。但是这部分代码仍然有些不足:

  1. 计时工具必须要手动点击 Start Game 按钮才会开始计时,可以考虑做成玩家进入界面时就开始计时,或者开始填充第一个数时计时。

  2. 缺乏一些提示,可以在提高待填格子数目的情况下,通过某个操作(比如说点击帮助按钮显示某个格子的值)来降低游戏难度,提高可玩性。

  3. 挖洞法的方法是随机的,不能确定是否在挖完之后的棋盘上填充数字时只有唯一解。

至此,一个简单的数独游戏就完成了。

转载于:https://www.cnblogs.com/brifuture/p/9361884.html

用 JS 做一个数独游戏(二)相关推荐

  1. html数独游戏制作,使用HTML5的dragdrop做一个数独游戏

    数独是很好玩的游戏,之前我用jQuery做了一个数独游戏,因为用javaScript来实现drag和drap非常麻烦,jQuery的UI提供了一套非常不错的drag和drap(以后就简称DnD算了), ...

  2. html js 做的小游戏,用js做一个小游戏平台 (一)

    记得上班写代码时,我们技术总监总说是要先"设计",那就先"设计"吧. ps:我是新手大家多多见谅. .网页游戏区域.就是说需要知道游戏在网页上的区域,如下: 在 ...

  3. php 写一个大富翁游戏,抽奖系列:如何用纯js做一个大富翁游戏

    话不多说,先上效果图: 功能点: 礼品的位置 小怪兽位置的变化(走路.转身和回退) 小怪兽的跳跃弧度 确定好功能点,接下来就是逐个击破: 1.渲染奖品 获取奖品数据后,建一个数组存放奖品的位置,通过遍 ...

  4. 如何用纯js做一个大富翁游戏

    下面这张是效果图: 先立个flag,一个星期内把这个坑填了 今天7月1号,建党节,在这个伟大的节日,我来填坑了. 这个游戏有以下几个难点: 1.礼品的位置 2.小怪兽位置的变化(走路.转身和回退) 3 ...

  5. python大作业数独_python做一个数独小游戏

    最近看了下python的一些知识,在这里记载一下. 1.首先是安装,在官网下载最新的版本3.6,安装的时候要注意在下面勾选上ADD TO PATH,安装的时候会自动写入到环境变量里面,如果没有勾选,可 ...

  6. 用js做一个数字华容道

    我很喜欢华容道啊,这次用js做一个 话不多说上代码 <!DOCTYPE html> <html><head><meta charset="UTF-8 ...

  7. 使用PixiJS做一个小游戏

    PixiJS PixiJS使用WebGL,是一个超快的HTML5 2D渲染引擎.作为一个Javascript的2D渲染器,Pixi.js的目标是提供一个快速的.轻量级而且是兼任所有设备的2D库. 官方 ...

  8. dx绘制2d图像_【教程】使用DX9做一个2D游戏(1)

    本文最先发表在贴吧,现在整理到此处,之后所有更新将在这里进行. by Chu @ XDU 2012/11/25 版权所有,禁止用于商业用途. 转载请注明出处. 用DX9做一个2D游戏显然不是一件容易的 ...

  9. “论解不了数独所以选择做个数独游戏这件事”

    有一天,小明同学在津津有味的逛力扣网站的时候,惊喜的发现了一个看似非常好下手的题目(万恶之源 T T). 于是小明同学又津津有味的写了解题思路. 像往常一样打开了Unity准备开始做. .(画UI) ...

最新文章

  1. Memcached深度分析
  2. JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作(《剑指offer》)
  3. 802.11n协议帧格式详解
  4. Android程序获得APP哈希值,Android – SMS Retriever API – 计算应用程序的哈希字符串问题...
  5. 前端学习(1413):多人管理33修改2(未能完结)
  6. 开源上网行为管理_做好企业上网行为管理作用大
  7. install openni2 on ubuntu
  8. LayoutInflater
  9. Angular 在洋葱圈的实践与思考
  10. SpringMVC设置不拦截静态资源css,js
  11. 进程与线程的区别与联系(经典面试题)
  12. TransCAD实用技术梗概
  13. 抖音JAVA工程师_字节跳动抖音社招后台开发工程师面经
  14. 美国林肯学院因遭勒索软件攻击后不堪重负被迫关闭
  15. java 实现 word 文档的在线编辑以及流转
  16. [RF] 安装好Robot Framework之后怎样让启动的界面后面不带命令行窗口,且图片以机器人显示...
  17. 阿里巴巴Java开发手册github地址
  18. panda3D学习之路
  19. 老派程序员浅谈Python的异常处理
  20. Day5,page30,total160

热门文章

  1. lnmp安装博客系统WordPress
  2. xilinx中IP核是灰色的 license为带美元的小锁
  3. 【原创】gooogleman亲自参与设计的三星Cortex A8 S5pv210 之Sate210核心板硬件用户手册(作者:gooogleman)...
  4. UI中的响应时间:3个重要的界限
  5. SQL Server 性能相关文章 BY GEERT VANHOVE
  6. docker 标记和推送镜像
  7. 干货 | 走进Node.js之启动过程剖析
  8. mysql-innodb 日志机制分析----写在死锁前面
  9. saltstack pkg模块用法
  10. SQL server(MSSQL)客户端工具登录数据库的两种命令行登录方式