随机函数也玩魔术

数字职场

本期挑战题目

集体活动时,例如宴会、游园等,时常有抽奖的小插曲,根据号码随机抽出幸运儿,你会吗?

大家常见的随机多是无条件的,只有在少数领域才用特定条件的随机,其中游戏开发领域就经常用到特定条件的随机。

本期题目:魔术师将红桃K、黑桃K、梅花K依次翻过来牌背向上,除了他其他人翻第一张牌永远不是红桃K。你能编程实现这个过程吗?

解题的关键是,要根据特定条件随机提供红桃K。普通人不符合特定条件,翻出的牌是黑桃K或者梅花K;魔术师符合特定条件,翻出的牌是红桃K。这个特定条件到底是什么呢?其实就是权限。我们可以设定回车键激活权限,不按回车键就是普通人,按了回车键就是魔术师,这样就分清了权限。

设计翻牌游戏

启动Delphi新建一个项目,在窗体上添加三个扑克牌控件(Card1、Card2、Card3),添加一个“开始游戏”按钮。

Card1控件的OnMouseUp事件是整个程序的实现核心,在点击事件中判断是否按下了回车键:如果按下了回车键,显示红桃K;否则显示黑桃K或者梅花K。Card2和Card3控件的OnMouseUp事件和Card1的思路一致。游戏的关键代码如下(完整代码下载地址:http://www.shudoo.com/bzsoft):

if Card1.ShowDeck =false then exit;//牌翻开后点击无效

if cishu<>0 then enterkey :=0; //锁住回车键:在翻牌过程中按回车键无效

Randomize; //random(3)表示产生的随机数为0、1、2

//首先判断回车键按下没有

if enterkey=13 then //回车键按下则作弊

begin

if cishu=0 then Card1.Suit:=Hearts;//第一次翻牌一定是红桃K

if cishu=1 then //第二次翻牌,随机出现黑桃K或者梅花K

begin

i:=random(2);

if i=0 then Card1.Suit:=Spades; //黑桃

if i=1 then Card1.Suit:=Clubs; //梅花

end;

if cishu =2 then //第三次翻牌

begin

if (Card2.Suit= Spades) or (Card3.Suit= Spades) then Card1.Suit:= Clubs; //梅花

if (Card2.Suit= Clubs) or (Card3.Suit= Clubs) then Card1.Suit:= Spades; //黑桃

end;

end

else //回车键没按下

begin

if cishu=0 then //第一次翻牌,不可能出现红桃K

begin

i:= random(2);

if i=0 then Card1.Suit:=Spades; //黑桃

if i=1 then Card1.Suit:=Clubs; //梅花

end;

if cishu=1 then //第二次翻牌,排除翻开的牌后,在剩下的两张中随机生成

begin

i:= random(2);

if Card2.ShowDeck=true then//第二张牌没有翻开,根据第三张的花色来生成这张牌的花色

begin

if Card3.Suit= Hearts then

begin

if i=0 then Card1.Suit:=Spades; //黑桃

if i=1 then Card1.Suit:=Clubs; //梅花

实际应用

特定条件的随机在各类网游中被广泛使用,例如:怪物被击败后会掉宝,怪物等级不同掉宝的种类也不同,低级怪物不会掉高级物品;BOSS在特定时间才会刷出,不是时时都有;合成装备时出现失败,前功尽弃等。

露一手

上期的题目,很多编程爱好者踊跃参与,其中来自广东的邓征智童鞋非常耀眼,他是第一个提交答案的童鞋,一次提供了两种方法,关键代码如下所示。我们将给予邓征智童鞋现金奖励。

private static void Do()

{

int _i = s * 9;

for (int i = 10000000; i < 100000000; i++)

{

string S = (i * _i).ToString();

string Temp = S.Substring(0, 1);

string Enum = S.Replace(Temp, "");

if (Enum == "")

{

Console.WriteLine("当这位8位数是" + i.ToString() + ", 且这位9的倍数是" + _i.ToString() + ", 可以得到的清一色数字是" S);