小试锋芒 发表于 2009-12-24 22:28:01

CrackMe V2.3 的设计思路

自己写的CM V2.3玩的人很少,高手们不屑玩,新手们感到畏惧,干脆把自己的设计思路和大家分享下。高手不要笑话我哈~我是小菜鸟~

CM2.3里面用到的一个数学模型就是数独游戏,简单介绍下数独游戏吧,O(∩_∩)O~

数独的历史
        数独前身为“九宫格”,最早起源于中国。数千年前,我们的祖先就发明了洛书,其特点较之现在的数独更为复杂,要求纵向、横向、斜向上的三个数字之和等于15,而非简单的九个数字不能重复。儒家典籍《易经》中的“九宫图”也源于此,故称“洛书九宫图”。而“九宫”之名也因《易经》在中华文化发展史上的重要地位而保存、沿用至今。


数独游戏规则
在9阶方阵中,包含了81个小格(九列九行),其中又再分成九个小正方形(称为宫),每宫有九小格。
游戏刚开始时,盘面上有些小格已经填了数字(称为初盘),游戏者要在空白的小格中填入1到9的数字,使得最后每行、每列、每宫都不出现重复的数字,而且每一个游戏都只有一个唯一的解答(称为终盘)。



我的设计思路其实很简单:
1.构造一个9*9的全局数组,当然前提是你必须确保这个的数组有解:
var
MyArr : array of Byte =    ((0,0,9,0,6,0,0,0,0),
                                       (3,5,0,0,0,0,0,0,6),
                                       (7,6,2,0,3,8,0,0,0),
                                       (0,0,0,0,0,2,6,9,0),
                                       (4,3,0,0,9,0,0,8,5),
                                       (0,2,6,3,0,0,0,0,0),
                                       (0,0,0,9,5,0,4,3,1),
                                       (6,0,0,0,0,0,0,2,9),
                                       (0,0,0,0,2,0,5,0,0));
其中0表示要填入的数字,非0表示初盘。

2.通过用户名和注册码的简单运算得到即将要填入的数字,按顺序依次填入到数组中:
//用户名不足50位就一直重复为止
while LenUN < 50 do
begin
    UserName := UserName + UserName;
    LenUN := Length(UserName);
end;
UserName := LeftStr(UserName, 50);
//下面是计算出要填进去的50个数字
for i:= 1 to 50 do
begin
    tb := abs(ord(UserName)-ord(RegCode));
end;
//下面是把50个数字按顺序填入到数独里
k := 1;
for i:=1 to 9 do
begin
    for j:= 1 to 9 do
    begin
      ifMyArr = 0 then
      begin
      MyArr := TB;
      k := k+1;
      end;
    end;
end;3.检测填入的数字是否是1~9,每行、每列、每宫是否出现重复的数字。如:
//下面的循环是检测每一行的数字是不是1-9,并且是不重复的
for i := 1 to 9 do
begin
    a1:= 1; a2:=1; a3:=1; a4:=1; a5:=1; a6:=1; a7:=1; a8:=1; a9:=1;
    for j:=1 to 9 do
    begin
      case MyArr of
       1: a1:= a1-1;
       2: a2:= a2-1;
       3: a3:= a3-1;
       4: a4:= a4-1;
       5: a5:= a5-1;
       6: a6:= a6-1;
       7: a7:= a7-1;
       8: a8:= a8-1;
       9: a9:= a9-1;
      else
       reg := reg+1;
      end;
    end;
    if (a1 <> 0 )thenreg1 := reg1+1;
    if (a2 <> 0 )thenreg1 := reg1+1;
    if (a3 <> 0 )thenreg1 := reg1+1;
    if (a4 <> 0 )thenreg1 := reg1+1;
    if (a5 <> 0 )thenreg1 := reg1+1;
    if (a6 <> 0 )thenreg1 := reg1+1;
    if (a7 <> 0 )thenreg1 := reg1+1;
    if (a8 <> 0 )thenreg1 := reg1+1;
    if (a9 <> 0 )thenreg1 := reg1+1;
end;
4.如果全部满足条件,则成功,否则失败。

黑文 发表于 2009-12-24 22:33:18

膜拜下``

GGLHY 发表于 2009-12-24 22:35:34

厉害,学习了!!!!!

assume 发表于 2009-12-24 22:38:22

锋芒大侠的CM/:good学习啊

yanhuohua999 发表于 2009-12-24 23:42:11

厉害哈。。/:good 不敢想象的CM、。。不过偶喜欢玩这个游戏哈嘿嘿

HDd1145 发表于 2009-12-25 02:55:28

数独,我喜欢玩。

lixy8888 发表于 2009-12-25 07:18:32

支持开源哈

yayazhi 发表于 2009-12-25 08:14:29

强人/:good

lgjxj 发表于 2009-12-25 21:28:31

一看就知道完全搞不定,幸好没下 /:011

yangbing1990 发表于 2009-12-28 14:27:43

膜拜ing/:001
页: [1] 2
查看完整版本: CrackMe V2.3 的设计思路