清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
//数独类
function Shudu(n, visibleCount){
this.n = n;
this.size = n*n;
this.count = (visibleCount <= this.size * this.size)
?visibleCount:this.size * this.size;
this.conflicts = new Array();//用于存储冲突的位置
this.results = new Array();//用于存储游戏结果
//产生内容
this.generateContent();
}
//产生内容
Shudu.prototype.generateContent = function(){
this.realMap = TwoDArray(this.size, this.size);
this.mask = TwoDArray(this.size, this.size);
for(var i=0;i<this.size;i++){
for(var j=0;j<this.size;j++){
//移除无效的数
var candinates = this.generateCandinates();
var relativeNums = this.getRelativeNums(i, j).nums;
for(var k=0;k<candinates.length;k++){
if(array_index(relativeNums, candinates[k]) != -1){
array_delete(candinates, candinates[k]);
k--;
}
}
//填入数字
if(candinates.length == 0){
i--;
continue;
}
this.realMap[i][j] = this.getCandinate(candinates);
}
}
//产生掩码
for(var i=0;i<this.count;i++){
var x = Math.floor(Math.random() * this.size);
var y = Math.floor(Math.random() * this.size);
if(this.mask[x][y] != 0){
i--;
continue;
}
this.mask[x][y] = 1;
}
//清除不可视区
for(var i=0;i<this.size;i++){
for(var j=0;j<this.size;j++){
if(this.mask[i][j] == 0){
var result = new ShuduResult(this.realMap[i][j], i, j);
this.results.push(result);
this.realMap[i][j] = 0;
}
}
}
}
//生成候选数数组
Shudu.prototype.generateCandinates = function(){
var candinates = new Array();
for(var i=0;i<this.size;i++){
candinates.push(i+1);
}
return candinates;
}
//获取关联数字及其位置
Shudu.prototype.getRelativeNums = function(x, y){
var relativeNums = new Array();
var positions = new Array();
//获取所有横向相关数字
for(var i=0;i<this.size;i++){
if(this.realMap[i][y] == 0 || i == x)
continue;
relativeNums.push(this.realMap[i][y]);
positions.push([i, y]);
//console.log("横向:%d", this.realMap[i][y]);
}
//获取所有纵向相关数字
for(var i=0;i<this.size;i++){
if(this.realMap[x][i] == 0 || i == y)
continue;
relativeNums.push(this.realMap[x][i]);
positions.push([x, i]);
//console.log("纵向:%d", this.realMap[x][i]);
}
//获取相同域中的相关数字
var range = this.getRange(x, y);
for(var i=range[0];i<range[1];i++){
for(var j=range[2];j<range[3];j++){
if(this.realMap[i][j] == 0 || (i == x && j == y))
continue;
relativeNums.push(this.realMap[i][j]);
positions.push([i, j]);
//console.log("域内:%d", this.realMap[i][j]);
}
}
return {nums:relativeNums, positions: positions};
}
//获取候选数
Shudu.prototype.getCandinate = function(candinates){
var index = Math.floor(Math.random() * candinates.length);
return array_remove(candinates, index);
}
//获取宫格范围
Shudu.prototype.getRange = function(x, y){
var range = [0, 0, 0, 0];
var k = Math.ceil((x + 1)/this.n);
range[0] = (k -1) * this.n;
range[1] = k * this.n;
k = Math.ceil((y + 1)/this.n);
range[2] = (k - 1) * this.n;
range[3] = k * this.n;
return range;
}
//插入新数
Shudu.prototype.insert = function(num, pos){
this.realMap[pos[0]][pos[1]] = num;
this.findConflicts(num, pos);
}
//查找冲突
Shudu.prototype.findConflicts = function(num, pos){
var relativeNums = this.getRelativeNums(pos[0], pos[1]);
var nums = relativeNums.nums;
var positions = relativeNums.positions;
var conflict = new Conflict(pos[0], pos[1]);
//查找冲突
for(var i=0;i<nums.length;i++){
if(num == nums[i]){
conflict.addPosition(positions[i][0], positions[i][1]);
}
}
this.addConflict(conflict);
}
//添加冲突
Shudu.prototype.addConflict = function(conflict){
var pos1 = conflict.getPos();
//移除之前相同位置的冲突
for(var i=0;i<this.conflicts.length;i++){
var pos2 = this.conflicts[i].getPos();
var positions = this.conflicts[i].getPositions();
if(pos2[0] == pos1[0] && pos2[1] == pos1[1]){
array_remove(this.conflicts, i);
return;
}
}
//添加新的冲突
if(conflict.getPositions().length == 0)
return;
this.conflicts.push(conflict);
}
//获取冲突列表
Shudu.prototype.getConflicts = function(){
return this.conflicts;
}
//判断是否可编辑
Shudu.prototype.visible = function(x, y){
return this.mask[x][y];
}
//获取元素在数组中的索引位置
function array_index(array, elem){
for(var i=0;i<array.length;i++){
if(array[i] == elem)
return i;
}
return -1;
}
//从数组中移除元素
function array_remove(array, index){
if(index >= 0 && index < array.length){
var result = array.splice(index, 1);
return result[0];
}
return null;
}
//从数组中删除元素
function array_delete(array, elem){
var index = array_index(array, elem);
if(index != -1){
array.splice(index, 1);
return true;
}
return false;
}
//生成二维数组
function TwoDArray(width, height){
array = new Array();
for(var i=0;i<width;i++){
var col = new Array();
for(var j=0;j<height;j++){
col.push(0);
}
array.push(col);
}
return array;
}
//冲突类
function Conflict(x, y){
this.pos = [x,y];
this.positions = new Array();
}
//添加冲突位置
Conflict.prototype.addPosition = function(x, y){
this.positions.push([x,y]);
}
//获取产生冲突的位置
Conflict.prototype.getPos = function(){
return this.pos;
}
//获取冲突位置列表
Conflict.prototype.getPositions = function(){
return this.positions;
}
/****游戏结果类****/
function ShuduResult(num, x, y){
this.num = num;
this.pos = [x, y];
}