以前做项目的时候有用过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); } }
时间: 2024-10-29 10:46:39