C#程序设计——猜猜看

本文介绍了一个C#程序,该程序利用WPF界面和SQL Server数据库实现了一个猜照片与名字对应的游戏。游戏包含两种模式,分别是以照片猜名字和以名字猜照片。用户可以从数据库中获取信息,照片以二进制数据存储。程序还包括添加、编辑、删除信息功能,并对输入数据进行了有效性检查。开发过程中,作者学习了如何随机抽取数据库记录并处理,增强了对数据库和程序设计的理解。
摘要由CSDN通过智能技术生成

程序介绍:

            在我们的学习生活或者在我们的工作生活中经常遇到这样的问题,在学校,老师在给学生上课的时候叫不出学生的名字,同学之间在路上相遇的时候虽然有过几面之缘,却还不认识彼此,叫不出彼此的名字;在公司,楼上的同事与楼下的同事曾一起下过班打过卡,却都是擦肩而过,彼此点了个头。于是,这个程序可以帮你认识辨认更多的人,甚至更深入的了解对方。      

            该程序设计实现了随机显示三张学生照片一个名字学号猜其中哪张照片与名字对应的功能,就如每天见过好多面孔却想不起那个名字,还有随机显示三个学生名字学号一张照片猜其中哪个名字与其照片对应的功能,就如某天在路上碰到一个人脑里却闪过两三个名字不确定哪个是他/她,游戏的参与者可通过该游戏来辨认认识更多的小伙伴。

            该程序主要用了WPF作为操作界面,搭建SQL Server数据库与程序进行链接,名字学号照片等信息存放与数据库中,使用的时候可从数据库调用到界面,照片存放于数据库中采用的是二进制数据的存储,其实还可以添加更多的个人信息,如兴趣爱好等,更方便游戏的参与者更深入了解身边的小伙伴们,当然收集信息的难度略大。

 

以下稍微展示一下程序:


这是看三张照片猜下方对应名字的界面,点击随机显示照片按钮即可开始游戏


点击照片猜对就会显示猜对,猜错则是会报猜错


这是看三个名字猜上方对应照片的界面,点击随机出名字按钮即可开始游戏

点击对应名字学号蓝色方框内的内容猜对就会显示猜对,猜错则是会报猜错


添加信息界面与编辑信息界面用的是同一个界面,当点击编辑的时候会直接读取数据库里的内容直接显示到该界面上来,在此不一一截图。

由于数据库的值都不可为空,所以当点击保存的时候会做出判断,假如姓名或者学号或者照片为空的时候,姓名学号的文本框会变红提示,没照片则会弹出提示。

以此保证用户必须填充数据。



添加照片考虑到部分同学可能找不到照片,在此提供了打开电脑摄像头拍照功能,在上面的界面点击选择照片则弹出对话框可选择电脑上的照片加入,点击拍照则可弹出另一个界面直接打开摄像头,在点击拍照可直接把照片赋到界面上。

需要删除数据的话直接点击界面的删除按钮即可,点击后直接链接到数据库删除数据。





以下是数据库创建的列名及数据类型

数据库保存的数据



开发过程:

起先是先着手创建好数据库及其需要的数据类型,然后按照三层架构的思想首先编写一个SQLhelper将需要连接数据库以及执行的代码放在这里,方便后面连接数据库每一次执行增删改的调用,接着编写DAL层(即程序里的StudentDAL.cs),所有的增删改的查询语句都在DAL层里面,包括获取所有的数据显示在主界面,点击选中行获取该行数据编辑或者删除的主要代码都在这个层里,至此数据库部分基本上算是大功告成。接下是则是UI层,即界面层,程序的界面是用WPF编写,主要会用到XAML语言,用WPF有一个好处就是可以使用布局,然后在datagrid里用到一个数据绑定,可以将数据库的数据绑定显示到界面上来,界面写完之后就开始写核心程序,其中的难点就是如何在数据库里随机获取记录,这里用到一个语句是 select top N from TABLE order by newid() 这是一个最简单的方法,通过调用SQL servernewid() 函数来产生随机记录。再是调取记录后显示到界面这块,需要获取所有控件,对控件进行判断类型后赋值到控件上,还要从随机获取的记录再取出一条数据以判断用户所猜的与其是否对应,要用到Random() 函数,由于数组下标从0开始,显示是13,需要减1,这一整块是比较花时间的。拍照部分是用到一个WPFMideaKit.dll 直接引用添加到程序里来,添加命名空间后就可以用,这部分主要是参照别人的程序所做。整一个程序做下来大概花了一个星期的时间,不过还是很值得的。

核心代码解读:
 
以显示三张照片一个名字的为例(另一功能与此类似,控件不一样而已)
private static string dbStr = ConfigurationManager.ConnectionStrings["database"].ConnectionString;

在这里的第一行代码是定义一个dbStr的变量来存放一个数据库的连接字符串,连接字符串放在app.config中,这样做的好处就是每处连接数据库直接在SqlConnection 后面的括号打上这个变量即可,同时也方便用户直接在配置文件中修改,不必在程序中每处修改,app.config中需添加的代码如下:

