《C#程序设计》课程考核

一、最终成果,先上图:

看名字猜图界面



看图猜名字界面


源码地址:http://pan.baidu.com/s/1bn2iNGN密码1iuj

二、开发过程简介

大约开发总时间:36小时 

开发过程:

1.解读题目,了解需求:了解程序要实现的功能,需要用到的技术。
2.知识准备:对需要用到的知识加以查找准备,主要上网查找。
3.增量开发:本次开发的是一个小程序,不需要实施软件工程。这里将功能分块,逐步添加调试需实现的功能,直至功能完成。

三、开发时的学习收获

a.知识查找能力:这次开发涉及的面有点广,对相关知识的查找成了重点,能在及时查找到自己需要的信息是种非常重要的能力。
b.代码优化能力:开发时,发现很多代码需要重用,把这些代码独立出来,封装成函数调用可有效精简代码,简化开发流程,减少代码行数,提高可读性。
c.面向对象思想:虽然学面向对象有一段时间了,但真正用过的场合并不多,这次开发用上了一些,但还是不够,相信以后会有提升。用面向对象思想来开发能使程序开发走向一个新的高度。
d.算法设计:算法真是程序的灵魂,这次设计算法的收获。
e.代码改错:代码出错是常有的事,这次开发遇到很多BUG,查错能力有所提升。

四、 开发后的感受与体会

a.心浮气躁难成事
刚开始的时候,想着尽快完成作业,内心急躁,看似简单的作业完全无从下手。更可怕的是,急躁的心理加上毫无进展的任务可能会让你的精神接近奔溃,让你想要放弃。心浮气躁会让你无法专注,降低工作效率。要想有效率地开发,有必要调整心态。

b.从0到1
软件开发是件有趣的事,用计算机本质一点的语言来形容就是从0到1。当你看着代码块变成一个完整的程序(这里只是个小程序),你可以真真切切感受到创造的力量,仿佛你拥有造物主般的能力。说得有点夸张,但开发程序确实是创造性的活动。这是一项非常美妙的活动,是体验生命之美的一种途径。

c.勿安于现状
Stay hungry,Stay foolish ,不要满足于自己当前所拥有的知识,知识永远不够用。这次开发,让我感触最深的是,以前我很快就能解决的问题现在几乎解决不了了。原因很简单,我没有对这个领域j进行深入的探索且没有保持热情。安于现状会让人不思前进,让自己在社会发展的浪潮中退下来。


五、核心代码解读

窗口切换:本程序有两个运行模式,需要两个不同的页面,这里窗口的切换用的是将要实现的两个功能放在两个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();


随机图片,姓名:本程序需要随机显示几个图片或几个名字,随机显示图片是,随机生成一个要猜测的图片序号和随机生成两个图片序号(三个序号不能重复),再将三个序号随机排列显示图片。随机显示名字的原理跟图片的一样,序号生成方法是相同的,然后通过序号显示名字。

       /// <summary>
        ///看名字猜图初始化
        /// </summary>
        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;
                }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值