用C#简单的实现双色球抽奖

简单说一下 双色球的规则:6 个红球加1个蓝球,红球范围为1到33且不重复,蓝球范围为1到16.一些细节 的问题,一般开双色球的时候,是一个一个开的,且球在不断的跳动,点击一下按钮开一个球。

起初看起来很简单,直接用随机数不就好了?但自己细节做的不够好,便到网上找代码,也是找到了,取出一组随机数且不重复。界面十分简单,就是一个label加上一个button。下面是取出一组不重复的随机数:

public int[] differSamenessRandomNum(int num,int minValue,int maxValue) //num是数组的元素个数,后面两个对应最小值和最大值
        { 
            Random ra=new Random(unchecked((int)DateTime.Now.Ticks));
            int[] arrNum=new int[num]; 
            int tmp=0; 
            for (int i=0;i<=num-1;i++) 
            { 
                tmp=ra.Next(minValue,maxValue); 
                arrNum[i]=getRandomNum(arrNum,tmp,minValue,maxValue,ra); 
            } return arrNum; 
        } 
        public int getRandomNum(int[] arrNum,int tmp,int minValue,int maxValue,Random ra) //保证取得的值不重复
        { 
            int n=0;  
            while (n<=arrNum.Length-1) 
            { 
                if (arrNum[n]==tmp) 
                { 
                    tmp=ra.Next(minValue,maxValue); 
                    getRandomNum(arrNum,tmp,minValue,maxValue,ra); 
                } 
                n++; 
            } 
            return tmp;  
        }
而我在button点击事件里写的代码是这样的:
 int[] number = differSamenessRandomNum(6, 1, 33);
            for (int i = 0; i < 6; i++)
            {
                label1.Text += number[i] + " ";
            }
            Random r = new Random();
            int a = r.Next(1,16);
            label1.Text += a.ToString();
这样是能输出一组不重复的随机数,但是没办法一个一个输出,因为每次点击得到的随机数组也是不同的。。。没有想到解决办法,于是看看老师写的代码。

public int num = 1; //存储当前所开的球序号,1-6表示红球,7表示蓝球
        public string disp = "";//存储当前label上已经开出的号码
        private void button1_Click(object sender, EventArgs e)
        {
            if (timer1.Enabled == false)//如果计时器处于停止状态
            {
                timer1.Start();
                button1.Text = "停止";
                if(num<7)
                    label2.Text = "等待开出第" + num.ToString() + "个红球号码";
                else
                    label2.Text = "等待开出蓝球号码";
            }
            else//如果计时器处于启动状态
            {
                timer1.Stop();
                button1.Text = "启动";
                if (num < 7)
                {
                    disp = label1.Text;//保存当前已开出的号码
                    num++;//号码加1
                }
                else if (num >= 7 )
                {
                    disp = "";//已开出号码清零
                    num = 1;//计数器清零
                    button1.Text = "重新开始";
                    label2.Text = "本期双色球中奖号码已经开出:";
                }
                
            }
        }
       
        private void timer1_Tick(object sender, EventArgs e)
        {
            Random rnd = new Random();
            int max=33;//最大号码
            string sp = " ";//空格
            if (num == 7) { max = 16; sp = " + "; }//如果num=7,开蓝球,最大16,用“+”分隔
            
            string st=rnd.Next(1, max).ToString().PadLeft(2,'0');//随机数,如 1位 则前面加 0
            if (num < 7)//红球需要判断是否重复
            {
                while (disp.IndexOf(st) > -1) st = rnd.Next(1, max).ToString().PadLeft(2, '0');
                //判断st是否重复
            }
            label1.Text = disp + sp + st;
        }
他用了timer这个控件,好吧我也不清楚,大致就是start开始stop结束。。并不是直接得到一组不重复的随机数,而是一个一个得到变成字符串加上去,好吧,这样感觉简单明了。

之后他和我说了另一种思路,设置一个数组从1到33,然后第一个开始跳动,停下来是哪个数字,将数组中的那个数字剔除,变成一个新的数组,继续跳动,依次类推,直到6个红球跳完。。我感觉这种实现起来也不错,有时间的话试试吧!

今天我还是先休息吧。免得猝死。。。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值