近年来在娱乐节目之中常常见到利用电脑来抽奖,笔者对其发生了兴趣遂自己动手用VB编了一个小程序来实现电脑抽奖的小功能,其原理如下: 主要利用VB中的Rnd函数,来实现随机查找和打乱排序的功能,从而实现随机抽奖的目的。Rnd函数的语法结构是Rnd[(number)],可选的number参数是single或任何有效的数值表达式。Rnd函数返回小于1但大于或等于0的值。number的值决定了Rnd生成随机数的方式。为了生成某个范围内的随机整数,可使用以下公式: Int((upperbound-lowerbound+1)×Rnd+lowerbound) 这里,upperbound是随机数范围的上限,而lowerbound则是随机数范围的下限。 另外,程序中还使用了INI文件,WindowsINI文件,可解释为Windows初始化文件。它是一种专门用来保存应用程序初始化信息和运行环境信息的文本文件。ini文件是一种文本文件,它可以通过Notepad等文本编辑器进行编辑。ini文件具有特定的格式。一个INI文件是由若干个段(section)组成的,每个段中包含若干关键字(key)及相应的值(value)。创建应用程序自己的INI文件,通过INI文件保存应用程序的一些运行环境信息,然后在程序中读取INI文件中的设置信息并据以处理。一旦程序的运行环境需要变更,则可以通过直接修改INI文件,或在程序中提供专门的界面间接地修改INI文件来保证程序的可用性。 程序运行时如图: 源程序及注释如下: '窗体源程序 OptionExplicit Dimm_strNameArray()AsMyName Dimm_bIsStartAsBoolean Dimm_nNameIndexAsInteger DimMAX_INDEXAsInteger Dimm_nSelectNumAsInteger '被选定数 DimnScrollStepAsInteger DimnScrollWidthAsInteger DimbScrollStateAsBoolean DimnEnableSecondAsInteger Dimm_strTitleAsString Dimm_strAppTitleAsString Dimm_strScrollTitleLeftAsString Dimm_strScrollTitleRightAsString PrivateSubCommand_Start_Stop_Click() Ifm_bIsStart=TrueThen '按停止钮 m_bIsStart=False Command_Start_Stop.Caption= “开始" Label_FlashName.Visible=True Timer_FlashName.Enabled=True Timer_ScrollName.Enabled=False Label_FlashName= m_strNameArray(m_nNameIndex).strName+“中奖了!" m_strNameArray(m_nNameIndex).bIsSelect=True m_nSelectNum=m_nSelectNum+1 DimTempAsMyName Temp= m_strNameArray(MAX_INDEX) m_strNameArray(MAX-INDEX)=m_strNameArray(m_nNameIndex) m_strNameArray(m_nNameIndex)= Temp MAX_INDEX=MAX_INDEX-1 IfMAX_INDEX=0Then MsgBox“非常感谢您使用本软件" EndIf Else'按开始钮 m_bIsStart=True Command_Start_Stop.Caption=“停止" Command_Start_Stop.Enabled=False Timer_ScrollName.Enabled=True Timer_FlashName.Enabled=False Label_FlashName.Caption=“" EndIf EndSub PrivateSubForm_Load() Form_Bouns.ScaleMode=3 m_nNameIndex=0 m_bIsStart=False Timer_ScrollName.Enabled=True Timer_ScrollTitle.Enabled=True Label_FlashName.Visible=False Label_ScrollName.Caption=“" nEnableSecond=0 '定义起始秒数 ReDimNameArray '获得文本中的名字和打乱名字顺序 nScrollStep=5'设定滚动字的步长 nScrollWidth=Label_Congruation.Left '设定title的移动宽度 bScrollState=False '设定缺省的开始滚动方向为向左 m_nSelectNum=0 '初始化被选定数为0 Init '初始化本程序的界面 EndSub PrivateSubTimer_FlashName_Timer()'闪动中奖者姓名 IfLabel_FlashName.Visible=TrueThen Label_FlashName.Visible=False Else Label_FlashName.Visible=True EndIf EndSub PrivateSubTimer_ScrollName_Timer()'滚动出现名字 Ifm_bIsStart=TrueThen Ifm_nNameIndex>=MAX_INDEXThen m_nNameIndex=0 EndIf m_nNameIndex= m_nNameIndex+1 Ifm_strNameArray(m_nNameIndex).bIsSelect=TrueThen Ifm_nNameIndex< MAX-INDEXThen m_nNameIndex= m_nNameIndex+1 Else m_nNameIndex=0 EndIf EndIf Label_ScrollName.Caption=m_str NameArray(m_nNameIndex).strName 'EndIf EndIf EndSub PrivateSubTimer_ScrollTitle_Timer()'滚动“恭喜发财"字样 IfbScrollState=FalseThen'向左滚 nScrollStep=10 Label_Congruation.Caption=m_strScrollTitleLeft IfnScrollWidth>0Then nScrollWidth= nScrollWidth-nScrollStep Else bScrollState=True EndIf Else'向右滚 nScrollStep=-10 Label_Congruation.Caption= m_strScrollTitleRight IfnScrollWidth<Form_Bouns.ScaleWidth-Label_Congruation.WidthThen nScrollWidth= nScrollWidth-nScrollStep Else bScrollState=False EndIf EndIf Label_Congruation.Left=nScrollWidth '以下为8秒钟内使“停止"按钮有效 IfnEnableSecond<=49Then Ifm_bIsStart=TrueThen nEnableSecond=nEnableSecond+1 EndIf Else Ifm_bIsStart=TrueThen Command_Start_Stop.Enabled=True nEnableSecond=0 EndIf EndIf EndSub '动态定义数组 PrivateSubReDimNameArray() DimnMaxIndexAsInteger DimstrMaxIndexAsString DimnIndexAsInteger DimbIsBeginAsBoolean bIsBegin=False nIndex=0 OpenApp.Path+“\name.txt"ForInputAs#1'读文件 DoUntilEOF(1) IfbIsBegin=FalseThen LineInput#1,strMaxIndex nMaxIndex=Val(strMaxIndex) MAX_INDEX=nMaxIndex-1 ReDimm_strNameArray(0TonMaxIndex-1) bIsBegin=True Else LineInput#1,m_strNameArray(nIndex).strName m_strNameArray(nIndex).bIsSelect=False nIndex=nIndex+1 EndIf Loop '以下为打乱人员顺序10次 DimiAsInteger DimjAsInteger DimTempAsString DimnRandomNumAsInteger Forj=0To10 Fori=0TonMaxIndex-1 nRandomNum=((nMaxIndex-1)×Rnd)'利用Rnd函数 Temp=m_strNameArray(i).strName m_strNameArray(i).strName=m_strNameArray(nRandomNum).strName m_strNameArray(nRandomNum).strName=Temp Nexti Nextj EndSub PrivateSubInit()'读取INI文件 DimXAsLong DimlpFileName DimTempAsString×50 lpFileName=App.Path+“\Sortition.ini" X=GetPrivateProfileString(“SYSTEM",“AppTitle",“抽奖程序",Temp,Len(Temp),lpFileName) m_strAppTitle=Trim(Temp) Temp=“" X=GetPrivateProfileString(“SYSTEM","Title","欢迎使用抽奖程序",Temp,Len(Temp),lpFileName) m_strTitle=Trim(Temp) Temp=“" X=GetPrivateProfileString(“SYSTEM",“ScrollTitleRight",“恭喜发财!!!",Temp,Len(Temp),lpFileName) m_strScrollTitleRight=Trim(Temp) X=GetPrivateProfileString(“SYSTEM",“ScrollTitleLeft",“龙年大发!!!",Temp,Len(Temp),lpFileName) m_strScrollTitleLeft=Trim(Temp) Form_Bouns.Caption=m_strAppTitle Label_CompanyTitle.Caption=m_strTitle EndSub 模块源程序: '用于读取ini文件的API函数 DeclareFunctionGetPrivateProfileStringLib“kernel32"Alias“GetPrivateProfileStringA"(ByVallpApplicationnameAsString,ByVallpKeyNameAsString,ByVallpDefaultAsString,ByVallpReturnedStringAsString,ByValnSizeAsLong,ByVallpFileNameAsString)AsLong PublicTypeMyName strNameAsString bIsSelectAsBoolean EndType 由于程序利用的windowsini文件保存一些标题信息,因而可以方便的修改使用环境,及标题内容。 见ini文件内容: [SYSTEM] ;应用程序的form名称 AppTitle=“风云电脑抽奖Test" ;窗口的内的标题(限9个字) Title=“大抽奖" ;右滚动的文字(仅能为如下格式:XXXX!!!) ScrollTitleRight=“恭喜发财!!!" ;左滚动的文字(仅能为如下格式:XXXX!!!) ScrollTitleLeft=“祝您好运!!!" 如此一个小小的电脑抽奖程序便完成了。 以上程序在VB6.0Windows98环境下编译通过->
|