<span style="font-size:14px;">  <connectionStrings>
    <add name ="database" connectionString="data source=.;Initial Catalog=Guess;user ID=guessSA;password=123456789"/>
  </connectionStrings></span>

接下是按钮点击事件,点击后连接数据库,随机取出三个记录填充到一个table中

<span style="font-size:14px;">private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            using (SqlConnection conn = new SqlConnection(dbStr))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "select top 3 * from T_Student order by newid()";
                    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                    DataSet dataset = new DataSet();
                    adapter.Fill(dataset);
                    DataTable table = dataset.Tables[0];
                    rows = table.Rows;</span>

接下去是控件的处理,以及显示,首先是获取Gird控件的所有子控件,返回数组element,然后遍历element数组,用到一个for循环在里头判断,如果是Image控件,因为已知的Image控件有三个,

所以用到一个正则表达式,0到3,就是>0、<=3,因为数组的下标是从0开始,所以需要自减一次,

然后赋值,BingPic方法是读取二进制数据照片后显示在控件在,整个循环三个,所以这个方法也运行三次。接下再判断数组中的TextBlock控件,用到一个Random取出上面三个中的随机一个,从而填到界面上,next(0,3)也是>0、<=3的意思,在这三个中随机取,放到界面上

<span style="font-size:14px;">UIElementCollection element = grid.Children;
for (int n = 0; n < element.Count; n++)
     {
         if (element[n] is Image)  
            {
               Image _img = (Image)element[n];
               Match mactch = Regex.Match(_img.Name, "[0-3]");  
               int m = Convert.ToInt32(mactch.Value);                                                        
               m--;

               DataRow row = rows[m];
               long SNo = (long)row["SNo"];
               string name = (string)row["Name"];
               byte[] photo = (byte[])row["Photo"];
               BingPic(_img, photo);
            }
      if (element[n] is TextBlock)
                        {
                            Random ran = new Random();
                            int t = ran.Next(0,3);
                            DataRow row = rows[t];
                            string name = (string)row["Name"];
                            long SNo = (long)row["SNo"];
                            txtName1.Text = "姓名";
                            txtName.Text = name;
                            txtSNo.Text="学号      "+SNo;                        
                        }
      }
        private static void BingPic(Image _img, byte[] photo)
        {
            MemoryStream stream = new MemoryStream(photo);
            BitmapImage bmpImg = new BitmapImage();
            bmpImg.BeginInit();
            bmpImg.StreamSource = stream;
            bmpImg.EndInit();
            _img.Source = bmpImg;
     }</span>

    最后是判断鼠标点击的照片,获到点击的是哪张照片,同样数组从0开始,所以自减,利用所点击的照片在数据库中存储所对应的名字,及TextBlock上显示的名字是否对应,一致则判断正确,错误则显示You are wrong! a和b是累计猜对和猜错的次数,答对则a++,答错则b++,然后显示在界面上。

<span style="font-size:14px;">private void img1_MouseDown(object sender, MouseButtonEventArgs e)
        {
            Image img = (Image)sender;
            Match mactch = Regex.Match(img.Name,"[0-3]");   
            int num = Convert.ToInt32(mactch.Value);
            judge(num);
        }

        int a = 0;
        int b = 0;

        private void judge(int num)
        {
              num--;
             DataRow row= rows[num];
             judgeName = (string)row["Name"];

            if (txtName.Text == judgeName)
            {

                MessageBox.Show("bingo!! 猜对了!");
                a++;
                tbx1.Text=a.ToString();
            }
            else
            {
                MessageBox.Show("You are wrong!");
                b++;
                tbx2.Text = b.ToString();
            }
        }</span>

开发后的感受与体会:

数据库部分之前的学习还算是可以的,所以此次设计就直接采用数据库来做这个程序,直到我把数据库部分及代码做完后一个很大的问题就来了,如何随机取数据库里的记录,取出来后又要怎么处理,在这里先后找了很多资料,包括获取所有控件筛选类型等,学到很多新的知识,同时也巩固了自己以前学的数据库知识以及三层架构的知识。

通过本次课程设计,使我对这门课程有了更深入的理解,同时也认识到一个人的力量是有限的,要想把课程设计做的更好,就要学会参考一定的资料,吸取别人的经验,让自己和别人的思想有机的结合起来,得出属于你自己的灵感。程序的编写需要有耐心,有些事情看起来很复杂,但问题需要一点一点去解决,分析问题,把问题一个一个划分,划分成小块以后就逐个去解决。再总体解决大的问题。这样做起来不仅有条理也使问题得到了轻松的解决。

 

注:数据库部分及三层架构可参考本人博客中前面的文字,知识一样,内容类似。
附:猜猜看程序下载链接
开发环境:Visual Studio 2012     SQL server2012






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值