这是利用C#语言写的一个小游戏。
听着还蛮简单的,做起来是真难呀!
好不容易一边完成了,赶紧记下来:
private void Form1_Load(object sender, EventArgs e) { //准备一个画板 GraphicsPath gp = new GraphicsPath(); //在画板的左上角(0,0)开始画一个椭圆,椭圆的长度与宽度与原来窗体相同 gp.AddEllipse(0,0,this.Width,this.Height); this.Region = new Region(gp); } //给窗体镶上金边 private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; g.DrawEllipse(new Pen(new SolidBrush(Color.Gold),5),2,2,this.Width-4,this.Height-4); g.Save(); } //单击“开始”按钮后首先将16张图片全部展示一遍,便于用户记住位置 //3秒钟后,将所有图片都编程蘑菇 int[]arry=new int [16]; //定义一个全局变量,统计某个数与它之前的数比较的次数(有相同的就加1) int count = 0; Random r = new Random(); //将16个数分成两组不同顺序的8(0-7)个数 private void btnGo_Click(object sender, EventArgs e) { //当单击开始按钮时将“开始”按钮隐藏 this.btnGo.Visible = false; //为16个数一次产生随机数,保证只有两个数时一样的,也就是8对 for (int i = 0; i < arry.Length; i++) { arry[i]=r.Next(0,p_w_picpathList1.Images.Count-1); count = 0;//将统计次数变为0 //将目前的数与它前面的比较 for (int j = 0; j < i; j++) { //如果有相同的则count+1 if (arry[i]==arry[j]) { count++; //当统计次数为2(即有三个数相同)时,当前这个数需要重新生成 if (count==2) { i--;//i--完成后进入break,跳出包含break的最内层循环,进入i++(相当于这一位置上的随机数粗要重新生成) break; } } } } count = 0; foreach (object obj in this.Controls) { if (obj.GetType().Name=="MyPictureBox") { //确定每一个控件上的图形应该如何显示,这里选择拉伸或收缩 ((PictureBox)obj).SizeMode = PictureBoxSizeMode.StretchImage; //确定当前控件缩放的图片 ((PictureBox)obj).Image=p_w_picpathList1.Images[arry[count]]; //记录每一个图片的tag属性(图片的序号),后面有用 ((PictureBox)obj).Tag=arry[count]; count++; } } this.timer1.Start(); this.timer2.Start(); } private void btnCancel_Click_1(object sender, EventArgs e) { this.Close(); } int time = 3; //timer1用来控制显示的时间(3秒钟) private void timer1_Tick(object sender, EventArgs e) { //判断时间是否在1-3之间,如果在分别将3的数字显示出来 if(time>0) { //设置字体级大小 this.lblContent.Font = new Font("宋体",30); //往标签上写字 this.lblContent.Text = time.ToString(); } //如果时间为0了,那么将标签显示为“开始” else if (time==0) { //this.lblContent.Font = new Font("微软雅黑", 30); this.lblContent.Text = "开始"; } //如果时间小于0了,那么timer1的任务就完成了,此时将所有的图片都变成蘑菇,开始游戏 else { this.timer1.Stop();//Timer1停止计时 foreach (object obj in this.Controls) { if (obj.GetType().Name=="MyPictureBox") { ((MyPictureBox)obj).Image=p_w_picpathList1.Images[8]; } } } time -= 1; } //控制“Time”变化的速度,什么时候开始变,什么时候不变 private void timer2_Tick(object sender, EventArgs e) { //当标签上的字的大小小于1时,timer2停止 并返回 if (this.lblContent.Font.Size<1) { this.timer2.Stop(); return; } //获取标签上的字体的大小 float f = this.lblContent.Font.Size; //设置字符的字体和大小 this.lblContent.Font = new Font("宋体",f-0.5f); } int clickCount = 0;//点击PictureBox的次数 PictureBox oncePicture;//第一次点击的图片 PictureBox secondPicture;//第二次点击的图片 bool cleanTwoPictures = false; private void myPictureBox1_Click(object sender, EventArgs e) { MyPictureBox mpb = (MyPictureBox)sender; //判断是否两次都点击的是同一张照片 if (clickCount == 1 && mpb.Name == oncePicture.Name) { return; } //在设置当前位置图片的图像 mpb.Image=p_w_picpathList1.Images[int.Parse((mpb.Tag).ToString())]; clickCount++; if (clickCount == 2) { //this.Enabled = false;//使当前控件不可用 clickCount = 0; secondPicture = mpb;//将当前控件作为第二次单击的图片 //判断两次单击的图片的序号是否相同(上面刚进入游戏时,图片的Tag属性存放的是图片的序号) //如果图片的序号相同那么久清除这两张图片 if (oncePicture.Tag.ToString() == secondPicture.Tag.ToString()) { cleanTwoPictures = true; } //如果不同,则不清除图片 else { cleanTwoPictures = false; } //在判断是否清除这两张照片之后,再做相应处理 this.timer3.Start(); } else { oncePicture = mpb;//将当前的图片作为第一次点击的图片 } } private void timer3_Tick(object sender, EventArgs e) { if (cleanTwoPictures == true) { //将两次点击的图片清除 oncePicture.Dispose(); secondPicture.Dispose(); //初始化两个控件(在上一轮中它们已经被赋值) oncePicture = null; secondPicture = null; } else { //将当前的两个控件的图像都变成蘑菇 foreach (object obj in this.Controls) { if (obj.GetType().Name == "MyPictureBox") { ((PictureBox)obj).Image = p_w_picpathList1.Images[8]; } } } this.timer3.Stop(); //this.Enabled = true; }
很简单的游戏而已居然写这么久,要是个大型游戏我不得搞几天啊!
汗颜。。。惭愧。。
不过,还是Ajax的姑娘,加油!
转载于:https://blog.51cto.com/broncho/1321901