玩转扑克牌游戏 B

芜湖试卷的玩牌编程“一扎纸牌N张,从上到下编号为1~N,现将第一张丢掉,第二张放在纸牌的最后,现将第三张丢掉,将第四张放在最后,如此下去,直到手中只剩下一张牌,编程求这张牌原来是几号。”事实上与扑克牌没有半点关系,这只不过是对
1~N 号数字按上述规则取舍、换位的过程。编写成 MSWLogo-FMSLogo
程序如下:
TO C :N
MAKE "L []
;建立一个储存顺序牌号的空表
FOR[I 1 :N][MAKE "L SE :L
:I] ;建立1~N顺序数字表
C1 :L
;用递归模拟玩牌过程
END
TO C1 :L
;模拟玩牌的递归
IF (COUNT :L)=1 [PR :L STOP]
;在只剩下一张牌时输出表中的牌号
MAKE "L BF :L
;规则:将第一张牌丢掉
MAKE "L SE BF :L FIRST :L
;规则:将面上的牌放到最后
C1 :L ;不断循环以上过程
END
这种“玩牌”游戏输出的结果有些令人出乎意料。例如 C
8输出的结果就是8 , 说明最后留下来的是第 8 张牌。C 36输出的也是 8
。扑克牌只有54张,但是这个程序对有多少张牌是没有限制的。C 3000
是对3000张牌进行洗牌,剩下的是第1904张。等等……大家可以自己随意玩一玩试一试。
PCLogo的源程序:
TO C :N
MAKE "L []
;建立一个储存顺序牌号的空表
FOR "I 1 :N[MAKE "L SE :L
:I] ;建立1~N顺序数字表
C1 :L
;用递归模拟玩牌过程
END
TO C1 :L
;模拟玩牌的递归
IF (COUNT :L)=1 [PR :L STOP]
;在只剩下一张牌时输出表中的牌号
MAKE "L BF :L
;规则:将第一张牌丢掉
MAKE "L SE BF :L FIRST :L
;规则:将面上的牌放到最后
C1 :L
;不断循环以上过程
END
PCLogo程序运行起来的结果是一样的。但是PCLogo可能会是完不动 C 3000的,因为需要的空间太大。
待续……还有后续两篇博客……
LOGO编程画出来的动画:
加载中,请稍候......