Delphi 实现刘谦春晚魔术

看了博友的C# 实现刘谦春晚魔术很好,改成了delphi版的。

复制代码
  1 program Project1;
  2 
  3 {$APPTYPE CONSOLE}
  4 {$R *.res}
  5 
  6 uses
  7   System.SysUtils,
  8   System.Classes;
  9 
 10 var
 11   list, removeElement: TStringList;
 12   i, NameCount, insertIndex, directCount, sexCount: Integer;
 13   tmp, element, hiddenEle1, hiddenEle2: String;
 14 
 15 procedure Fun1(NameCount: Integer);
 16 begin
 17   if NameCount < list.Count then
 18   begin
 19     for i := 0 to NameCount - 1 do
 20     begin
 21       element := list[0]; // 获取第0个元素
 22       list.Delete(0); // 移除第0个元素
 23       list.Add(element); // 将第0个元素添加到最后
 24     end;
 25 
 26   end;
 27 end;
 28 
 29 procedure Fun2(forCount: Integer);
 30 begin
 31   // 被删除掉的三张牌
 32   removeElement := TStringList.Create;
 33   for i := 0 to forCount - 1 do
 34   begin
 35     removeElement.Add(list[0]);
 36     list.Delete(0);
 37   end;
 38   Writeln(Format('被删除掉的%D张牌:%s', [forCount, removeElement.CommaText]));
 39   Writeln('删除之后:' + list.CommaText);
 40 
 41   // 把拿到的三张牌插到中间
 42   Randomize;
 43   insertIndex := Random(list.Count - 1) + 1; // 生成一个介于第一个和倒数第二个位置之间的随机插入位置
 44   Writeln('插入位置:' + insertIndex.ToString);
 45   for i := removeElement.Count - 1 downto 0 do
 46   begin
 47     list.Insert(insertIndex, removeElement[i]);
 48   end;
 49 
 50 end;
 51 
 52 procedure Fun3();
 53 begin
 54   // 藏起来第一张牌
 55   hiddenEle1 := list.Strings[0];
 56   list.Delete(0);
 57 end;
 58 
 59 procedure Fun4(Count: Integer);
 60 begin
 61   for i := 0 to Count - 1 do
 62   begin
 63     list.Delete(0);
 64   end
 65 end;
 66 
 67 procedure Fun5();
 68 begin
 69   for i := 0 to 6 do
 70   begin
 71     element := list[0];
 72     list.Delete(0);
 73     list.Add(element);
 74   end;
 75 end;
 76 
 77 function Fun6(sexCount: Integer): string;
 78 var
 79   forCount: Integer;
 80 begin
 81   forCount := 0;
 82   if sexCount = 1 then
 83     forCount := 5 // 男生要5次
 84   else
 85     forCount := 4;
 86   for i := 0 to forCount - 1 do
 87   begin
 88     // 把第一张牌放到数组最后面 (好运留下来)
 89     element := list[0];
 90     list.Delete(0);
 91     list.Add(element);
 92 
 93     // 烦恼丢出去
 94     list.Delete(0);
 95   end;
 96   result := list[0];
 97 end;
 98 
 99 begin
100   try
101     try
102       list := TStringList.Create;
103       list.CommaText := 'A,B,C,D,A,B,C,D';
104       Writeln('初始牌组:' + list.CommaText);
105       Writeln('请输入你的名字有几个字:');
106       ReadLn(tmp);
107       NameCount := tmp.ToInteger;
108 
109       Fun1(NameCount);
110       Writeln('变化之后:' + list.CommaText);
111 
112       Fun2(3);
113       Writeln('插入三张牌后:' + list.CommaText);
114       Fun3();
115       Writeln('藏起来第一张牌后:' + list.CommaText);
116 
117       Writeln('北方-1 南方-2 不南不北-3,请输入对应数字:');
118       ReadLn(tmp);
119       directCount := tmp.ToInteger;
120       Fun2(directCount);
121       Writeln('南北方人后:' + list.CommaText);
122 
123       Writeln('男-1 女-2,请输入对应数字:');
124       ReadLn(tmp);
125       sexCount := tmp.ToInteger;
126       Fun4(sexCount);
127       Writeln('男女生后:' + list.CommaText);
128 
129       Fun5();
130 
131       Writeln('见证奇迹后:' + list.CommaText);
132 
133       Writeln('开始好运留下了 烦恼丢出去');
134       hiddenEle2 := Fun6(sexCount);
135       Writeln(Format('牌1:%s  牌2:%s', [hiddenEle1, hiddenEle2]));
136 
137       ReadLn;
138     except
139       on E: Exception do
140         Writeln(E.ClassName, ': ', E.Message);
141     end;
142 
143   finally
144     removeElement.Free;
145     list.Free;
146 
147   end;
148 
149 end.