找回密码
 加入
搜索
查看: 12165|回复: 26

[效率算法] 请高手帮看看这个抽奖程序

 火.. [复制链接]
发表于 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[10]=["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[Random(0,9,1)])
        $temp=Random(0,UBound($ini)-1,1)
          If $temp="" Then
             $temp=Random(0,UBound($ini)-1,1)
          endif                         
        GUICtrlSetData($lable,$ini[$temp][1])   
                IniWrite ( "w.ini", "zj", $i, $ini[$temp][1] )
        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
EndFunc
ini如下---谢谢。
[name]
1=张三
2=李四
3=王五
4=明明
5=东东
6=西西
7=丽丽
8=刘王
9=张鹏
10=胡三

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2014-1-10 22:51:53 | 显示全部楼层
哪位帮我看一下啊,怎么没理我啊?
发表于 2014-1-11 10:31:07 | 显示全部楼层
支持一下楼主!
 楼主| 发表于 2014-1-11 11:20:47 | 显示全部楼层
哪位帮帮忙啊,哪怕能解决第一个问题也好啊。
发表于 2014-1-11 11:36:38 | 显示全部楼层
回复 4# waxy
程序里面已经删了,不会重复的,只是没把删除后的数组写回文件而已
 楼主| 发表于 2014-1-11 11:44:26 | 显示全部楼层
回复 5# www378660084


    我有试过的,会有重复的,这样的话在第二次打开程序同样会出现重复的问题。
 楼主| 发表于 2014-1-11 11:48:46 | 显示全部楼层
回复  waxy
程序里面已经删了,不会重复的,只是没把删除后的数组写回文件而已
www378660084 发表于 2014-1-11 11:36


我尝试用IniDelete (@ScriptDir &"\test.ini","name",$cfg[$temp][1]),根本没反应。
发表于 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[10] = ["10000元", "5000元", "2000元", "1000元", "500元", "400元", "300元", "200元", "100元", "50元"]
Local $ini = IniReadSection("test.ini", "name")
Global $stop = 1, $temp
Dim $label_arr[15]

$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][1])
                If $ini[$temp][1] = "" Then MsgBox(0,0,UBound($ini) - 1)
                IniWrite("w.ini", "zj", $i, $ini[$temp][1])
        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

发表于 2014-1-11 12:41:32 | 显示全部楼层
回复 7# waxy
一次选完不就行了.
删除的话用这个
IniDelete (@ScriptDir &"\test.ini","name",$cfg[$temp][0])
看看IniReadSection函数的帮助
发表于 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[10] = ['10000元', '5000元', '2000元', '1000元', '500元', '400元', '300元', '200元', '100元', '50元']
Global $ajx[10] = [1, 1, 2, 3, 3, 4, 4, 5, 5, 5]        ;对应上面的各奖项数量
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[0][0] & @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][1])
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][1], $s)
                $sZjjl &= $aini[$ix][1] & ':' & $s & @LF
                GUICtrlSetData($lableX, $sZjjl)
                If $i = $aini[0][0] Or $i = $iMax Then GUICtrlSetData($button1, '已结束')
        Else
                $stop = 0
                GUICtrlSetData($button1, '停止')
        EndIf
EndFunc   ;==>_start

Func _Exit()
        Exit
EndFunc   ;==>_Exit
 楼主| 发表于 2014-1-11 13:21:11 | 显示全部楼层
LZ要求那么多,重写一个会更快…
中奖纪录保存在“中奖纪录.ini”里,不会删除原ini数据,不会重复。
各奖 ...
afan 发表于 2014-1-11 13:07


谢谢,afan总,可以不考虑中奖金额,只要分奖的等级,把人员抽出来即可。
发表于 2014-1-11 13:25:55 | 显示全部楼层
回复 11# waxy


    修改了下,把名单加在右边。至于奖金数,自己做减法吧
 楼主| 发表于 2014-1-11 13:29:58 | 显示全部楼层
本帖最后由 waxy 于 2014-1-11 13:31 编辑
谢谢,afan总,可以不考虑中奖金额,只要分奖的等级,把人员抽出来即可。
waxy 发表于 2014-1-11 13:21


比如三等奖抽20人,二等奖抽10人,一等奖3人,其实现在还不知道公司的奖品是什么,只要把各等级的奖项上抽出来。当然各奖项的人数是可以指定的,每个奖项的人数也不一定的,不知道到时候会抽多少人。
 楼主| 发表于 2014-1-11 13:33:19 | 显示全部楼层
比如三等奖抽20人,二等奖抽10人,一等奖3人,其实现在还不知道公司的奖品是什么,只要把各等级的奖项上 ...
waxy 发表于 2014-1-11 13:29

www378660084兄弟的代码比较接近我的想法,只是不需“奖金的金额”滚动。
 楼主| 发表于 2014-1-11 13:40:01 | 显示全部楼层
本帖最后由 waxy 于 2014-1-11 13:42 编辑

回复 10# afan
再次感谢afan总,这个就比较不错了,但如果不删除“原始名单表”的已中奖人员,在第二次打开程序的时候应该还是会出现重复中奖的情况。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-21 00:22 , Processed in 0.085632 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表