- UID
- 59635
注册时间2009-1-30
阅读权限30
最后登录1970-1-1
龙战于野
TA的每日心情 | 慵懒 2019-4-26 10:19 |
---|
签到天数: 14 天 [LV.3]偶尔看看II
|
自己写的CM V2.3玩的人很少,高手们不屑玩,新手们感到畏惧,干脆把自己的设计思路和大家分享下。高手不要笑话我哈~我是小菜鸟~
CM2.3里面用到的一个数学模型就是数独游戏,简单介绍下数独游戏吧,O(∩_∩)O~
数独的历史
数独前身为“九宫格”,最早起源于中国。数千年前,我们的祖先就发明了洛书,其特点较之现在的数独更为复杂,要求纵向、横向、斜向上的三个数字之和等于15,而非简单的九个数字不能重复。儒家典籍《易经》中的“九宫图”也源于此,故称“洛书九宫图”。而“九宫”之名也因《易经》在中华文化发展史上的重要地位而保存、沿用至今。
数独游戏规则
在9阶方阵中,包含了81个小格(九列九行),其中又再分成九个小正方形(称为宫),每宫有九小格。
游戏刚开始时,盘面上有些小格已经填了数字(称为初盘),游戏者要在空白的小格中填入1到9的数字,使得最后每行、每列、每宫都不出现重复的数字,而且每一个游戏都只有一个唯一的解答(称为终盘)。
我的设计思路其实很简单:
1.构造一个9*9的全局数组,当然前提是你必须确保这个的数组有解:
- var
- MyArr : array[1..9,1..9] 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[i] := abs(ord(UserName[i])-ord(RegCode[i]));
- end;
- //下面是把50个数字按顺序填入到数独里
- k := 1;
- for i:=1 to 9 do
- begin
- for j:= 1 to 9 do
- begin
- if MyArr[i][j] = 0 then
- begin
- MyArr[i][j] := TB[k];
- 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[i][j] 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 ) then reg1 := reg1+1;
- if (a2 <> 0 ) then reg1 := reg1+1;
- if (a3 <> 0 ) then reg1 := reg1+1;
- if (a4 <> 0 ) then reg1 := reg1+1;
- if (a5 <> 0 ) then reg1 := reg1+1;
- if (a6 <> 0 ) then reg1 := reg1+1;
- if (a7 <> 0 ) then reg1 := reg1+1;
- if (a8 <> 0 ) then reg1 := reg1+1;
- if (a9 <> 0 ) then reg1 := reg1+1;
- end;
-
复制代码 4.如果全部满足条件,则成功,否则失败。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入我们
x
评分
-
查看全部评分
|