模拟一下人见人恨的“抽奖系统”

1.关于本文

本文旨在模拟一种非常坑爹的抽奖形式-不等概率的抽奖(当然,这种抽奖形式在现在已经得到了非常普遍的应用)

程序下载地址:http://pan.baidu.com/s/1hETHk

2.抽奖系统抽奖规则

对外的宣传是:一共有5个抽奖图标,用鼠标点击一个图标视为抽奖一次,该图标所对应的奖品会被翻出。抽奖总共有3次机会,第三次抽奖完毕后,亮出所有图标后面所代表的奖品。

实现的方法是:一共有5个抽奖图标,用鼠标点击一个图标视为抽奖一次,计算出一个一般奖品。抽奖总共有3次机会,第三次抽奖完毕后,将其余两个图标亮出优质奖品对应的图片。

下面是一张程序运行时的截图(抽奖抽到的东西为什么总是这么不堪入目,看下代码就明白了~~)

144000_Qmnp_1425762.png

3.图片资源

本程序的资源都是PNG格式的图片,存储在Resource.resx中。这些图片都是从52poke上下载的。在本程序中,A00-A07被认为是优质奖品,Z00-Z04被认为是一般奖品。

144048_WLFn_1425762.png

4.控件描述

下图为本程序用的控件描述

144641_65ed_1425762.png

5.程序代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LuckyDraw
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //抽奖次数统计
        int iTimes = 0;

        //程序初始化
        private void Form1_Load(object sender, EventArgs e)
        {
            //抽奖次数:0次
            iTimes = 0;

            //初始化图片:精灵球
            pcb00.Image = Properties.Resources.Ball; pcb00.Image.Tag = "Ball";
            pcb01.Image = Properties.Resources.Ball; pcb01.Image.Tag = "Ball";
            pcb02.Image = Properties.Resources.Ball; pcb02.Image.Tag = "Ball";
            pcb03.Image = Properties.Resources.Ball; pcb03.Image.Tag = "Ball";
            pcb04.Image = Properties.Resources.Ball; pcb04.Image.Tag = "Ball";

            pcb00.Click += PictureClick;
            pcb01.Click += PictureClick;
            pcb02.Click += PictureClick;
            pcb03.Click += PictureClick;
            pcb04.Click += PictureClick;
        }

        //单击“开始抽奖”按钮
        private void btnStart_Click(object sender, EventArgs e)
        {
            //抽奖次数:0次
            iTimes = 0;

            //重新开始一局,初始化图片
            pcb00.Image = Properties.Resources.Ball; pcb00.Image.Tag = "Ball";
            pcb01.Image = Properties.Resources.Ball; pcb01.Image.Tag = "Ball";
            pcb02.Image = Properties.Resources.Ball; pcb02.Image.Tag = "Ball";
            pcb03.Image = Properties.Resources.Ball; pcb03.Image.Tag = "Ball";
            pcb04.Image = Properties.Resources.Ball; pcb04.Image.Tag = "Ball";
        }

        //单击一张图片
        private void PictureClick(object sender, EventArgs e)
        {
            //如果已经用尽3次机会,则不触发后面的行为
            if (iTimes >= 3) return;

            //已经翻出的牌不会再被翻出
            if (((PictureBox)sender).Image.Tag != "Ball" as object) return;

            //翻一张牌
            ((PictureBox)sender).Image = SelectPicture(false);
            //在翻牌位置绘制一个矩形
            Graphics g = Graphics.FromImage(((PictureBox)sender).Image);
            g.DrawLines(Pens.Red, new Point[] { 
                new Point(10, 10), new Point(90, 10), new Point(90, 90),
                new Point(10, 90), new Point(10, 10) });
            g.Save();

            //抽奖满三次,翻出所有牌
            if (++iTimes == 3)
            {
                if (pcb00.Image.Tag == "Ball" as object) pcb00.Image = SelectPicture(true);
                if (pcb01.Image.Tag == "Ball" as object) pcb01.Image = SelectPicture(true);
                if (pcb02.Image.Tag == "Ball" as object) pcb02.Image = SelectPicture(true);
                if (pcb03.Image.Tag == "Ball" as object) pcb03.Image = SelectPicture(true);
                if (pcb04.Image.Tag == "Ball" as object) pcb04.Image = SelectPicture(true);
                MessageBox.Show("抽到了这么多只好精灵,这下真是赚到了!");
            }
        }

        /// <summary>
        /// 随机数:供函数 SelectPicture 使用
        /// </summary>
        Random rd = new Random(DateTime.Now.Millisecond);

        /// <summary>
        /// 随机返回一张精灵图片
        /// </summary>
        /// <param name="isA">true:高级精灵A00-A07 false:低级精灵Z00-Z04</param>
        /// <returns></returns>
        private Image SelectPicture(bool isA)
        {
            Image result;

            if (isA)
            {
                switch (rd.Next(0, 8))
                {
                  case 0: result = Properties.Resources.A00; result.Tag = "A00"; return result;
                  case 1: result = Properties.Resources.A01; result.Tag = "A01"; return result;
                  case 2: result = Properties.Resources.A02; result.Tag = "A02"; return result;
                  case 3: result = Properties.Resources.A03; result.Tag = "A03"; return result;
                  case 4: result = Properties.Resources.A04; result.Tag = "A04"; return result;
                  case 5: result = Properties.Resources.A05; result.Tag = "A05"; return result;
                  case 6: result = Properties.Resources.A06; result.Tag = "A06"; return result;
                  case 7: result = Properties.Resources.A07; result.Tag = "A07"; return result;
                }
            }
            else
            {
                switch (rd.Next(0, 5))
                {
                  case 0: result = Properties.Resources.Z00; result.Tag = "Z00"; return result;
                  case 1: result = Properties.Resources.Z01; result.Tag = "Z01"; return result;
                  case 2: result = Properties.Resources.Z02; result.Tag = "Z02"; return result;
                  case 3: result = Properties.Resources.Z03; result.Tag = "Z03"; return result;
                  case 4: result = Properties.Resources.Z04; result.Tag = "Z04"; return result;
                }
            }

            return null;
        }
    }
}

END

转载于:https://my.oschina.net/Tsybius2014/blog/268294

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值