米德里比斯
米德里比斯是一款文字游戏,玩家在游戏中得到一个简短的故事并用同一类型的不同单词替换主要类型的单词,从而创建同一个故事的更无聊的新版本。阅读 以下文本:“I was walking in the park when I found a lake. I jumped in and swallowed too much water. I had to go to the hospital.” 开始用其他单词标记替换单词类型。开始和结束标记带有下划线用于阻止意外的字符串匹配。
清单 20. 用单词标记替换单词类型
- $text = "I was _VERB_ing in the _PLACE_ when I found a _NOUN_.
- I _VERB_ed in, and _VERB_ed too much _NOUN_. I had to go to the _PLACE_.";
接下来,创建几个基本单词列表。对于本例,我们也不会做得太复杂。
清单 21. 创建几个基本单词列表
- $verbs = array('pump', 'jump', 'walk', 'swallow', 'crawl', 'wail', 'roll');
- $places = array('park', 'hospital', 'arctic', 'ocean', 'grocery', 'basement',
- 'attic', 'sewer');
- $nouns = array('water', 'lake', 'spit', 'foot', 'worm',
- 'dirt', 'river', 'wankel rotary engine');
现在可以重复地评估文本来根据需要替换标记。
清单 22. 评估文本
- while (preg_match("/(_VERB_)|(_PLACE_)|(_NOUN_)/", $text, $matches)) {
- switch ($matches[0]) {
- case '_VERB_' :
- shuffle($verbs);
- $text = preg_replace($matches[0], current($verbs), $text, 1);
- break;
- case '_PLACE_' :
- shuffle($places);
- $text = preg_replace($matches[0], current($places), $text, 1);
- break;
- case '_NOUN_' :
- shuffle($nouns);
- $text = preg_replace($matches[0], current($nouns), $text, 1);
- break;
- }
- }
- echo $text;
很明显,这是一个简单而粗糙的示例。单词列表越精确,并且花在基本文本上的时间越多,结果就越好。我们已经使用了文本文件创建名称列表及基本单词列表。使用相同原则,我们可以创建按类型划分的单词列表并使用这些单词列表创建更加变化多端的米德里比斯游戏。
乐透机
全部选中乐透的六个正确号码 —— 退一步说 —— 在统计学上是不可能的。不过,许多人仍然花钱去玩,而且如果您喜欢号码,则查看趋势图可能很有趣。让我们构建一个脚本,该脚本将允许跟踪赢奖号码并在列表中提供选择次数最少的 6 个号码。
(免责声明:这不会帮助您中乐透奖,因此请不要花钱购买奖券。这只是为了娱乐)。
把赢奖的乐透选择保存到文本文件中。用逗号分隔各个号码并把每组号码放在单独一行中。使用换行符分隔文件内容并使用逗号分隔行后,可以得到类似清单 23 的内容。
清单 23. 把选择的赢奖乐透保存到文本文件中
- $picks = array(
- array('6', '10', '18', '21', '34', '40'),
- array('2', '8', '13', '22', '30', '39'),
- array('3', '9', '14', '25', '31', '35'),
- array('11', '12', '16', '24', '36', '37'),
- array('4', '7', '17', '26', '32', '33')
- );
很明显,这不足以成为绘制统计数据的基本文件。但是它是一个开端,并且足以演示基本原理。
设置一个基本数组以保存选择范围。例如,如果选择 1 到 40 之间(例如,$numbers = array_fill(1,40,0);)的号码,则遍历我们的选择,递增相应的匹配值。
清单 24. 遍历选择
- foreach ($picks as $pick) {
- foreach ($pick as $number) {
- $numbers[$number]++;
- }
- }
最后,根据值将号码排序。此操作应当会把最少选择的号码放在数组的前部。
清单 25. 根据值将号码排序
- asort($numbers);
- $pick = array_slice($numbers,0,6,true);
- echo implode(',', array_keys($pick));
通过有规律地向包含中奖号码列表的文本文件添加实际的乐透中奖号码,可以发现选号的长期趋势。查看某些号码的出现频率十分有趣。