waxy 发表于 2014-1-10 18:58:13

请高手帮看看这个抽奖程序

本帖最后由 waxy 于 2014-1-10 19:05 编辑

先给兄弟拜个早年!祝财源广进,马上有钱!哈哈!
过几天公司要弄个年会,要搞个电脑抽奖,于是小弟就从咱们的坛子里下了段代码(具体是哪位兄弟的代码忘了,不过还是要说声谢谢!)。
但发现这段代码有点问题,就是已经抽到的奖的员工名字没有从源“数据库”删除(test.ini),这样就可能出现重复中奖。试了好多方法都
没能实现。我想把他改成以下形式:
1、只要中奖后名字即从源ini中删除。
2、中奖的名单直接显示在旁边。
3、可以人为选定所抽奖项的级别(比如一等奖、二等奖等),并且可以设定所抽奖项的人数。#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#Include <GuiToolBar.au3>
#include <array.au3>

Opt("GUIOnEventMode", 1)

Global $gui, $guiPos, $pic, $picPos
Local $n, $msg
Local $Prize=["10000元","5000元","2000元","1000元","500元","400元","300元","200元","100元","50元"]
Local $ini=IniReadSection("test.ini","name")
Global $stop=1,$temp

$form1=GUICreate("My GUI picture", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW))
GUISetBkColor(0xE0FFFF)
$n = GUICtrlCreatePic(@ScriptDir & "\狂欢.jpg", 0, 0, @DesktopWidth, @DesktopHeight)
GUICtrlSetState(-1, $gui_disable)
$lable = GUICtrlCreateLabel("年终抽奖", @DesktopWidth / 16 * 8 - 100, @DesktopHeight / 10 * 5 - 100, 300, 80);,bitOr($SS_SUNKEN, $SS_CENTER,$TBSTYLE_EX_DOUBLEBUFFER))
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 40, 800, Default, '黑体')
GUICtrlSetColor(-1, 0xffffff)

$lable3 = GUICtrlCreateLabel("名单", @DesktopWidth / 16 * 8 - 100, @DesktopHeight / 10 * 7 - 100, 200, 40);,bitOr($SS_SUNKEN, $SS_CENTER,$TBSTYLE_EX_DOUBLEBUFFER))
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 24, 800, Default, '黑体')
GUICtrlSetColor(-1, 0xffffff)

$lable1 = GUICtrlCreateLabel("抽奖参与人数:"&UBound($ini), @DesktopWidth / 16 * 1, @DesktopHeight / 10 * 1, 100, 200)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 12, 800, Default, '黑体')
GUICtrlSetColor(-1, 0xffffff)

$lable2 = GUICtrlCreateLabel("已抽奖人数:", @DesktopWidth / 16 * 12, @DesktopHeight / 10 * 1, 200, 40)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 12, 800, Default, '黑体')
GUICtrlSetColor(-1, 0xffffff)

$button1 = GUICtrlCreateButton("开始", @DesktopWidth / 16 * 5, @DesktopHeight / 10 * 8, 80, 40)
GUICtrlSetOnEvent(-1,'_start')
$button2 = GUICtrlCreateButton("退出", @DesktopWidth / 16 * 9, @DesktopHeight / 10 * 8, 80, 40)
GUICtrlSetOnEvent(-1,'_exit')
GUISetState()
$i=1 ;记录数组键值

While 1
      Sleep(10)      
      If Not $stop Then
      GUICtrlSetData($lable3,$prize)
      $temp=Random(0,UBound($ini)-1,1)
          If $temp="" Then
             $temp=Random(0,UBound($ini)-1,1)
          endif                       
      GUICtrlSetData($lable,$ini[$temp])   
                IniWrite ( "w.ini", "zj", $i, $ini[$temp] )
      EndIf
WEnd

Func _start()
      If GUICtrlRead($button1)='停止' Then
                $stop=1
                GUICtrlSetData($button1,'开始')
               $i=$i+1 ;数组记录                               
                _ArrayDelete($ini,$temp)
                GUICtrlSetData($lable2,"剩余抽奖人数:"&UBound($ini))
      Else
                $stop=0
                GUICtrlSetData($button1,'停止')
      EndIf
EndFunc

Func _exit()
      Exit
