九宫格数独游戏

九宫格数独游戏

一个九宫格数独游戏,以下是思路和html文件,由于水平有限没有使用什么比较高级的语法,都是一些基础的东西,所以代码比较长。

逻辑思路

1.生成数独游戏

思路是把数独理解成一个二维数组,只要每次游戏开始随机生成一个符合九宫格规则的9*9二维数组即可。(如果不随机就可以记答案,游戏就没意思了)

1.1输入原型数组,这个数组要符合规则

1.2打乱这个数组生成答案数组:使用能保持数组符合规则的打乱方式。比如我用的是1-3,4-6,7-9列以竖排为单位先各自内部打乱,再1-3,4-6,7-9,三个竖排为单位换位置,行的打乱方式也是同理。这种打乱方式可以让原数组的一个位置的数,可能出现在答案数组的任何一个位置,同时每次变换后,数组都符合九宫格规则

 

2.网页显示

两个问题:一是如何确定显示哪些已知数,二是以何种方式显示在网页中

2.1选已知数:其实可以理解为随机的选一些位置(数独游戏的已知数位置是可以变得),并将位置对应的答案数组中的数显示出来。这里我使用了9*9的控制数组,控制数组打乱后,凡是为1的位置,对应答案数组的数就要显示

2.1.1生成控制数组

[0,1,0,0]

[0,1,0,1]

[1,0,1,0]

[0,0,0,1]

这只一个4*4的例子而已,可以根据难度的需要调节1的数量

2.1.2打乱控制数组生成实际控制数组(目的是使已知数显示位置随机,且不会集聚)

使用1.2的打乱方式,只要初始控制数组每个单元格都有1,这个方式就不会出现1的位置聚在一起的情况。

2.2显示方式

2.2.1框架

我使用了在表格(table)中嵌套文本框的形式,这样的好处是后面容易获取填写的数据参与正误判断,且表格容易实现九宫格的效果,我无需添加许多css样式。

2.2.2已知数显示

控制数组为1的位置对应的表格位置内的文本框,value值设为对应答案数组值的,同时将这个文本框设为只读,这样文本框可以显示固定的已知值,玩家不能修改那个单元格

 

3.输入控制

限制只能输入一个数字1-9

实现:先正则表达式限制数字以外的东西,一旦输入onkeyup调用函数将value刷回为空

然后将输入数字parseInt,若为0,刷回空字符,若大于9,则%10取余

4.正误判断

我使用getelementId等方法,获取文本框的value,然后生成一个玩家数组,和答案数组进行是否相等的方式比较

具体实现:两个for循环,以及正误控制变量k,初始化为0,如果有一个位置数不相等,将k赋值为1,若循环结束后,k为1,则显示答错了,若k仍为0则显示恭喜答对了

 

5.答案显示

功能:这个功能是按下一个按钮后,所有文本框会显示答案,原理是调用onclick激活一个函数,用两个for循环,将9*9的答案刷如文本框的value

 

 

6.一些提升体验的功能

6.1再来一题功能,按钮onclick调用重新加载网页的函数

6.2难度选择功能,使用隐藏部分div,来实现四宫格和九宫格的各自出现

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>数独游戏</title>

<style type="text/css">
/*1.格式,使用类选择器(对应class)*/
/*1.1文本框格式*/
.wbk{
    width:50px; 
    height:50px;
    text-align:center;/*格式是把style="width:50px; height:50px;text-align:center"内的东西移出来*/
}
/*1.2div格式*/
.divgs{
    width:500px; 
    height:600px;
    background-color: rgba(0,0,0,0.1);/*前三位表示颜色,最后一位表示透明度*/
    margin:0 auto;/*设置margin,第一个参数表示顶部的距离为0,而第二个auto表示的是自动,即自动根据网页来居中。*/   
}
/*1.3table格式*/
.tablegs{
    width:200px; 
    height:200px;
    background-color: rgba(0,255,0,0.1);/*前三位表示颜色,最后一位表示透明度*/
    margin:0 auto;/*设置margin,第一个参数表示顶部的距离为0,而第二个auto表示的是自动,即自动根据网页来居中。*/   
}
/*1.4按钮格式*/
.angs{
    width:100px; 
    height:50px;
    background-color: rgba(0,0,255,0.1);/*前三位表示颜色,最后一位表示透明度*/
    margin:220 auto;/*设置margin,第一个参数表示顶部的距离为0,而第二个auto表示的是自动,即自动根据网页来居中。*/   
}

/*1.4表格一个的格式*/
.xgs{
    background-color: rgba(255,0,0,0.1);/*前三位表示颜色,最后一位表示透明度*/
}

/*2.属性选择器*/
/*用name为属性*/
input[name="c1"]
{
    background-color: rgba(255,255,51,1);;
}
</style>

<!--js代码-->
<script language="javascript">


//1.弄乱数组函数
  //1.1随机数生成:生成0-2范围内的整数
    function suiji2(){
      var a=0;
      a=parseInt(Math.random()*10000);
      var b=0;
      b=a%3;
      return b;
    }

  //1.2小九宫格内纵向打乱:横向9个不动,纵向0-2,3-5,6-8内部序号互换
    function zongmix2(shuzu2,x){//x负责调控0-2,3-5,6-8,第一个九宫格x为0,第二个x为3,第三个x为6,横向的y同理
      var sj=0;
      sj=suiji2();
      var zhongzhuan=new Array();
      zhongzhuan=shuzu2[sj+x];
      shuzu2[sj+x]=shuzu2[((sj+1)%3)+x];
      shuzu2[((sj+1)%3)+x]=zhongzhuan;
    }
    function quanzongmix2(shuzu2){
      zongmix2(shuzu2,0);
      zongmix2(shuzu2,3);
      zongmix2(shuzu2,6);
    }


  //1.3九大格纵向打乱:横向9个不动,0-2与3-5与6-8,3行为单位互换
      function dazongmix2(shuzu2){
      var sj=0;
      sj=suiji2();

      var dagesj=(sj*3);//大格之间行距为3,dagesui的值为0,3,6
      var zhongzhuan=new Array();;
      for (i=0;i<3;i++){
      zhongzhuan=shuzu2[dagesj+i];
      shuzu2[dagesj+i]=shuzu2[(dagesj+3+i)%9];
      shuzu2[(dagesj+3+i)%9]=zhongzhuan;
      }
    }


  //1.4小九宫格内横向打乱:纵向9个不动,横向0-2,3-5,6-8内部序号互换
    function hengmix2(shuzu2,y)
    {
      var sj=0;
      sj=suiji2(
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值