1.关键成果展示
程序开始运行时界面如下
点击显示图片运行后,将会出现三张不一样的照片,如图所示。
选择其中一张图片点击,如果猜对了,将会出现如下图所示界面。
点击确定后返回图2,点击继续猜又重新出现三张不一样的照片。
选择其中一张照片,如果照片选择的人和被猜的人信息不匹配,将会出现如下界面
当不玩用游戏退出时点击“退出游戏”会出现一个信息框,问你是否保留游戏数据。
当选择“是”时,将会把此次游戏的数据结果保存至数据库,当选择“否”时会出现如下图所示信息,游戏数据将会被清空
猜猜看游戏源码下载地址:http://pan.baidu.com/s/1jGiXW6i
2.猜猜看游戏的开发过程介绍
设计思路
之前作业写过随机显示图片用到了picturebox,这次也同样用到,因为要显示三张图片,所以我使用了三个picturebox。图片的存取是游戏开发的重点之一。为了更好的读取图片我将图片信息用cmd命令提取出来然后导入我之前在数据库建立的一个名字叫caicaikan的表中,然后通过图片路径读取图片。以下是数据库内容
当可以读取图片时,为了防止读取图片是出现的图片相同,要用到while语句。当我选到的图片相同时,应该再重新选取一张。
选出三张图片后在从这三张图片中选一张作为目标图片,显示他(她)的学号姓名。为了更好的选择目标图片, 我写了一个算法,首先判断选出的三张图片被选出的总次数,如果三张图片的总次数相等,再比较选对的次数如果选对的次数相等,随机选取一个作为目标图片。如果选对的次数不相等,则选取一个最小的作为目标图片。当三张图片被选出的总次数不相等,选择最小的那个作为目标图片。
if(realsum1==realsum2||realsum2==realsum3)
{
if(rightcount1==rightcount2||rightcount2==rightcount3)
{
string[] a = {str1,str2,str3};
Random rand =new Random();
int aa =rand.Next(1,3);
label1.Text = a[aa];
str4 = label1.Text;
}
else
{
if(rightcount1<rightcount3||rightcount1<rightcount2)
{
label1.Text=str1;
str4 = label1.Text;
}
if(rightcount2<rightcount1||rightcount2<rightcount3)
{
label1.Text=str2;
str4 = label1.Text;
}
if(rightcount3<rightcount2||rightcount3<rightcount1)
{
label1.Text=str3;
str4= label1.Text;
}
}
}
else
{
if(realsum1<realsum2||realsum1<realsum3)
{
label1.Text=str1;
str4 = label1.Text;
}
if(realsum2<realsum1||realsum2<realsum3)
{
label1.Text=str2;
str4 = label1.Text;
}
if(realsum3<realsum1||realsum3<realsum1)
{
label1.Text=str3;
str4= label1.Text;
}
}
关于游戏数据问题,我犹豫是否要专门用一个button控件去清除数据,最后我没有选择用这个。而是把退出游戏和数据保留写在同一个button。我设置在游戏退出时选择是否保留数据,我是想到如果用户只是想删除这一次的数据而不删除之前玩的数据。但我在写的时候我是把所有游戏数据都删除了。关于我之前所想的一个大概思路,但基于时间问题暂时先放下。
3.开发时的学习收获
学习了MySQL数据库,之前我的visual studio连接MySQL数据库一直都有问题,然后之前努力了好久都没有弄好,这次终于弄好了!在开发这个游戏过程中,我对这个软件的使用你越来越熟悉,也学会了好几个控件的使用。对于winform的操作和使用有了更深层次的了解和认识。总的来说收获还是很大的。
4.开发时间
我不记得我从什么时候开始写,中间有断过,因为有考试和有论文要写,估计花了一星期吧。
5.开发后的感受与体会
一开始我犹豫是用JSP写还是用c#写,用JSP感觉是在做JSP的课程考核,但是叫我用C#写,又怕写不出来。等写不出来,再用JSP写又怕时间不够(因为还有很多其他科的课程设计要写)。犹豫再三,我决定用C#写。一开始我用的事文本写的,但是总是出现数据异常,在用文本写的过程中,我学会了imagelist控件。后面我觉得用数据库会比较简单些,我就开始使用数据库,开始我的想法是把图片用二进制流存进数据库但是不知道为什么一直没有成功,上网查资料,查书,发现大部分用的都是SQL,没有MySQL的,弄了很久都没有改好,资料也说还有第二种方法,我决定现用第二种方法把课程考核过关,在暑假的时候再把第一种方法学好。但是第一种方法远不及第二种方法好。虽然我开发出来的不是很好,但是能把它写出来,我觉得对于我自己来说是一个很大的进步,当它成功的那一刻,只有自己能体会到。还有,我觉得学习间应该多交流,因为很可能你花了一整天都没解决好的问题,别人也曾经遇见过而且吧它解决了,虽然在这个过程中也会有一定的收获,但是如果过多的时间花在同一个问题上就有点得不偿失了。
6.核心代码解读
1)读取照片代码
private void button2_Click(object sender, EventArgs e)
{
//一个有109个数的数组随机取数
Random ra1 = new Random();//实例化一个随机数对象
int num1 = ra1.Next(1, 109);
Random ra2 = new Random();
int num2 = ra2.Next(1,109);
Random ra3 = new Random();
int num3 = ra3.Next(1, 109);
while (num2 == num3)
{
num2 = ra2.Next(1, 109);
}
while(num1 == num2 || num1 == num3)
{
num1 = ra1.Next(1, 109);
}
string con = "server=localhost;User Id=root;password=;Database=tupian;Charset=utf8";
MySqlConnection mycon = new MySqlConnection(con);
mycon.Open();
//读取游戏中的第一张图片
MySqlCommand cmd1 = new MySqlCommand("SELECT blobdata,sum,rightcount FROM caicaikan where blobid="+ num1 , mycon);//设置命令参数
MySqlDataReader dr1 = cmd1.ExecuteReader();//执行命令并获得数据读取器
if (dr1.Read())
{
str1 = dr1["blobdata"].ToString();
string sum1 = dr1["sum"].ToString();
realsum1 = Convert.ToInt32(sum1);
pictureBox1.Image = Image.FromFile("E:\\csharp\\photos\\" + str1);
}
dr1.Close();
//读取游戏中的第二张图片
MySqlCommand cmd2 = new MySqlCommand("SELECT blobdata, sum,rightcount FROM caicaikan where blobid="+ num2 , mycon);//设置命令参数
MySqlDataReader dr2 = cmd2.ExecuteReader();//执行命令并获得数据读取器
if (dr2.Read())
{
str2 = dr2["blobdata"].ToString();
string sum2 = dr2["sum"].ToString();
realsum1 = Convert.ToInt32(sum2);
pictureBox2.Image = Image.FromFile("E:\\csharp\\photos\\" + str2);
}
dr2.Close();
//读取游戏中的第三张图片
MySqlCommand cmd3 = new MySqlCommand("SELECT blobdata, sum,rightcount FROM caicaikan where blobid=" + num3, mycon);//设置命令参数
MySqlDataReader dr3 = cmd3.ExecuteReader();//执行命令并获得数据读取器
if (dr3.Read())
{
str3 = dr3["blobdata"].ToString();
string sum3 = dr3["sum"].ToString();
realsum1 = Convert.ToInt32(sum3);
pictureBox3.Image = Image.FromFile(@"E:\csharp\photos\" + str3);
}
dr3.Close();
//设计相片名字出现的算法
//如果出来的三张照片出现的总数都相同时,则出现rightcount最小的相片信息,如果rightcount相同,则随机出现相片信息
if(realsum1==realsum2||realsum2==realsum3)
{
if(rightcount1==rightcount2||rightcount2==rightcount3)
{
string[] a = {str1,str2,str3};
Random rand =new Random();
int aa =rand.Next(1,3);
label1.Text = a[aa];
str4 = label1.Text;
}
else
{
if(rightcount1<rightcount3||rightcount1<rightcount2)
{
label1.Text=str1;
str4 = label1.Text;
}
if(rightcount2<rightcount1||rightcount2<rightcount3)
{
label1.Text=str2;
str4 = label1.Text;
}
if(rightcount3<rightcount2||rightcount3<rightcount1)
{
label1.Text=str3;
str4= label1.Text;
}
}
}
else
{
if(realsum1<realsum2||realsum1<realsum3)
{
label1.Text=str1;
str4 = label1.Text;
}
if(realsum2<realsum1||realsum2<realsum3)
{
label1.Text=str2;
str4 = label1.Text;
}
if(realsum3<realsum1||realsum3<realsum1)
{
label1.Text=str3;
str4= label1.Text;
}
}
//获取目标照片信息
MySqlCommand cmd4 = new MySqlCommand("SELECT blobdata, sum,rightcount,wrongcount FROM caicaikan where blobid='"+ str4 +"'",mycon);//设置命令参数
MySqlDataReader dr4 = cmd4.ExecuteReader();//执行命令并获得数据读取器
if (dr4.Read())
{
string right = dr4["rightcount"].ToString();
string wrong = dr4["wrongcount"].ToString();
string sum4 = dr4["sum"].ToString();
realsum4 = Convert.ToInt32(sum4);
rightcount4 = Convert.ToInt32(right);
wrongnum4 = Convert.ToInt32(wrong);
}
label1.Text = str4;
dr2.Close();
}
解读:这段代码主要是选取图片,首先我定义了三个随机数组,它们分别对应三个picturebox。在读取照片信息前要排除出现照片重复的可能性。然后就是设计读取照片的算法,上面已经讲过不再重复。
2)判断哪个是匹配的照片(以其中一个picturebox为例,其他两个picturebox代码都一样)
private void pictureBox1_Click(object sender, EventArgs e)
{
string constr = "server=localhost;User Id=root;password=;Database=tupian;Charset=utf8";
MySqlConnection mycon = new MySqlConnection(constr);
mycon.Open();
//图片信息与正确信息相同时
if(str1==str4)
{
MessageBox.Show("你猜对了!goodjob!");
MySqlCommand cmd4 = new MySqlCommand(" update caicaikan set rightcount=rightcount+1,sum=sum+1 where blobdata='" + str4 + "'", mycon);
cmd4.ExecuteNonQuery();
}
//选取图片信息不匹配时
if(str1!=str4)
{
MessageBox.Show("你猜错了~~~~(>_<)~~~~");
MySqlCommand cmd4 = new MySqlCommand(" update caicaikan set wrongcount=wrongcount+1,sum=sum+1 where blobdata='" + str4 + "'", mycon);
cmd4.ExecuteNonQuery();
}
}
解读:这段代码主要判断这张照片是不是与我们之前所选择的目标照片信息是否一致,如果一致则表明猜对了,反之,则猜错了。
3)退出游戏代码
private void button3_Click(object sender, EventArgs e)
{
string message;
message="是否保留游戏数据";
MessageBoxButtons buttons = MessageBoxButtons.YesNo;
DialogResult result;
result = MessageBox.Show(message, caption, buttons);
if (result == System.Windows.Forms.DialogResult.No)
{
string constr = "server=localhost;User Id=root;password=;Database=tupian;Charset=utf8";
MySqlConnection mycon = new MySqlConnection(constr);
mycon.Open();
MySqlCommand mycmd7 = new MySqlCommand(" update caicaikan set rightcount=0,wrongcount=0,sum=0", mycon);
int a = mycmd7.ExecuteNonQuery();
if (a!=0)
{
MessageBox.Show("清除数据成功!");
this.Close();
}
else
{
MessageBox.Show("清除数据失败!");
this.Close();
}
}
else
{
this.Close();
}
}
解读:这段代码是为了用户不玩游戏时可以退出游戏和选择是否保存这次的游戏数据当选择不保留数据时,数据库里的游戏数据库会被清空。