EndFuncini如下---谢谢。

1=张三
2=李四
3=王五
4=明明
5=东东
6=西西
7=丽丽
8=刘王
9=张鹏
10=胡三

waxy 发表于 2014-1-10 22:51:53

哪位帮我看一下啊,怎么没理我啊?

joyran 发表于 2014-1-11 10:31:07

支持一下楼主!

waxy 发表于 2014-1-11 11:20:47

哪位帮帮忙啊,哪怕能解决第一个问题也好啊。

www378660084 发表于 2014-1-11 11:36:38

回复 4# waxy
程序里面已经删了,不会重复的,只是没把删除后的数组写回文件而已

waxy 发表于 2014-1-11 11:44:26

回复 5# www378660084


    我有试过的,会有重复的,这样的话在第二次打开程序同样会出现重复的问题。

waxy 发表于 2014-1-11 11:48:46

回复waxy
程序里面已经删了,不会重复的,只是没把删除后的数组写回文件而已
www378660084 发表于 2014-1-11 11:36 http://www.autoitx.com/images/common/back.gif

我尝试用IniDelete (@ScriptDir &"\test.ini","name",$cfg[$temp]),根本没反应。

www378660084 发表于 2014-1-11 12:06:34

给你稍微改了下~~~~
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GuiToolBar.au3>
#include <array.au3>

Opt("GUIOnEventMode", 1)

Global $gui, $guiPos, $pic, $picPos
Local $n, $msg
Local $Prize = ["10000元", "5000元", "2000元", "1000元", "500元", "400元", "300元", "200元", "100元", "50元"]
Local $ini = IniReadSection("test.ini", "name")
Global $stop = 1, $temp
Dim $label_arr

$form1 = GUICreate("My GUI picture", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW))
GUISetBkColor(0xE0FFFF)
$n = GUICtrlCreatePic(@ScriptDir & "\狂欢.jpg", 0, 0, @DesktopWidth, @DesktopHeight)
GUICtrlSetState(-1, $gui_disable)
$lable = GUICtrlCreateLabel("年终抽奖", @DesktopWidth / 16 * 8 - 100, @DesktopHeight / 10 * 5 - 100, 300, 80);,bitOr($SS_SUNKEN, $SS_CENTER,$TBSTYLE_EX_DOUBLEBUFFER))
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 40, 800, Default, '黑体')
GUICtrlSetColor(-1, 0xffffff)

$lable3 = GUICtrlCreateLabel("名单", @DesktopWidth / 16 * 8 - 100, @DesktopHeight / 10 * 7 - 100, 200, 40);,bitOr($SS_SUNKEN, $SS_CENTER,$TBSTYLE_EX_DOUBLEBUFFER))
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 24, 800, Default, '黑体')
GUICtrlSetColor(-1, 0xffffff)

$lable1 = GUICtrlCreateLabel("抽奖参与人数:" & (UBound($ini)-1), @DesktopWidth / 16 * 1, @DesktopHeight / 10 * 1, 100, 200)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 12, 800, Default, '黑体')
GUICtrlSetColor(-1, 0xffffff)

$lable2 = GUICtrlCreateLabel("已抽奖人数:", @DesktopWidth / 16 * 12, @DesktopHeight / 10 * 1, 200, 40)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 12, 800, Default, '黑体')
GUICtrlSetColor(-1, 0xffffff)

For $i = 1 To 10
        $label_arr[$i]= GUICtrlCreateLabel("1", @DesktopWidth / 16 * 12, @DesktopHeight / 10 * 2 + 40 * $i, 200, 40)
        GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
        GUICtrlSetFont(-1, 24, 800, Default, '黑体')
        GUICtrlSetColor(-1, 0xffffff)
Next

$button1 = GUICtrlCreateButton("开始", @DesktopWidth / 16 * 5, @DesktopHeight / 10 * 8, 80, 40)
GUICtrlSetOnEvent(-1, '_start')
$button2 = GUICtrlCreateButton("退出", @DesktopWidth / 16 * 9, @DesktopHeight / 10 * 8, 80, 40)
GUICtrlSetOnEvent(-1, '_exit')
GUISetState()
$i = 1 ;记录数组键值

