初学WPF,做一款小游戏练习一下

以前做项目的时候有用过Silverlight,最近了解了一下WPF,做了一款简单的小游戏来练手,希望能和大家多多交流。

想法:最强大脑 牛人多多,对色彩的分辨更是让人目瞪口呆,于是我就想到做一个小游戏,简单一点,做网格状的色块,中间穿插一块不同颜色但是又非常相近的颜色块,点击该颜色块即为通关,进入下一关,下一关的色块数量+1,直到到达一个差不多的关卡后不再+1;

效果如图

说做就做,新建工程,开始实现,首先准备好一组颜色相近的颜色代码,百度HTML颜色代码,随便选取,越相邻颜色色差越小。

 1  private string[][] colors = new string[][] {
 2             new string[2]{"#7B7B7B","#8E8E8E"} ,
 3             new string[2]{"#FF5151","#ff7575"} ,
 4             new string[2]{"#ffaad5","#FFC1E0"} ,
 5             new string[2]{"#DCB5FF","#E6CAFF"} ,
 6             new string[2]{"#79FF79","#93FF93"} ,
 7             new string[2]{"#97CBFF","#ACD6FF"} ,
 8             new string[2]{"#FFFF93","#FFFFAA"} ,
 9             new string[2]{"#B766AD","#C07AB8"} ,
10             new string[2]{"#B7FF4A","#C2FF68"}
11         };

相关代码

    /// <summary>
    /// 游戏 找色差 实例
    /// </summary>
    public partial class MainWindow : Window
    {

        private int level = 2;   //当前关卡
        private double cavWidth = 0;    //容器宽度、宽高一样
        private double btnWidth = 0;    //色块宽高
        const int maxLevel = 8; //最大关卡

        //颜色数组
        private string[][] colors = new string[][] {
            new string[2]{"#7B7B7B","#8E8E8E"} ,
            new string[2]{"#FF5151","#ff7575"} ,
            new string[2]{"#ffaad5","#FFC1E0"} ,
            new string[2]{"#DCB5FF","#E6CAFF"} ,
            new string[2]{"#79FF79","#93FF93"} ,
            new string[2]{"#97CBFF","#ACD6FF"} ,
            new string[2]{"#FFFF93","#FFFFAA"} ,
            new string[2]{"#B766AD","#C07AB8"} ,
            new string[2]{"#B7FF4A","#C2FF68"}
        };
        //WPF的定时器使用DispatcherTimer类对象
        private System.Windows.Threading.DispatcherTimer dTimer = null;

        private int tmNum = 30;
        public MainWindow()
        {
            InitializeComponent();
            Load();
        }

        private void Load()
        {
            if (dTimer != null)
            {
                dTimer.Stop();
            }
            else
            {
                //Timer
                dTimer = new DispatcherTimer();
                //注:此处 Tick 为 dTimer 对象的事件( 超过计时器间隔时发生)
                dTimer.Tick += new EventHandler(dTimer_Tick);

                //设置时间:TimeSpan(时, 分, 秒)
                dTimer.Interval = new TimeSpan(0, 0, 1);
            }

            //启动 DispatcherTimer对象dTime。
            dTimer.Start();
            tmNum = 30;
            lblTime.Content = string.Format("剩余{0}秒", tmNum);

            cavWidth = cavContent.Width;
            btnWidth = cavWidth / level;
            int otherIndex = GetRandomNum(level * level); //不一样的那个

            lblLevel.Content = string.Format("第 {0} 关", level - 1);

            string[] strs = colors[GetRandomNum(colors.Length)];
            string colorBtnBg = strs[0];
            for (int i = 0; i < level; i++)
            {
                for (int j = 0; j < level; j++)
                {
                    //向容器中添加一个色块(按钮)
                    Button btn = new Button()
                    {
                        Margin = new Thickness(btnWidth * i, btnWidth * j, 0, 0),
                        Background = new SolidColorBrush((Color)System.Windows.Media.ColorConverter.ConvertFromString(colorBtnBg)),
                        BorderThickness = new Thickness(1),
                        BorderBrush = Brushes.Black,
                        Width = btnWidth,
                        Height = btnWidth
                    };
                    //随机生成的色块编号,颜色换成相近颜色,当点击该色块表示找出差异,进入游戏下一关
                    if (otherIndex == i * level + j)
                    {
                        btn.Background = new SolidColorBrush((Color)System.Windows.Media.ColorConverter.ConvertFromString(strs[1]));
                        btn.Click += btn_Click;
                    }
                    cavContent.Children.Add(btn);
                }
            }

        }

        /// <summary>
        /// 计时
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dTimer_Tick(object sender, EventArgs e)
        {
            lblTime.Content = string.Format("剩余{0}秒", tmNum);
            if (tmNum < 10)
            {
                lblTime.Foreground = Brushes.Red;
            }
            if (tmNum <= 0)
            {
                dTimer.Stop();
                MessageBoxResult result = MessageBox.Show("时间到,还未完成游戏,是否继续?", "Game Over", MessageBoxButton.YesNo);
                if (result == MessageBoxResult.Yes)
                {
                    level = 2;
                    Load(); //重置游戏
                }
                else
                {
                    this.Close();
                }
            }
            tmNum--;

        }

        /// <summary>
        /// 点击不同颜色的色块时触发
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void btn_Click(object sender, RoutedEventArgs e)
        {
            cavContent.Children.Clear();
            //达到最大关卡时数量不在增多,否则每次多一排一列色块
            if (level <= maxLevel)
            {
                level = level + 1;
            }
            Load();
        }


        /// <summary>
        /// 取随机数
        /// </summary>
        /// <param name="maxNum">0-最大区间</param>
        /// <returns></returns>
        public int GetRandomNum(int maxNum)
        {
            Random radom = new Random();
            return radom.Next(maxNum);
        }
    }

  

 

转载于:https://www.cnblogs.com/chmc/p/5135725.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值