1:游戏要求
1. 随机显示 一个名字 与 若干张相片(如3张),选择正确的相片。
2. 记录老师对每个学生的认识概率P,并根据认识概率,确定“猜猜看”游戏中学生出现的频率。
认识概率P = 识别的准确次数/(识别的准确次数+识别的错误次数
a) 原则1:认识概率 高的学生,在猜猜看游戏中出现的频率相对低一些。
b) 原则2:认识概率 低的学生,在猜猜看游戏中出现的频率相对高一些。
c) 原则3:认识概率 100%的学生,也有出现的可能性。
d) 原则4:认识概率 0%的学生,也不必每次都出现。
请设计一个算法来实现上述原则。
3. 实现课堂考勤的功能,能够根据相片与姓名对部分学生进行考勤(设置一个比例,如考勤30%,50%等);设置可以设计一个算法,类似于目标3,既有随机性,同时每个学生的考勤频率有差异(根据之前考勤的经验)。
2、设计描述:
此系统为猜猜看游戏兼考勤系统
采用了windows窗体界面设计创建了此系统。
系统功能包括:
1、从已设置的学生编号中随机抽取3个编号,并随机显示这三个学生的相片。
2、在设定的文本文件中选取被选中的学生的信息。
2、记录某一个学号每次被猜的信息及被点名信息。
3、显示当前被点学号的被猜和被点的信息,以及所有同学被猜和被点信息。
4、每一个同学最多被点三次,当被点次数超过3时,显示警告窗口,提示用户
重新点名。
5.每次猜对或猜错总数超过10,显示窗口信息,游戏自动结束。
3、系统详细设计——控件选取:
1、listBox1:用来存放及显示所有同学被点信息。
2、Button1:就是开始点名按钮,用来控制随机抽数,当点下开始按钮,其会变成停止按钮,按下停止按钮,显示最终被选中的编号和显示选中的学生相片。
3、Button2:就是用来显示当前被点同学的被点情况。
4、Button3:就是重置按钮,用来清除listBox1中的数据信息。
5、Button4:就是显示listBox1中记录的所有同学被点情况。
6、timer1:用来控制抽取过程中数据在空白处闪动。
7、label1:用来显示被选编号和学生信息。
8、label2:用来显示猜对的总次数。
9、label3:用来显示猜错的总次数。
10、label4:用来显示游戏名字“猜猜看” 。
11、label5:用来显示编号、个人被点总次数、个人被猜对总次数、个人被猜错总次数的文段。
12、pictureBox1:用来显示arry1[i]数组的图片。
13、pictureBox2:用来显示arry2[i]数组的图片。
14、pictureBox3:用来显示arry3[i]数组的图片。
15、imageList1:用来存储和显示相片
4、系统详细设计——代码实现:
1.timer1事件:控制随机选取学号编号,为每一个存储相片的数组抽取一个随机数,并在选出的编号中再随机选取一个编号,作为被猜的编号,同时在已创建的文件中,相对应的读取编号对应的学号的信息。
private void timer1_Tick(object sender, EventArgs e) { long tick = DateTime.Now.Ticks; Random ran = new Random((int)(tick & 0xffffffffL) | (int)(tick >> 32)); for (int i = 0; i < arry1.Length && i < arry2.Length && i < arry3.Length; i++) { arry1[i] = ran.Next(0, imageList1.Images.Count-1 ); arry2[i] = ran.Next(0, imageList1.Images.Count-1 ); arry3[i] = ran.Next(0, imageList1.Images.Count-1 ); int[] ary = new int[3] { arry1[i], arry2[i], arry3[i] }; d = r.Next(0, 2); x = ary[d]; num = ary[d].ToString(); // p = (double)c1[x] / (c1[x] + c2[x]); string[] line = File.ReadAllLines(@"C:\Users\Administrator\Desktop\c#\a.txt", UnicodeEncoding.GetEncoding("GB2312")); label1.Text = "编号" + ary[d].ToString() + "," + "学生信息" + line[ary[d]]; } }
2.button1事件:开始猜猜看按钮,用来控制timer1的运行,三张图片的显示和listBox1里面的信息以及提示警告
private void button1_Click(object sender, EventArgs e) { int[] ary = new int[3] { arry1[i], arry2[i], arry3[i] }; d = r.Next(0, 3); first_click = !first_click; if (!first_click) { timer1.Start(); button1.Text = "停止"; } else { timer1.Stop(); button1.Text = "开始"; new System.Drawing.Size(30, 30); pictureBox1.Image = imageList1.Images[arry1[i]]; pictureBox2.Image = imageList1.Images[arry2[i]]; pictureBox3.Image = imageList1.Images[arry3[i]]; c[x]++; if (c[x] > 3) { MessageBox.Show("警告:该同学超过三次被点名,请重新点名"); timer1.Start(); button1.Text = "停止"; } this.listBox1.Items.Add(num + " " + c[x]+" "+count+" "+count1); } }
3.pictureBox1事件:发生点击图片事件,判断图片与学生信息是否相对应,并计算猜对或猜错的总次数和个人猜对或猜错的总次数及提示猜对或猜错和游戏结束或通过。(以此类推pictureBox2事件,pictureBox3事件)
private void pictureBox1_Click(object sender, EventArgs e) { int[] ary = new int[3] { arry1[i], arry2[i], arry3[i] }; d = r.Next(0, 2); if (arry1[i] == x) { MessageBox.Show("主人,恭喜你,答对了"); count++; c1[x]++; label2.Text = "猜对总次数" + count; this.listBox1.Items.Add(num + " " + c[x] + " " + c1[x] + " " + c2[x]); while(count==10) { MessageBox.Show("主人,恭喜你通过了游戏"); } } else { MessageBox.Show("主人,错了哦,继续努力"); count1++; c2[x]++; label3.Text = "猜错总次数" + count1; this.listBox1.Items.Add(num + " " + c[x] + " " + c1[x] + " " + c2[x]); while (count1 == 10) { MessageBox.Show("主人,很遗憾,你没通过游戏"); } } }
4.button2事件:用作“显示该同学信息”显示当前同学被点信息,用作考勤功能
private void button2_Click(object sender, EventArgs e) { if (c[x] == 3) { MessageBox.Show("该同学第三次被点名"); } if (c[x] == 2) { MessageBox.Show("该同学第二次被点名"); } if (c[x] == 1) { MessageBox.Show("该同学第一次被点名"); } }
5. button3事件:用作重置按钮,清除listBox1里面记录的信息
private void button3_Click(object sender, EventArgs e) { this.listBox1.Items.Clear(); result.Clear(); }
6. button4事件:用作“显示所有被猜及被点信息”按钮,显示所有同学当前被猜和被点的具体信息
private void button4_Click(object sender, EventArgs e) { this.listBox1.Visible = !this.listBox1.Visible; this.button3.Visible = !this.button3.Visible; }
5、系统实现
1、点击开始运行
2、点击开始点名按钮,开始点名按钮变成停止按钮:
3、点击停止按钮:显示当前随机抽取的三张相片和的学生信息
5、点击图片,若猜错了,弹窗显示
6.若是随机点名抽取的编号超过三次,弹窗警告。
7.若猜图片猜错十次,弹窗显示,猜图片失败
8.若猜图片猜对十次,弹窗显示,猜图片成功
9.按一下“该同学被点信息”的按钮,弹窗显示该同学被点的信息
10. 分别按一下“所有被猜及被点次数”和“重置”按钮,所有同学被点名的所有信息在列表框中显示,重置按钮则是清除列表框的内容。
11. 文本中的学生信息
6、小结:
弄这个游戏断断续续的花了挺多时间的,大概半个月吧,当然这中间穿插了许多杂七杂八的事情,从很久之前就开始做了,但对于c#还是太陌生了,这和我这学期没有花足够的时间去学有关,所以一开始设计时,脑袋一片空白,一点头绪都没有,只能从之前作业的内容里找一些灵感。一开始我在选取图片的方式上花了好多时间,因为对pictureBox接触不多,还没能完全会用,这给我一开头造成好多麻烦,一直卡在这里进退不得,那时心里特别烦躁,上网搜资料都是迷迷糊糊的,像一头盲头苍蝇一样,无从下手,后来把它又搁置了几天后,这时心里也平静了许多,脑袋也开始慢慢进入主题,开始认真思考问题。由于我读取图片使用的是文件流函数,从既定的路径中读取图片,但是我又发现,我无法将图片里的学生信息显示出来,所以我就将图片的名字改成自然数,把里面的学生信息提取出来放进一个txt文件里面,用lable标签控件显示出来,但这样另一个问题又来了,我无法确保图片和lable标签里的内容只有一对相对应,于是这个问题又困扰了我一天,后来问了一下舍友,经她提示,把选出来的那三个图片编号放进一个数组里,在这个数组里再用随机函数随机选取一个,就能保证图片和学生信息的一一对应了;但是我发现被改成自然序号的图片编号和学生信息之间没有共同点,这样就连不起来了;经过一番思考,我想到了数据库,我的想法是把学生信息和图片编号存进数据库,从数据库中读取就能有共同的链接点了,于是我又把读取相片的方式从文件流换成了从数据库读取,但是问题很快出现了,因为我对链接数据库的操作完全陌生,虽然之前作业有试过连接,但当时因为电脑软件问题一直没连接上,后来就一直搁置了这个操作,在尝试了一晚以后,我就放弃了用数据库这个念头。问题似乎又回到了最开始的时候,相片到底要怎样引进才能和标签信息同步,因为没想法,我开始去网上搜搜各类资料,后来我又发现了用imageList的方法,它用是用数组存储相片的方法,这样我就能共用这个数组,引进每个pictureBox里面了,经过多次测试、修改,终于把相片编码和标签同步显示出来了,那时心情真是激动到极点,终于完成了第一步,果然是万事开头难啊,入门了其他事情就能循序渐进了,所以我下一步就开始点击图片事件了,刚写这部分时其实还不是很有想法的,因为我一直在想的是点击图片和标签信息时,相片是会跳动或翻转的,结果就钻了牛角尖,一直挣扎怎么让相片在点击后可以自己动,后来写完程序,调试后才知道,只要相片的编号和标签信息有一一对应的关系了,就能发生事件了,所以我在每个pictureBox事件里写了三个同样的程序,只要把if语句里的条件语句换成和每个pictureBox相对应的语句就行了,然后在if语句里面相对应的添加了messageBox、猜对/猜错的总次数等语句,经过不断的修改、添加考勤功能等步骤,终于完成了初具规模的猜猜看游戏,虽然功能上还有一些不完善,但是我还是挺满意的,从一窍不通,到自己亲自作出一个小游戏,在这过程中收获的知识非常多,这就像一种积累的财富,一点一点的积累,最后所拥有的一定是别人无法给予的,实践才是真理,其实我也可以做到。
我的百度网盘的地址:http://pan.baidu.com/s/1kTszg7H
版权声明:本文为博主原创文章,未经博主允许不得转载。