While 1
        Sleep(10)
        If Not $stop Then
                GUICtrlSetData($lable3, $prize[$i-1])
                If UBound($ini)-1 = 1 Then
                        $temp = 1
                Else
                        $temp = Random(1, UBound($ini) - 1, 1)
                EndIf
                GUICtrlSetData($label_arr[$i], $ini[$temp])
                If $ini[$temp] = "" Then MsgBox(0,0,UBound($ini) - 1)
                IniWrite("w.ini", "zj", $i, $ini[$temp])
        EndIf
WEnd

Func _start()
        If GUICtrlRead($button1) = '停止' Then
                $stop = 1
                GUICtrlSetData($button1, '开始')
                $i = $i + 1 ;数组记录
                _ArrayDelete($ini, $temp)
                GUICtrlSetData($lable2, "剩余抽奖人数:" & UBound($ini) - 1)
        Else
                If $i >= 11 Then
                        GUICtrlSetData($lable,"抽奖完成")
                        return
                EndIf
                $stop = 0
                GUICtrlSetData($button1, '停止')
        EndIf
EndFunc   ;==>_start

Func _exit()
        Exit
EndFunc   ;==>_exit

www378660084 发表于 2014-1-11 12:41:32

回复 7# waxy
一次选完不就行了.
删除的话用这个
IniDelete (@ScriptDir &"\test.ini","name",$cfg[$temp])
看看IniReadSection函数的帮助

afan 发表于 2014-1-11 13:07:24

本帖最后由 afan 于 2014-1-11 13:24 编辑

LZ要求那么多,重写一个会更快…
中奖纪录保存在“中奖纪录.ini”里,不会删除原ini数据,不会重复。
各奖项数量设置在$ajx数组里,奖项太多,人数不够分钱,test.ini里面多增加几段。#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt('GUIOnEventMode', 1)

Global $aini = IniReadSection('test.ini', 'name')
Global $Prize = ['10000元', '5000元', '2000元', '1000元', '500元', '400元', '300元', '200元', '100元', '50元']
Global $ajx =         ;对应上面的各奖项数量
Global $iMax = 0
For $xx = 0 To UBound($ajx) - 1
        $iMax += $ajx[$xx]        ;奖项总数
Next

Global $stop = 1, $ix, $iJx

$form1 = GUICreate('My GUI picture', @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW))
GUISetBkColor(0xFF0000)
$n = GUICtrlCreatePic(@ScriptDir & '\狂欢.jpg', 0, 0, @DesktopWidth, @DesktopHeight)
GUICtrlSetState(-1, $gui_disable)
$lable = GUICtrlCreateLabel('年终抽奖', @DesktopWidth / 16 * 8 - 100, @DesktopHeight / 10 * 5 - 100, 300, 80);,bitOr($SS_SUNKEN, $SS_CENTER,$TBSTYLE_EX_DOUBLEBUFFER))
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 40, 800, Default, '黑体')
GUICtrlSetColor(-1, 0xffffff)

$lable3 = GUICtrlCreateLabel('', @DesktopWidth / 16 * 8 - 100, @DesktopHeight / 10 * 7 - 100, 300, 40);,bitOr($SS_SUNKEN, $SS_CENTER,$TBSTYLE_EX_DOUBLEBUFFER))
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 24, 800, Default, '黑体')
GUICtrlSetColor(-1, 0xffffff)

$lable1 = GUICtrlCreateLabel('抽奖参与人数:' & $aini & @LF & @LF & _
                        '奖项总数:' & $iMax, @DesktopWidth / 16 * 1, @DesktopHeight / 10 * 1, 150, 200)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 12, 800, Default, '黑体')
GUICtrlSetColor(-1, 0xffffff)

$lable2 = GUICtrlCreateLabel('已抽奖人数:0', @DesktopWidth / 16 * 12, @DesktopHeight / 10 * 1, 200, 200)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 12, 800, Default, '黑体')
GUICtrlSetColor(-1, 0xffffff)

Global $sZjjl = '前N条中奖记录:' & @LF
$lableX = GUICtrlCreateLabel($sZjjl, @DesktopWidth / 16 * 12, @DesktopHeight / 10+ 80, 400, @DesktopHeight - 100)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 12, 800, Default, '黑体')
GUICtrlSetColor(-1, 0xffffff)

