数独游戏_Core代码段

   自己写来玩的,觉得记下来还是有点意义的,呵呵:

ExpandedBlockStart.gif SudukuGame
  1  // -------------------------------- //
  2  // 作者:不喝橙汁
  3  // 完成日期:09.12.30
  4  // -------------------------------- //
  5 
  6  public   class  Suduku_Core
  7  {
  8       private   int [] hole = new   int [ 81 ];
  9       private   int [][] test = new   int [ 9 ][ 9 ];
 10       private   int  nHole,N,num,X,Y,FillNum,Cnum;
 11      
 12       // Generator方法
 13       // 产生原始填充数独
 14       private   void  Generator()      
 15      {
 16          Cnum = 0 ;N = 9 ;nHole = 0 ;    
 17           int  count = 0 ;
 18          num = 10 + ( int )(Math.random() * 6 );   // 产生10到16之间的随机数,不包括16,也就是10到15的整数
 19          
 20           // while循环
 21           // 尝试在数组中填入符合数独规则的数字
 22           // 以此来减少树的分支,提高效率
 23          
 24           while (count != num)
 25          {
 26              X = ( int )(Math.random() * 9 );
 27              Y = ( int )(Math.random() * 9 );
 28              FillNum = 1 + ( int )(Math.random() * 9 );
 29               if (bPack(X,Y,FillNum))
 30              {
 31                  test[X][Y] = FillNum;
 32                  count ++ ;
 33              }
 34          }
 35      }
 36      
 37       // bPack方法
 38       // 判断是否可将 n 填入 M[y][x] 里
 39       private   boolean  bPack ( int  x,  int  y,  int  n)            
 40      {
 41           // for循环
 42           // 纵横判断
 43           for  ( int  i = 0 ; i < N; i ++ )                  // 若 M[0~N-1][x]
 44               if  (n  ==  test[x][i]  ||  n  ==  test[i][y])    // 或 M[y][0~N-1] 中已存在 n
 45                   return   false ;                    // 则返回 false
 46      
 47           // for循环
 48           // 区域判断
 49           int  D_X,D_Y,OrderNum;
 50          OrderNum = 9 * (x + 1 ) + (y + 1 );
 51          D_X = (( int )(x / 3 )) * 3 ;
 52          D_Y = (( int )(y / 3 )) * 3 ;
 53           for ( int  count = 0 ;count  !=   9 ;count ++ )
 54          {
 55               if (D_X == &&  D_Y == y)
 56                   continue ;
 57               if (test[(D_X + count / 3 )][(D_Y + count % 3 )] == n)
 58                   return   false ;
 59          }
 60          
 61           // 返回结果
 62           return   true ;
 63      }
 64 
 65       // fill方法
 66       // 此方法用来填充完整已有数子的数独    
 67       private   void  fill( int  num)   
 68      {
 69           if (Cnum == 81 )
 70          {
 71              print();
 72               return ;   // 表示填满返回
 73          }
 74           if (test[Cnum / 9 ][Cnum % 9 ] != 0 )
 75          {
 76               ++ Cnum;
 77              fill(Cnum);     // 位置不为0,填充下一个
 78               return ;
 79          }
 80           else
 81          {
 82               // 从1到9里面选择数字填进去
 83               for ( int  x = 1 ;x != 11 ;x ++ )     // x=10 是哨兵
 84              {
 85                   if (Cnum == 81 )
 86                  {
 87                       return ;   // 表示填满返回
 88                  }
 89                   if (x == 10   &&  Cnum != 0 )
 90                  {
 91                       -- Cnum;
 92                      test[(Cnum / 9 )][(Cnum % 9 )] = 0 ;
 93                       return ;   
 94                  }
 95 
 96                   if (bPack((Cnum / 9 ),(Cnum % 9 ),x))
 97                  {
 98                      test[(Cnum / 9 )][(Cnum % 9 )] = x;
 99                       ++ Cnum;
100                      fill(Cnum);
101                  }
102              }
103          }
104 
105      }
106      
107       // print方法
108       // 打印数组到屏幕
109       private   void  print()
110      {
111           for ( int  m = 0 ;m < 9 ;m ++ )
112          {
113              System.out.println();
114               for ( int  n = 0 ;n < 9 ;n ++ )
115              {
116                  System.out.print(test[m][n]);
117              }
118          }
119      }
120      
121       // getArry方法
122       // 获取生成的数组
123       public   int [][] getArry()
124      {
125          Generator();
126           // print();     // 此时打印的是原始的数独数组
127          fill(Cnum);
128           // print();     // 此时打印的是填充完整的数独
129           // cout<
130          System.out.println();
131          System.out.println( " OVER " );     // 打印完毕
132           return  test;
133      }
134      
135       public   static   void  main(String args[])
136      {
137          Suduku_Core test = new  Suduku_Core();
138          test.getArry();
139      }
140  };
141 
142 

虽然是用java写的,但是最重要的还是思想.

 

转载于:https://www.cnblogs.com/woodywu/archive/2010/01/07/1641533.html

你可能感兴趣的:(数独游戏_Core代码段)