JavaScript怎么设计一个二年级数独教学设计游戏?

javascript实现数独解法
转载 &更新时间:日 09:34:31 & 投稿:hebedich
数独(すうどく,Sūdoku)是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。
生生把写过的java版改成javascript版,第一次写,很不专业,见谅。唉,我是有多闲。
var Sudoku = {
&&& init: function (str) {
&&&&&&& this.blank = [];
&&&&&&& this.fixed = [];
&&&&&&& this.cell = [];
&&&&&&& this.trials=[];
&&&&&&& for (i = 0; i & 81; i++) {
&&&&&&&&&&& var chr = str.charCodeAt(i);
&&&&&&&&&&& if (chr == 48) {
&&&&&&&&&&&&&&& this.cell[i] = 511;
&&&&&&&&&&&&&&& this.blank.push(i);
&&&&&&&&&&& } else {
&&&&&&&&&&&&&&& this.cell[i] = 1 && chr - 49;
&&&&&&&&&&&&&&& this.fixed.push(i);
&&&&&&&&&&& }
&&& showBoard: function () {
&&&&&&& var board = "";
&&&&&&& for (var i = 0; i & 81; i++) {
&&&&&&&&&&& if (i % 9 == 0) {
&&&&&&&&&&&&&&& board = board.concat("\n");
&&&&&&&&&&& }
&&&&&&&&&&& board = board.concat("[");
&&&&&&&&&&& for (var j = 0; j & 9; j++) {
&&&&&&&&&&&&&&& if ((this.cell[i] && j & 1) == 1) {
&&&&&&&&&&&&&&&&&&& board = board.concat(String.fromCharCode(j + 49));
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& board = board.concat("]");
&&& check: function () {
&&&&&&& var checkpoint = [0, 12, 24, 28, 40, 52, 56, 68, 80];
&&&&&&& for (var i in checkpoint) {
&&&&&&&&&&& var r, b,
&&&&&&&&&&& r = b = c = this.cell[checkpoint[i]];
&&&&&&&&&&& for (j = 0; j & 8; j++) {
&&&&&&&&&&&&&&& c ^= this.cell[this.getX(checkpoint[i])[j]];
&&&&&&&&&&&&&&& b ^= this.cell[this.getX(checkpoint[i])[8 + j]];
&&&&&&&&&&&&&&& r ^= this.cell[this.getX(checkpoint[i])[16 + j]];
&&&&&&&&&&& }
&&&&&&&&&&& if ((r & b & c) != 0x1FF) {
&&&&&&&&&&&&&&&
&&&&&&&&&&& }
&&& bitCount: function (i) {
&&&&&&& var n = 0;
&&&&&&& for (var j = 0; j & 9; j++) {
&&&&&&&&&&& if ((i && j & 1) == 1)
&&&&&&&&&&&&&&& n++;
&&& numberOfTrailingZeros: function(i){
&&&&&&& var n = 0;
&&&&&&& for (var j = 0; j & 9; j++) {
&&&&&&&&&&& if ((i && j & 1) ==0)
&&&&&&&&&&&&&&& n++;
&&&&&&&&&&& else{
&&&&&&&&&&&&&&&
&&&&&&&&&&& }
&&&&&&&&&&&&&&
&&& updateCandidates: function () {
&&&&&&& for (var i in this.fixed) {
&&&&&&&&&&& var opt = 0x1FF ^ this.cell[this.fixed[i]];
&&&&&&&&&&& for (var j = 0; j & 24; j++) {
&&&&&&&&&&&&&&& this.cell[this.getX(this.fixed[i])[j]] &=
&&&&&&&&&&&&&&& //!notice
&&&&&&&&&&&&&&& if (this.cell[this.getX(this.fixed[i])[j]] == 0) {
&&&&&&&&&&&&&&&&&&& //console.log("Error-0 candidate:"+x[this.fixed[i]][j]);
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&& seekUniqueCandidate: function () {
&&&&&&& for (var bidx in this.blank) {
&&&&&&&&&&& var row = 0, col = 0, box = 0;
&&&&&&&&&&& for (i = 0; i & 8; i++) {
&&&&&&&&&&&&&&& row |= this.cell[this.getX(this.blank[bidx])[i]];
&&&&&&&&&&&&&&& box |= this.cell[this.getX(this.blank[bidx])[8 + i]];
&&&&&&&&&&&&&&& col |= this.cell[this.getX(this.blank[bidx])[16 + i]];
&&&&&&&&&&& }
&&&&&&&&&&& if (this.bitCount(this.cell[this.blank[bidx]] & ~row) == 1) {
&&&&&&&&&&&&&&& this.cell[this.blank[bidx]] &= ~
&&&&&&&&&&&&&&&
&&&&&&&&&&& }
&&&&&&&&&&& if (this.bitCount(this.cell[this.blank[bidx]] & ~col) == 1) {
&&&&&&&&&&&&&&& this.cell[this.blank[bidx]] &= ~
&&&&&&&&&&&&&&&
&&&&&&&&&&& }
&&&&&&&&&&& if (this.bitCount(this.cell[this.blank[bidx]] & ~box) == 1) {
&&&&&&&&&&&&&&& this.cell[this.blank[bidx]] &= ~
&&&&&&&&&&& }
&&& seekFilledable: function () {
&&&&&&& this.fixed = [];
&&var _del=[];
&&&&&&& for (var i in this.blank) {
&&&&&&&&&&& if (this.bitCount(this.cell[this.blank[i]]) == 1) {
&&&&&&&&&&&&&&& this.fixed.push(this.blank[i]);
&&&&&&&&&&&&&&& //console.log("fixed:"+this.blank[i]+"=&"+this.cell[this.blank[i]]);
&&&&&&&&&&&&&&& //this.blank.splice(i, 1);//to delete it in the loop would cause bug
&&&&_del.push(i);
&&&&&&&&&&& }
&&while(_del.length&0){
&&&this.blank.splice(_del.pop(), 1);
&&& seekMutexCell: function () {
&&&&&&& var two = [];
&&&&&&& for (var n in this.blank) {
&&&&&&&&&&& if (this.bitCount(this.cell[this.blank[n]]) == 2) {
&&&&&&&&&&&&&&& two.push(this.blank[n]);
&&&&&&&&&&& }
&&&&&&& for (var i = 0; i & two. i++) {
&&&&&&&&&&& for (var j = i + 1; j & two. j++) {
&&&&&&&&&&&&&&& if (this.cell[two[i]] == this.cell[two[j]]) {
&&&&&&&&&&&&&&&&&&& var opt = ~this.cell[two[i]];
&&&&&&&&&&&&&&&&&&& if (parseInt(two[i] / 9) ==parseInt(two[j] / 9)) {
&&&&&&&&&&&&&&&&&&&&&&& for (n = 0; n & 8; n++) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& this.cell[this.getX(two[i])[n]] &=
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& if ((two[i] - two[j]) % 9 == 0) {&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&& for (n = 8; n & 16; n++) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& this.cell[this.getX(two[i])[n]] &=
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& if ((parseInt(two[i] / 27) * 3 + parseInt(two[i] % 9 / 3)) == (parseInt(two[j] / 27) * 3 + parseInt(two[j] % 9 / 3))) {
&&&&&&&&&&&&&&&&&&&&&&& for (n = 16; n & 24; n++) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& this.cell[this.getX(two[i])[n]] &=
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& this.cell[two[j]] = ~
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&& basicSolve: function () {
&&&&&&& do {
&&&&&&&&&&& if (!this.updateCandidates(this.fixed)) {
&&&&&&&&&&&&&&& this.backForward();
&&&&&&&&&&& }
&&&&&&&&&&& this.seekUniqueCandidate();
&&&&&&&&&&& this.seekMutexCell();
&&&&&&&&&&& this.seekFilledable();
&&&&&&& } while (this.fixed.length != 0);
&&&&&&& return this.blank.length == 0;
&&& setTrialCell: function() {
&&&&&&& for (var i in this.blank) {
&&&&&&&&&&& if (this.bitCount(this.cell[this.blank[i]]) == 2) {
&&&&&&&&&&&&&&& var trialValue = 1 && this.numberOfTrailingZeros(this.cell[this.blank[i]]);
&&&&&&&&&&&&&&& var waitingValue = this.cell[this.blank[i]] ^ trialV
&&&&&&&&&&&&&&& //console.log("try:[" + this.blank[i] + "]-&" + (this.numberOfTrailingZeros(trialValue) + 1) + "#" + (this.numberOfTrailingZeros(waitingValue) + 1));
&&&&&&&&&&&&&&& this.cell[this.blank[i]] = trialV&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& this.trials.push(this.createTrialPoint(this.blank[i], waitingValue, this.cell));
&&&&&&&&&&&&&&&
&&&&&&&&&&& }
&&& backForward: function() {
&&&&&&& if (this.trials.length==0) {
&&&&&&&&&&& console.log("Maybe no solution!");
&&&&&&&&&&&
&&&&&&& var back = this.trials.pop();
&&&&&&& this.reset(back.data);
&&&&&&& this.cell[back.idx] = back.
&&&&&&& this.fixed.push(back.idx);
&&&&&&& //console.log("back:[" + back.idx + "]-&" + (this.numberOfTrailingZeros(back.val) + 1));
&&& reset: function(data) {
&&&&&&& this.blank=[];
&&&&&&& this.fixed=[];
&&&&&&& this.cell=data.concat();
&&&&&&& for (var i = 0; i & 81; i++) {
&&&&&&&&&&& if (this.bitCount(this.cell[i]) != 1) {
&&&&&&&&&&&&&&& this.blank.push(i);
&&&&&&&&&&& } else {
&&&&&&&&&&&&&&& this.fixed.push(i);
&&&&&&&&&&& }
&&& trialSolve: function() {
&&&&&&& while (this.blank.length!=0) {
&&&&&&&&&&& if (this.setTrialCell()) {
&&&&&&&&&&&&&&& this.basicSolve();
&&&&&&&&&&& } else {
&&&&&&&&&&&&&&& if (this.trials.length==0) {
&&&&&&&&&&&&&&&&&&& //console.log("Can't go backforward! Maybe no solution!");
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& } else {
&&&&&&&&&&&&&&&&&&& this.backForward();
&&&&&&&&&&&&&&&&&&& this.basicSolve();
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&& play: function() {
&&&&&&& console.log(this.showBoard());
&&&&&&& var start = new Date().getMilliseconds();
&&&&&&& if (!this.basicSolve()) {
&&&&&&&&&&& this.trialSolve();
&&&&&&& var end = new Date().getMilliseconds();
&&&&&&& console.log(this.showBoard());
&&&&&&& if (this.check()) {
&&&&&&&&&&& console.log("[" + (end - start) + "ms OK!]");
&&&&&&& } else {
&&&&&&&&&&& console.log("[" + (end - start) + "ms, cannot solve it?");
&&//return this.showBoard();
&&& getX:function(idx){
&&&&&&& var neighbors=new Array(24);
&&&&&&& var box=new Array(0,1,2,9,10,11,18,19,20);
&&&&&&& var r=parseInt(idx/9);
&&var c=idx%9;
&&var xs=parseInt(idx/27)*27+parseInt(idx%9/3)*3;
&&&&&&& var i=0;
&&&&&&& for(var n=0;n&9;n++){
&&&&&&&&&&& if(n==c)
&&&&&&&&&&& neighbors[i++]=r*9+n;
&&&&&&& for(var n=0;n&9;n++){
&&&&&&&&&&& if(n==r)
&&&&&&&&&&& neighbors[i++]=c+n*9;
&&&&&&& for(var n=0;n&9;n++){
&&&&&&&&&&& var t=xs+box[n];
&&&&&&&&&&& if(t==idx)
&&&&&&&&&&& neighbors[i++]=t;
&createTrialPoint:function(idx, val, board) {
&&&&&&& var tp = {};
&&&&&&& tp.idx =
&&&&&&& tp.val =
&&&&&&& tp.data = board.concat();
//Sudoku.init("");
//Sudoku.init("");
Sudoku.init("");
Sudoku.play();
以上就是关于使用javascript实现数独解法的全部代码了,希望大家能够喜欢。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具喜欢玩游戏,更喜欢研究游戏,用自己的双手编写自己的游戏世界
[html5游戏开发]数独游戏-完整算法-开源讲座
开言:本次讲一下数独游戏的开发,数独游戏是一个填数字的游戏,在一个9x9的方格内,这个9x9的大格子又可以分为9个3x3的小的九宫格,在这些格子内填写上1至9的数字,使得每一行,每一列,并且每个小的九宫格内的数字都不重复,游戏玩法简单,数字组合千变万化,所以玩起来特别有意思。在中国数独游戏似乎没那么流行,但是在日本这个游戏非常受欢迎,在通勤的电车上,经常能看到一些人一个手拿着一本数独游戏的书,另一个手拿着一支铅笔,就这么一路计算着。现在我用lufylegend.js引擎来将这款游戏搬到浏览器上来,游戏界面如下图所示。图1游戏分为两个阶段,第一个阶段,是比较简单的玩法,只需要横,竖,没有重复的数字就可以了,另一个高级阶段,还需要保证每一个小的九宫格内的数字也不重复。想挑战一下的朋友,可以点击下面的游戏链接试一下自己能通过几关。和之前的推箱子游戏一样,一共6关,游戏里也有排名系统,每过一关可以上传自己的成绩,跟大家比拼一下。制作开始一,首先,你需要下载lufylegend.js引擎下面是我在博客的lufylegend-1.6发布帖下面一步步来进入开发正题。二,游戏算法这个游戏,我们首先要解决的就是数字如何打乱的问题,因为不但要把数字打乱,还要保证这些数字被打乱后,依然符合数独的规则,然后在打乱的数字中隐藏一部分,就可以开始游戏了。我们先来看一组数字图2可以看到,在这组数字中,它的横,竖列上的数字都是不重复的。我们如何来把它的顺序打乱呢?不难看出,如果我们只把它的每一行打乱,那么它的完整性是不受影响的。同样,我们只把它的每一列进行打乱,它也是不会受到影响的。所以,要打乱它只需要以行和列为单位进行打乱就行了,算法如下。function randomNum01(lv){
var i,j,list = new Array(),result = new Array();
for(i=0;i&9;i++){
list.push([1,2,3,4,5,6,7,8,9]);
for(j=0;j.5?-1:1;});
var rand = new Array(0,1,2,3,4,5,6,7,8).sort(function(a,b){return Math.random()&.5?-1:1;});
for(i=0;i&9;i++){
for(j=0;j&9;j++){
result[i].push(list[i][rand[j]]);
for(i=0;i&9;i++){
for(j=0;j&& 0;
result[i][ran1] = 0;
ran1 = Math.random()*9 &&& 0;
result[ran1][i] = 0;
}上面的函数,我首先生成了一组有规律的数字,然后按照行和咧进行打乱,最后,随机拿掉一些数字。下面再看另一组数字。图3这种情况下,我们还要保证每个小九宫格内的数字的完整性,又要怎么做呢?在这里我有一种偷懒的算法,看下面的图4。图4我们将行和列每3个作为一个单位进行打乱,就很简单的达到了目的了,当然这只是一种偷懒的算法,如果你有更好的算法,欢迎一起讨论,我的算法如下。function randomNum02(lv){
var i,j,k,list = [],result = [],
for(i=0;i&9;i++){
list.push([1,2,3,4,5,6,7,8,9]);
for(j=0;j.5?-1:1;}).concat(
new Array(3,4,5).sort(function(a,b){return Math.random()&.5?-1:1;}),
new Array(6,7,8).sort(function(a,b){return Math.random()&.5?-1:1;})
for(i=0;i&9 i="" result="" push="" list="" rand="" i="" list="" rand="new" array="" 0="" 1="" 2="" sort="" function="" a="" b="" return="" math="" random=""&.5?-1:1;}).concat(
new Array(3,4,5).sort(function(a,b){return Math.random()&.5?-1:1;}),
new Array(6,7,8).sort(function(a,b){return Math.random()&.5?-1:1;})
result = [];
for(i=0;i&9;i++){
result.push([]);
for(j=0;j&9;j++){
result[i].push(list[i][rand[j]]);
for(i=0;i&9;i++){
for(j=0;j&& 0;
result[i][ran1] = 0;
ran1 = Math.random()*9 &&& 0;
result[ran1][i] = 0;
}三,判断数字的正确性当玩家将所有被取走的数字都恢复了之后,就要判断一下他们填写的数字是否正确,是不是符合数独的游戏规则,方法很简单,就是验证每一行,每一列,以及高级阶段的时候每个九宫格内的数字,是不是没有重复,下面是代码function checkWin(){
var check01,check02;
for(var i=0;i&9;i++){
check01 = [];
check02 = [];
for(var j=0;j&9 j="" if="" stagenumlist="" i="" j="" value=""& 0)check01.push(stageNumList[i][j].value);
if(stageNumList[j][i].value & 0)check02.push(stageNumList[j][i].value);
check01 = deleteEleReg(check01);
check02 = deleteEleReg(check02);
if(check01.length & 9)
if(check02.length & 9)
var stage = stageMenu[stageIndex];
if(stage.flag){
return checkWin02();
function checkWin02(){
for(var i=0;i&3;i++){
for(var j=0;j&3;j++){
if(!check_mini(i,j))
function check_mini(i2,j2){
var check_arr = [];
for(var i=i2*3;i&i2*3+3;i++){
for(var j=j2*3;j&j2*3+3;j++){
if(check_arr[stageNumList[i][j].value])
check_arr[stageNumList[i][j].value] = 1;
}这个游戏很简单,以上,整个游戏的核心算法都已经解决了。四,建一个开始画面如下。图4上次我也说了,使用lufylegend.js引擎做个界面,可以说毫无难度,代码如下。function GameLogo(){
base(this,LSprite,[]);
var self =
var logolist = [[1,1,1,1],[1,2,4,1],[1,4,2,1],[1,1,1,1]];
var bitmap,logoL
logoLayer = new LSprite();
bitmap = new LBitmap(new LBitmapData(imglist["logo"]));
bitmap.scaleX = bitmap.scaleY = 2;
logoLayer.addChild(bitmap);
self.addChild(logoLayer);
var social = new Social();
social.x = 60;
social.y = 500;
self.addChild(social);
labelText = new LTextField();
labelText.font = "HG行書体";
labelText.size = 14;
labelText.x = 50;
labelText.y = 650;
labelText.text = "- Html5 Game Engine lufylegend.js";
self.addChild(labelText);
labelText = new LTextField();
labelText.color = "#006400";
labelText.font = "HG行書体";
labelText.size = 14;
labelText.x = 50;
labelText.y = 700;
labelText.text = "http://www.lufylegend.com/lufylegend";
self.addChild(labelText);
self.addEventListener(LMouseEvent.MOUSE_UP,menuShow);
};这一次我用了一张图片做界面,代码就更简单了,文字显示依然是LTextField对象,使用方法请参考官方API文档。五,建一个选择画面如下。图5代码如下。function GameMenu(){
base(this,LSprite,[]);
var self =
menuLayer = new LSprite();
bitmap = new LBitmap(new LBitmapData(imglist["menu_back"]));
bitmap.scaleX = bitmap.scaleY = 2;
menuLayer.addChild(bitmap);
self.addChild(menuLayer);
labelText = new LTextField();
labelText.color = "#B22222";
labelText.font = "HG行書体";
labelText.size = 40;
labelText.x = 30;
labelText.y = 700;
labelText.stroke =
labelText.lineWidth = 4;
labelText.text = "Please select !!";
menuLayer.addChild(labelText);
for(var i=0;i&stageMenu.i++){
self.stageVsMenu(stageMenu[i]);
GameMenu.prototype.stageVsMenu = function(obj){
var self =
var menuButton = new LSprite();
var bitmap = new LBitmap(new LBitmapData(imglist["menu_stage"]));
menuButton.addChild(bitmap);
menuButton.x = obj.x * 220 + 30;
menuButton.y = obj.y * 200 + 50;
self.addChild(menuButton);
if(obj.open){
labelText = new LTextField();
labelText.color = "#ffffff";
labelText.font = "HG行書体";
labelText.size = 20;
labelText.x = 50;
labelText.y = 90;
menuButton.addChild(labelText)
labelText.text = "第"+(obj.index+1)+"关";
labelText = new LTextField();
labelText.color = "#ffffff";
labelText.font = "HG行書体";
labelText.size = 12;
labelText.x = 30;
labelText.y = 30;
menuButton.addChild(labelText)
labelText.text = "times:"+obj.
menuButton.obj =
menuButton.addEventListener(LMouseEvent.MOUSE_UP,function(event,self){
gameStart(self.obj.index);
labelText = new LTextField();
labelText.color = "#ffffff";
labelText.font = "HG行書体";
labelText.size = 20;
labelText.x = 60;
labelText.y = 40;
menuButton.addChild(labelText)
labelText.text = "???";
}好了,游戏基本的代码已经都贴出来了。源码下面提供完整游戏源代码,想研究一下的朋友可以点击下面的连接下载。注意:该附件只包含本次文章源码,lufylegend.js引擎请到进行下载。转载请注明:欢迎继续关注我的博客
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!BINGO游戏中5*5的卡片上数字是这样的:第一行5个格分别为B、I、N、G、O五个字母,下面是5行5列,通常在1-15中选择B对应的数字,16-30中选择I对应的数字,31-45中选择N对应的数字,46-60中选择G对应的数字,61-75中选择O对应的数字,而且每一类是不能重复的。
下面用js实现的该卡片上数字随机生成的过程:
一个jsp页面,用来显示卡片,代码如下:
&%@ page language="java" import="java.util.*" pageEncoding="utf-8"%&
&!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&
&title&&/title&
&link rel="stylesheet" rev="stylesheet" href="&%=request.getContextPath() %&/css/bingo.css" &
&script type="text/javascript" src="&%=request.getContextPath() %&/js/bingo.js"
charset="GBK"&&/script&
&h1&Create A Bingo Card&/h1&
&table border="1"&
&td width="20%"&B&/td&
&td width="20%"&I&/td&
&td width="20%"&N&/td&
&td width="20%"&G&/td&
&td width="20%"&O&/td&
&td id="square0"&&&/td&
&td id="square1"&&&/td&
&td id="square2"&&&/td&
&td id="square3"&&&/td&
&td id="square4"&&&/td&
&td id="square5"&&&/td&
&td id="square6"&&&/td&
&td id="square7"&&&/td&
&td id="square8"&&&/td&
&td id="square9"&&&/td&
&td id="square10"&&&/td&
&td id="square11"&&&/td&
&td id="free"&Free&/td&
&td id="square12"&&&/td&
&td id="square13"&&&/td&
&td id="square14"&&&/td&
&td id="square15"&&&/td&
&td id="square16"&&&/td&
&td id="square17"&&&/td&
&td id="square18"&&&/td&
&td id="square19"&&&/td&
&td id="square20"&&&/td&
&td id="square21"&&&/td&
&td id="square22"&&&/td&
&td id="square23"&&&/td&
&a href="bingo.jsp" id="reload"&Click here&/a& to create a new card&/p&
bingo.css代码如下:
background-color:
font-size:20
font-family:"Lucida Grande",Verdana,Arial,Helvetica,sans-
font-family:Georgia,"Times New Roman",Times,
font-size:28
border-collapse:
padding:10
border:2px #666
text-align:
font-size:24
background-color:#F66;
bigno. js代码如下:
window.onload = initA
var usednums=new Array(76);
function initAll(){
if(document.getElementById){
document.getElementById("reload").onclick=//点击链接时,执行anothercard这段js代码,不去从服务器重新加载页面
newcard();
alert("Sorry,you browser doesn't support this script!");
function newcard(){
for(var i=0;i&24;i++){
setSquare(i);
function setSquare(thissquare){
var currentsquare="square"+
var colplace=new Array(0,1,2,3,4,0,1,2,3,4,0,1,3,4,0,1,2,3,4,0,1,2,3,4);
var colbasis = colplace[thissquare]*15;
var newnum=colbasis + getnewnum() +1;
//确保B列为1-15 I列是16-30 N列为31-45 G列为46-60 O列为61-75,且不重复
}while(usednums[newnum])
usednums[newnum] =
document.getElementById(currentsquare).innerHTML=
function getnewnum(){
return Math.floor(Math.random()*15);
* 该函数将usednum数组中的元素重置为FALSE,这样就可以重新使用所有数字
* 调用newcard函数重新生成数字
* return FALSE;使浏览器不尝试装载链接的href
function anothercard(){
for(var i=1;i&usednums.i++){
usednums[i]=
newcard();
生成如下:
浏览: 315234 次
来自: 北京
楼主好,有一个问题请教。对于第二段示例代码,楼主说到“如果字符 ...
可以选择用迭代器来删除。
代码那叫壹個乱,就不能用下高亮工具嘛...
严重误导别人!,你是不知道什么是空白符呢还是写错了呢?你把/s ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
JavaScript九宫格数独生成算法Script
摘要:前几天突然想写一个数独游戏。本来以为没什么难度。结果实现起来还是花了一点功夫。要做数据游戏,并不是随意地在九宫格里放一些数字让玩家来填写。一是你得保证你放的数字符合数独的规则。二是你得保证你的数独是有解的。所以在开始一局数独游戏之前,你要生成一个完整的数独,然后从中扣掉一些数字。让用户来填写。数独规则:数独(すうどく,Sūdoku),是源自18世纪瑞士发明,流传到美国,再由日本发扬光大的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9&9盘面上的已
前几天突然想写一个数独游戏。本来以为没什么难度。结果实现起来还是花了一点功夫。要做数据游戏,并不是随意地在九宫格里放一些数字让玩家来填写。一是你得保证你放的数字符合数独的规则。二是你得保证你的数独是有解的。
所以在开始一局数独游戏之前,你要生成一个完整的数独,然后从中扣掉一些数字。让用户来填写。
数独(すうどく,Sūdoku),是源自18世纪瑞士发明,流传到美国,再由日本发扬光大的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9&9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。 数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。
本文介绍生成数独的算法。
先来一个九宫格的图,方便看着它思考。
一共九九八十一个格子,算法主要思路。为每一个格子填上一个符合数独条件的值。
数组以左上角为圆点,横为x轴,竖为y轴 &在数组中对应的下标为:
11 &21 &31 & & &41 &51 &61 & & &71 &81 &9112 &22 &32 & & &42 &52 &62 & & &72 &82 &9213 &23 &33 & & &43 &53 &63 & & &73 &83 &9314 &24 &34 & & &44 &54 &64 & & &74 &84 &94 &15 &25 &35 & & &45 &55 &65 & & &75 &85 &95 &16 &26 &36 & & &46 &56 &66 & & &76 &86 &9617 &27 &37 & & &47 &57 &67 & & &77 &87 &97 &18 &28 &38 & & &48 &58 &68 & & &78 &88 &98 &19 &29 &39 & & &49 &59 &69 & & &79 &89 &99 &
随机生成一个值填入数组。 &
随机生成下一个值。判断不在数组中其所在横、竖、三宫格对应的下标里。获取横、竖、三宫的的下标使用过的值,算其可用的数字。随机取可用数字中的一个。如果没有可用数字,本次循环失败,回到开始重新算。
循环生成下一个值
直到81个下标位置都有符合条件的值。数独数组就生成完毕了!
然后我做了一点优化:
其实对于最开始的一些值,可以不用判断那么多,只需要把1-9乱序,依次放入九个格子中去。 我的做法是先在对角线上的三宫乱序依次放入1-9。就可以只用很少的计算量得出来27个值。因为对角线上填的值,不会互相影响。没有横竖的影响。
生成了这27个值之后,再使用上面的算法来计算,计算量少了不少,计算效率和成功率就大了很多了。
随机测试了几次,看我console出来的结果:
数独生成完毕,耗时:0.972秒!
数独生成完毕,耗时:0.081秒!
数独生成完毕,耗时:1.305秒!
数独生成完毕,耗时:0.102秒!
数独生成完毕,耗时:0.065秒!
数独生成完毕,耗时:0.813秒!
还是不算慢吧。
核心代码,从完整的里面扣出来的:
createSdArr:function(){
//生成数独数组。
var that =
this.sdArr = [];
this.setThird(2,2);
this.setThird(5,5);
this.setThird(8,8);
var allNum = [1,2,3,4,5,6,7,8,9];
for(var i=1;i&=9;i++){
for(var j=1;j&=9;j++){
if(this.sdArr[parseInt(i+''+j)]){
var XArr = this.getXArr(j,this.sdArr);
var YArr = this.getYArr(i,this.sdArr);
var thArr = this.getThArr(i,j,this.sdArr);
var arr = getConnect(getConnect(XArr,YArr),thArr);
var ableArr = arrMinus(allNum,arr);
if(ableArr.length == 0){
this.createSdArr();
//如果生成的重复了就重新生成。
item = ableArr[getRandom(ableArr.length)-1];
}while(($.inArray(item, arr)&-1));
this.sdArr[parseInt(i+''+j)] =
this.backupSdArr = this.sdArr.slice();
}catch(e){
//如果因为超出浏览器的栈限制出错,就重新运行。
that.createSdArr();
} }, getXArr:function(j,sdArr){
//获取所在行的值。
var arr = [];
for(var a =1;a&=9;a++){
if(this.sdArr[parseInt(a+&&+j)]){
arr.push(sdArr[parseInt(a+&&+j)])
}, getYArr:function(i,sdArr){
//获取所在列的值。
var arr = [];
for(var a =1;a&=9;a++){
if(sdArr[parseInt(i+''+a)]){
arr.push(sdArr[parseInt(i+''+a)])
}, getThArr:function(i,j,sdArr){
//获取所在三宫格的值。
var arr = [];
var cenNum = this.getTh(i,j);
var thIndexArr = [cenNum-11,cenNum-1,cenNum+9,cenNum-10,cenNum,cenNum+10,cenNum-9,cenNum+1,cenNum+11];
for(var a =0;a&9;a++){
if(sdArr[thIndexArr[a]]){
arr.push(sdArr[thIndexArr[a]]);
}, getTh:function(i,j){
//获取所在三宫格的中间位坐标。
var cenArr = [22,52,82,25,55,85,28,58,88];
var index = (Math.ceil(j/3)-1) * 3 +Math.ceil(i/3) -1;
var cenNum = cenArr[index];
return cenN }, setThird:function(i,j){
//为对角线上的三个三宫格随机生成。
var numArr = [1,2,3,4,5,6,7,8,9];
var sortedNumArr= numArr.sort(function(){return Math.random()-0.5&0?-1:1});
var cenNum = parseInt(i+''+j);
var thIndexArr = [cenNum-11,cenNum-1,cenNum+9,cenNum-10,cenNum,cenNum+10,cenNum-9,cenNum+1,cenNum+11];
for(var a=0;a&9;a++){
this.sdArr[thIndexArr[a]] = sortedNumArr[a];
生成的完整数独是这样:
这篇就介绍这么多。欢迎留言交流。
也可以自己去试玩下这个数独:
http://runningls.com/demos/2016/soduku/
看完整代码可以到我的github。
https://github.com/liusaint/games/tree/master/soduku
最近刚开始弄的,五月份要去上海找工作了,要show code了啊。
生成数独数组之后,后续工作是从中扣除一定数量的值,然后让用户填写。
然后检测用户输入是不是符合数独规则。(并不是直接和我们生成的数组对比,考虑到可能有不同的解法。)
另外解数独跟生成数独的方法也是差不多的。
转载请注明出处:http://blog.csdn.net/liusaint1992/article/details/&因为文章可能会修改。
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
邮箱低至5折
推荐购买再奖现金,最高25%
&200元/3月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
JavaScript九宫格数独生成算法Script相关信息,包括
的信息,所有JavaScript九宫格数独生成算法Script相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International

我要回帖

更多关于 数独游戏设计 的文章

 

随机推荐