$button1 = GUICtrlCreateButton('开始', @DesktopWidth / 16 * 5, @DesktopHeight / 10 * 8, 80, 40)
GUICtrlSetOnEvent(-1, '_start')
$button2 = GUICtrlCreateButton('退出', @DesktopWidth / 16 * 9, @DesktopHeight / 10 * 8, 80, 40)
GUICtrlSetOnEvent(-1, '_exit')
GUISetState()
$i = 0 ;记录数组键值

While 1
        Sleep(10)
        If $stop Then ContinueLoop
        Do
                $iJx = 9 - Random(0, 9, 1)
        Until Eval('~~' & $iJx + 1) < $ajx[$iJx]
        GUICtrlSetData($lable3, $iJx + 1 & '等奖:' & $Prize[$iJx])
        Do
                $ix = Random(1, UBound($aini) - 1, 1)
        Until Not IsDeclared('~' & $ix)
        GUICtrlSetData($lable, $aini[$ix])
WEnd

Func _start()
        If GUICtrlRead($button1) = '已结束' Then
                GUICtrlSetData($lable, '已结束')
                GUICtrlSetData($lable3, '明年再试 :)')
                GUICtrlSetState($button1, 128)
                Return
        ElseIf GUICtrlRead($button1) = '停止' Then
                $stop = 1
                GUICtrlSetData($button1, '开始')
                $i += 1 ;数组记录
                GUICtrlSetData($lable2, '已抽奖人数:' & $i & @LF & @LF & '剩余奖项数:' & $iMax - $i)
                Assign('~' & $ix, 1, 2)
                Assign('~~' & $iJx + 1, Eval('~~' & $iJx + 1) + 1, 2)
                $s = GUICtrlRead($lable3)
                IniWrite('中奖纪录.ini', @YEAR & @MON & @MDAY, $ix & ':' & $aini[$ix], $s)
                $sZjjl &= $aini[$ix] & ':' & $s & @LF
                GUICtrlSetData($lableX, $sZjjl)
                If $i = $aini Or $i = $iMax Then GUICtrlSetData($button1, '已结束')
        Else
                $stop = 0
                GUICtrlSetData($button1, '停止')
        EndIf
EndFunc   ;==>_start

Func _Exit()
        Exit
EndFunc   ;==>_Exit

waxy 发表于 2014-1-11 13:21:11

LZ要求那么多,重写一个会更快…
中奖纪录保存在“中奖纪录.ini”里,不会删除原ini数据,不会重复。
各奖 ...
afan 发表于 2014-1-11 13:07 http://www.autoitx.com/images/common/back.gif

谢谢,afan总,可以不考虑中奖金额,只要分奖的等级,把人员抽出来即可。

afan 发表于 2014-1-11 13:25:55

回复 11# waxy


    修改了下,把名单加在右边。至于奖金数,自己做减法吧

waxy 发表于 2014-1-11 13:29:58

本帖最后由 waxy 于 2014-1-11 13:31 编辑

谢谢,afan总,可以不考虑中奖金额,只要分奖的等级,把人员抽出来即可。
waxy 发表于 2014-1-11 13:21 http://www.autoitx.com/images/common/back.gif

比如三等奖抽20人,二等奖抽10人,一等奖3人,其实现在还不知道公司的奖品是什么,只要把各等级的奖项上抽出来。当然各奖项的人数是可以指定的,每个奖项的人数也不一定的,不知道到时候会抽多少人。

waxy 发表于 2014-1-11 13:33:19

比如三等奖抽20人,二等奖抽10人,一等奖3人,其实现在还不知道公司的奖品是什么,只要把各等级的奖项上 ...
waxy 发表于 2014-1-11 13:29 http://www.autoitx.com/images/common/back.gif
www378660084兄弟的代码比较接近我的想法,只是不需“奖金的金额”滚动。

waxy 发表于 2014-1-11 13:40:01

本帖最后由 waxy 于 2014-1-11 13:42 编辑

回复 10# afan
再次感谢afan总,这个就比较不错了,但如果不删除“原始名单表”的已中奖人员,在第二次打开程序的时候应该还是会出现重复中奖的情况。
页: [1] 2
查看完整版本: 请高手帮看看这个抽奖程序