求解九宫格的WEB应用程序

昨天想了一个点子,利用Delphi的DataSnap,结合HTML与JavaScript,用AJAX技术,实现WEB应用程序。今天又做了一个实验程序,比较成功。具体方法不多说了,上一篇已经讲过,直接帖上关键代码。

DataSnap的CGI程序代码(ServerMethod单元):

unit ServerMethodsUnit1;

interface

uses
  SysUtils, Classes, DSServer, DBXJSON;

var
  GG: array[0..8] of array[0..8] of Integer;
const
  QQ:array[0..8] of integer=(0,0,0,3,3,3,6,6,6);
var
  GG2: TJSONObject;

type
{$METHODINFO ON}
  JSShuDu = class(TPersistent)
  private
    { Private declarations }
  public
    { Public declarations }
    function EchoString(Value: string): string;
    function JieSuan(shudu: string): TJSONObject;
  end;
{$METHODINFO OFF}
function IsValid(i,j:integer):boolean;
procedure calc(n:integer);
function OutGG: TJSONObject;
procedure SetGG(shudu: string);

implementation
//检查九宫格是否合格
function IsValid(i,j:integer):boolean;
var n,t,u:integer;
begin
  Result:=true;
  n:=GG[i,j];
  for t := 0 to 9 - 1 do
    if(((t<>i) and (GG[t,j]=n)) or ((t<>j) and (GG[i,t]=n))) then result:=false;

  for t := QQ[i] to QQ[i]+2 do
    for u := QQ[j] to QQ[j] +2 do
      if(((t<>i) or (u<>j)) and (GG[t,u]=n)) then result:=false;
end;
//解算九宫格
procedure calc(n:integer);
var i,j,k:integer;
begin
  if(n=81) then
  begin
    GG2 := OutGG;
    Exit;
  end;

  i:=n div 9; j:=n mod 9;

  if(GG[i,j]<>0) then
  begin
    calc(n+1);
    exit;
  end;

  for k := 0 to 9 - 1 do
  begin
    GG[i,j]:=GG[i,j]+1;
    if(IsValid(i,j)) then
    begin
      calc(n+1);
    end;
  end;

  GG[i,j]:=0;
end;
//以JSON格式将九宫格输出
function OutGG: TJSONObject;
var
  I: Integer;
  j,temp: Integer;
begin
  Result := TJSONObject.Create;
  temp := 1;
  for I := 0 to 9 - 1 do
    for j := 0 to 9 - 1 do
      begin
        Result.AddPair(TJSONPair.Create('id'+IntToStr(temp),IntToStr(GG[i,j])));
        temp := temp+1;
      end;
end;
//初始化九宫格数组
procedure SetGG(shudu: string);
var
  I: Integer;
  j: Integer;
begin
  for I := 0 to 9 - 1 do
    for j := 0 to 9 - 1 do
      begin
        GG[i,j] := StrToInt(Copy(shudu,1,1));
        shudu := Copy(shudu,2,Length(shudu)-1);
      end;
end;

function JSShuDu.JieSuan(shudu: string): TJSONObject;
begin
  SetGG(shudu);
  calc(0);
  Result := GG2;
end;

function JSShuDu.EchoString(Value: string): string;
begin
  Result := Value;
end;

end.

HTML版的客服端代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>解算数独</title>

<script type="text/javascript" src="JQuery.js"></script>

<style type="text/css">

input{width:25px; margin:5px 5px;}

div{text-align:center; margin-top:50px;}

</style>

<script type="text/javascript">

$(document).ready(function(){   //页面加载时装入数据

var text=’040203050580001003000000002000000000650000890300006000200704000863000007009360000′;

var j=0;

$("input").each(function(){

         $(this).val(text[j]);

         j++;

         })

});

function JieSD()

{

var text=”;

$("input").each(function(){

        text=text+$(this).val();

        });

text=text.substring(0,text.length-2); //去掉input按钮的字

if(text==""){text=’040203050580001003000000002000000000650000890300006000200704000863000007009360000′;}

//alert(text);

$.ajax({

      type:"get",

      url:"http://127.0.0.1/cgi-bin/ShuDu.exe/DataSnap/rest/JSShuDu/jiesuan/"+text,

      dataType:"json",

      success:function(data){

       var i=1;

        $("input").each(function(){                     //遍历所有的input框

        $(this).val(data.result[0]["id"+i]); //常量与变量连接:"id"+i

        i++;

        });

      $(‘#button’).val(‘求解’);                       //恢复input按钮的字

      }

      });

}

</script>

</head>

<body>

<div>

<h3>输入九宫格数独,用0代替要求的数</h3>

</div>

<div id="main">

<input id="id1" /><input id="id2" /><input id="id3" /><input id="id4" /><input id="id5" /><input id="id6" /><input id="id7" /><input id="id8" /><input id="id9" /><br />

<input id="id10" /><input id="id11" /><input id="id12" /><input id="id13" /><input id="id14" /><input id="id15" /><input id="id16" /><input id="id17" /><input id="id18" /><br />

<input id="id19" /><input id="id20" /><input id="id21" /><input id="id22" /><input id="id23" /><input id="id24" /><input id="id25" /><input id="id26" /><input id="id27" /><br />

<input id="id28" /><input id="id29" /><input id="id30" /><input id="id31" /><input id="id32" /><input id="id33" /><input id="id34" /><input id="id35" /><input id="id36" /><br />

<input id="id37" /><input id="id38" /><input id="id39" /><input id="id40" /><input id="id41" /><input id="id42" /><input id="id43" /><input id="id44" /><input id="id45" /><br />

<input id="id46" /><input id="id47" /><input id="id48" /><input id="id49" /><input id="id50" /><input id="id51" /><input id="id52" /><input id="id53" /><input id="id54" /><br />

<input id="id55" /><input id="id56" /><input id="id57" /><input id="id58" /><input id="id59" /><input id="id60" /><input id="id61" /><input id="id62" /><input id="id63" /><br />

<input id="id64" /><input id="id65" /><input id="id66" /><input id="id67" /><input id="id68" /><input id="id69" /><input id="id70" /><input id="id71" /><input id="id72" /><br />

<input id="id73" /><input id="id74" /><input id="id75" /><input id="id76" /><input id="id77" /><input id="id78" /><input id="id79" /><input id="id80" /><input id="id81" /><br />

<input type="button" id="button" value="求解" style="width:80px;" onclick="JieSD();"/>

</div>

</body>

</html>

截图:

欲求解的九宫格

求解后的九宫格