C#记忆纸牌
主要思路:利用button的特性,及巧妙使用tag属性。
设计:一个窗体,一个随机数数组类。
随机数数组类:(RandomNumber)可以得到任意0——X直接的随机整数排列数组
class RandomNumber { private int[] random; /// <summary> /// 随机数数组类 /// </summary> public RandomNumber(int number) { random = new int[number]; } /// <summary> /// 任意随机数数组 /// </summary> public int[] GetRandom() { Random r = new Random(); for (int i = 0; i < random.Length; ) { int temp = r.Next(0, random.Length); bool op = true; for (int j = 0; j < i; j++) { if (random[j] == temp) { op = false; break; } } if (op) { random[i] = temp; i++; } } return random; } }
界面:三个计时器timer,imageList控件一个
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace 记忆纸牌 { public partial class MemoryCards : Form { public MemoryCards() { InitializeComponent(); } private void MemoryCards_Load(object sender, EventArgs e) { Inint(); } /// <summary> /// 初始化 /// </summary> private void Inint() { DealCard();//发牌 } //变量 private Button[] buttons = new Button[16];//按钮数组 private int[] rand;//随机数组 private int time = 10;//倒计时计时器默认时间 private int gameTime = 0;//游戏时间 private Button btn1, btn2;//临时btn变量 private bool bl = true;//按钮用到的变量 /// <summary> /// 发牌 /// </summary> private void DealCard() { rand = new RandomNumber(16).GetRandom();//得到随机数 int i = 0; foreach (Button item in flowLayoutPanel1.Controls)//容器中的button赋给button数组 { item.Enabled = true; buttons[i] = item; i++; } //给button设置图片 for (i = 0; i < rand.Length / 2; i++) { buttons[rand[i]].ImageList = imageList1; buttons[rand[i]].ImageIndex = i; buttons[rand[i]].Tag = i; } for (i = rand.Length / 2; i < rand.Length; i++) { buttons[rand[i]].ImageList = imageList1; buttons[rand[i]].ImageIndex = i - 8; buttons[rand[i]].Tag = i - 8; } } /// <summary> /// 翻转牌 /// </summary> private void TurnCard() { for (int i = 0; i < rand.Length; i++) { buttons[i].ImageList = imageList1; buttons[i].ImageIndex = 8; } } /// <summary> /// 完成 /// </summary> /// <returns></returns> private bool Success() { int i = 0; foreach (Button item in flowLayoutPanel1.Controls) { if (item.Enabled == false) { i++; } } return i == 16 ? true : false; ; } /// <summary> /// 倒计时计时器事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void RTimer_Tick(object sender, EventArgs e) { if (time > 0) { time--; lb_ShowTime.Text = "倒计时:" + time.ToString(); } else { TurnCard(); lb_ShowTime.Text = "计时:" + gameTime.ToString(); RTimer.Stop();//停止倒计时 GameTimer.Start(); //启动游戏计时器 } } /// <summary> /// 按钮事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_Click(object sender, EventArgs e) { if (GameTimer.Enabled) { //翻转button后,显示图片 Button btn = sender as Button; btn.ImageList = imageList1; btn.ImageIndex = Convert.ToInt32(btn.Tag.ToString()); if (bl) { btn1 = btn; bl = false; return; } else { btn2 = btn; bl = true; } //判断是否一样 if (btn1.ImageIndex == btn2.ImageIndex && btn1 != btn2) { btn1.Enabled = false; btn2.Enabled = false; } else { ClickCardTimer.Start();//启动button翻转后显示时间 } } } /// <summary> /// 开始,重新开始 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_StartORRestart_Click(object sender, EventArgs e) { if (btn_StartORRestart.Text == "重新开始") { DealCard();//发牌 //初始变量为默认 time = 10; gameTime = 0; GameTimer.Stop();//游戏时间计时器停止 lb_ShowTime.Text = "倒计时:" + time.ToString(); RTimer.Start();//倒计时开始 } else { btn_StartORRestart.Text = "重新开始"; lb_ShowTime.Text = "倒计时:" + time.ToString(); DealCard();//发牌 RTimer.Start();//倒计时开始 } } /// <summary> /// 点击翻转后显示的时间 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ClickCardTimer_Tick(object sender, EventArgs e) { btn1.ImageIndex = 8; btn2.ImageIndex = 8; ClickCardTimer.Stop(); } /// <summary> /// 游戏时间计时 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void GameTimer_Tick(object sender, EventArgs e) { gameTime++; lb_ShowTime.Text = "计时:" + gameTime.ToString(); //判断是否完成 if (Success()) { GameTimer.Stop(); MessageBox.Show("完成!,耗时:" + gameTime.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } } }
实现有点不合理,时间仓促,就到这里了