随机函数也玩魔术
数字职场
本期挑战题目
集体活动时,例如宴会、游园等,时常有抽奖的小插曲,根据号码随机抽出幸运儿,你会吗?
大家常见的随机多是无条件的,只有在少数领域才用特定条件的随机,其中游戏开发领域就经常用到特定条件的随机。
本期题目:魔术师将红桃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);