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.如果全部满足条件,则成功,否则失败。 膜拜下`` 厉害,学习了!!!!! 锋芒大侠的CM/:good学习啊 厉害哈。。/:good 不敢想象的CM、。。不过偶喜欢玩这个游戏哈嘿嘿 数独,我喜欢玩。 支持开源哈 强人/:good 一看就知道完全搞不定,幸好没下 /:011 膜拜ing/:001
页:
[1]
2