近年来在娱乐节目之中常常见到利用电脑来抽奖,笔者对其发生了兴趣遂自己动手用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环境下编译通过->