一、最终成果,先上图:
看名字猜图界面
看图猜名字界面
源码地址:http://pan.baidu.com/s/1bn2iNGN密码1iuj
二、开发过程简介
大约开发总时间:36小时
开发过程:
四、 开发后的感受与体会
五、核心代码解读
窗口切换:本程序有两个运行模式,需要两个不同的页面,这里窗口的切换用的是将要实现的两个功能放在两个panel控件上,通过显示其中一个来覆盖另一个。
//重置或切换到看图片猜名字
private void picToNameMenuItem_Click(object sender, EventArgs e)
{
panelPTN.BringToFront();
//概率生成
genarateProb(new Random());
//随机显示图片
picTNBox.Image = new Bitmap(picInfo[a].FullName);
arrangeByrandom(new Random());
//分配名字
btnN1.Text = picInfo[e1].Name.Remove(picInfo[e1].Name.LastIndexOf("."));
btnN2.Text = picInfo[f].Name.Remove(picInfo[f].Name.LastIndexOf("."));
btnN3.Text = picInfo[g].Name.Remove(picInfo[g].Name.LastIndexOf("."));
}
//重置或切换到看名字猜图
private void nameToPicToolStripMenuItem_Click(object sender, EventArgs e)
{
//给排序数组赋值
//清空重新排序
probSort.Clear();
for (int i = 0; i < picInfo.Length; i++)
{
probSort.Add(new Record(i,Convert.ToDouble( probability[i])));
}
//排序(冒泡)
BubbleSorter(probSort);
NameToPicInit();
panelNTP.BringToFront();
}
图像信息导入:本软件直接从指定目录下导入图片信息,生成一个图片的Index数组,通过操作数组序号来实现绑定图片或图片名。
public FileInfo[] picInfo;
//默认文件夹
string defaultFolder = "E://picture";
//默认日志保存位置
string defaultDatalog = "E://picture/log/log.dat";
//读取文件夹
DirectoryInfo folder = new DirectoryInfo(defaultFolder);
//文件数组初始化
picInfo = folder.GetFiles();
随机图片,姓名:本程序需要随机显示几个图片或几个名字,随机显示图片是,随机生成一个要猜测的图片序号和随机生成两个图片序号(三个序号不能重复),再将三个序号随机排列显示图片。随机显示名字的原理跟图片的一样,序号生成方法是相同的,然后通过序号显示名字。
///
///看名字猜图初始化
///
private void NameToPicInit()
{
//消息清空
boxMessage.Text = "猜猜看";
Random ran = new Random();
genarateProb(ran);
// a = ran.Next(picInfo.Length);
arrangeByrandom(ran);
try
{
picBox1.Image =new Bitmap(picInfo[e1].FullName);
picBox2.Image = new Bitmap(picInfo[f].FullName);
picBox3.Image = new Bitmap(picInfo[g].FullName);
}
catch (Exception)
{
MessageBox.Show("fail");
}
}
private void arrangeByrandom(Random ran)
{
b = ran.Next(picInfo.Length);
while (b == a)
{
b = ran.Next(picInfo.Length);
}
c = ran.Next(picInfo.Length);
while (c == a || c == b)
{
c = ran.Next(picInfo.Length);
}
label1.Text = "哪个是" + picInfo[a].Name.Remove(picInfo[a].Name.LastIndexOf(".")) + "?";
//正确位置随机
int d = ran.Next(3);
if (d == 0) { e1 = c; f = b; g = a; }
else if (d == 1) { f = a; e1 = b; g = c; }
else { g = b; e1 = a; f = c; }
}
概率随机算法:用这个算法的目的是降低认识度高的人的出现次数,提供认识度低的人的出现次数。这个算法将序号通过认识度进行划分成一半一半,认识度高的人出现概率为30%,而另一半人的则为70%。随机1:100,当数字落到1-30,则概率为30%,在前一半中随机抽一个人;当数字落在31-100,在后一半随机抽一人。
private void genarateProb(Random ran)
{
//产生百分比概率,认识概率排序占前一半的出现的概率为30%
int num = ran.Next(0, 100);
//p=0.3
if (num >= 0 && num < 30)
{
a = ((Record)probSort[(int)(ran.Next(0, probSort.Count / 2))]).Index;
}
//p=0.7
if (num >= 30 && num < 100)
{
a = ((Record)probSort[(ran.Next(probSort.Count / 2, probSort.Count))]).Index;
}
}
序列化保存读取:这里将需要保存下来的数据生成一个对象,退出时,将对象序列化为二进制文件,打开软件时从二进制文件中读取还原。
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
//序列化
SerializableOperate.ObjectSerializable(new SaveInfo(right, wrong, probability, probSort), defaultDatalog);
MessageBox.Show("序列化更新成功");
}
//反序列化将日志读出
SaveInfo log = (SaveInfo)SerializableOperate.ObjectUnSerializable(defaultDatalog);
if (log.Right.Count == picInfo.Length)
{
right = log.Right;
wrong = log.Wrong;
probability = log.Probability;
probSort = log.ProbSort;
}