1 最终成果
看名字猜图片:
看图片猜名字:
程序的结构:
2 猜猜看游戏的开发过程介绍
一 设置Form1界面,利用按钮的触发事件功能,分别转向不同的2个窗口
二 设置Lable标签,鼠标事件等
三 使用folderBrowserDialog控件,打开所在图片文件的目录
四 使用openFileDialog控件,获取相应学生名单
3 开发时的学习收获
C# 是一种具有 C++ 特性,Java 样式及 BASIC 快速建模特性的编程语言。
编程结构
C# 是大小写敏感的。半角分号(;)是语句分隔符。C# 中所有内容都打包在类中,而所有的类又打包在命名空间中(正如文件存与文件夹中)。和 C++ 一样,有一个主函数作为你程序的入口点。C++ 的主函数名为 main,而 C# 中是大写 M 打头的 Main。类块或结构定义之后没有必要再加一个半角分号。C++ 中是这样,但 C# 不要求。
用户定义类型文件包含: 1. 类 (class) 2. 结构(struct) 3. 接口(interface)
类与结构
类的对象在堆中分配,并使用 new 关键字创建。而结构是在栈(stack)中进行分配。C# 中的结构属于轻量级快速数据类型。当需要大型数据类型时,你应该创建类。
注意:以下类型继承时均分配内存:1. 值类型 2. 参考类型。 值类型
值类型是在堆栈中分配的数据类型。它们包括了: • 除字符串,所有基本和内建类型 • 结构 • 枚举类型 引用类型
引用类型在堆(heap)中分配内存且当其不再使用时,将自动进行垃圾清理。 引用类型包括: • 类 • 接口
• 集合类型如数组 • 字符串 枚举
通过关键字 enum 定义。比如:
1. enum Weekdays
2. {
3. Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday
4. }
属性
C# 提供了一种更加便捷、简单而又直接的属性访问方式。
接口
接口是只包含函数签名而在子类中实现的抽象基类。在 C# 中,你可以用 interface 关键字声明这样的接口类。.NET 就是基于这样的接口的。C# 中你不能对类进行多重继承——这在 C++ 中是允许的。通过接口,多重继承的精髓得以实现。即你的子类可以实现多重接口。
数组
数组分配于堆中,所以是引用类型的。你不能访问数组边界外的元素。所以 C# 防止你引发那种 bug。同时也提供了迭代数组元素的帮助函数。foreach 是这样的迭代语句之一。
特点:
(1)方括号在类型后面而不是在变量名后面
(2)创建元素使用 new 运算符 。
(3 )C# 支持一维、多维和交错数组(数组的数组)
参数和数组的数量变化
C# 中的数组使用关键字 params 进行传递。一个数组类型的参数必须总是函数最右边的参数。只有一个参数可以是数组类型。你可以传送任意数量的元素作为数组类型的参数。
委托
委托让我们可以把函数引用保存在变量中。这就像在 C++ 中使用 typedef 保存函数指针一样。委托使用关键字 delegate 声明。
继承与多态:C# 只允许单一继承。多重继承可以通过接口达到。
代码: class Parent{ }
class Child : Parent
4 开发后的感受与体会
1.多看多写
看一下别人写的代码,会养成一个好的编程习惯。但更重要的是,要看一下比较成熟的代码。
2.多编多敲
看了代码,就要写代码,,可以跟他们相同。这是了解他们的代码,也了解代码的执行过程。特别是在编译的时候,你会发现你的进步和不足。在失败中取得微小的成功,是一件很快乐的事情。
在敲代码的时候,你会发现,你的很多英文都会输入错误。尽量多用“.”这个神奇的点,实质就是调用。
3.简单编程
不要一开始就是很困难、好多行的代码。这样你的自信心会被削弱的。自尊会被打击的。从最基本的学起。
从一开始就慢慢体会代码重复利用的快乐。毕竟这样很节省代码的输入量,而且很能体现你的学习的效果。
4.多多交流
也许很简单的问题,都是一些很简单的属性设置的问题,或许一些你很想不到的边边角角的问题,你总是会感到迷茫,但是,不要担心,你要充分利用帮助文件和网络的资源。
特别是,在学习C#的时候,很多人,很懒得安装MSDN,确实,那些占用很多空间。但那里面有很多好东西,会教你很多的属性的资料和很多方法。
通过网络的搜索,会找到很多有关的话题的解决方法,很多你遇到的问题,很有可能,早就被人发现和被人解决。你会在寻找问题的答案中,获得进步。发现问题和解决问题本身,就是一大进步。
5.发现新思路
编程最麻烦的就是套用老方式和老办法。你可以充分利用现有的对象,进行细化和增加新的属性。创新是编程最大的灵感。
6.编程模式
编程归根结底就是对控件属性的修改的过程,使之符合我们的需要。控件也叫做对象,你跟用户最直接的接触方式。修改的过程也就是函数的应用。
通过对现有的控件的学习,你会发现,这些很基本,但是覆盖的面十分的宽广。也许,这些控件可能无法满足你的需要,你就会新建新的控件,来满足新的需要。
但是,基本的控件你是必须要掌握的。
7.善于总结
在总结中,你会发现,你有很大的进步,也存在很多的不足。所以,你就会千方百计的改进你的工作方式和学习方法,使之不断进步。
编程本身是一项创造性的工作。灵感来自客户的需要,来自市场的需要,来自用户的便捷操作,来自您对自己的信心。
8.创造完美
完美是合作的结晶。通过团队的努力奋斗,你会发现你的工作量减少了,你的质量提高了,你的效率提升了,你的能力增强了。
更重要的事,从你组织和分配中获得的成功,会让你获得鼓励,在今后的编程生活中,体验编程的快乐,从自己做起,分享自己的快乐,从团队合作做起。
总之,自己一直是一位初学者,有很多专业的概念,我还是很不明白,这次,我通过编程实训,使我了解了很多,学习了很多。
5 核心代码的解读
第一个Form1界面,利用按钮的触发事件功能,分别转向不同的2个窗口:
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- namespace caicaikan1
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- private void button1_Click(object sender, EventArgs e)
- {
- Form2 f2 = new Form2();
- this.Hide();
- f2.Show();
- }
- private void button2_Click(object sender, EventArgs e)
- {
- Form3 f3 = new Form3();
- this.Hide();
- f3.Show();
- }
- private void button1_Click(object sender, EventArgs e)
- {
- // Show the FolderBrowserDialog.
- DialogResult result = folderBrowserDialog1.ShowDialog();
- if (result == DialogResult.OK)
- {
- folderName = folderBrowserDialog1.SelectedPath;
- label1.Text = folderName;
- }
- }
- // 获取相应的学生名单
- openFileDialog1.InitialDirectory = folderName;
- openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
- openFileDialog1.FilterIndex = 2;
- openFileDialog1.RestoreDirectory = true;
- if (openFileDialog1.ShowDialog() == DialogResult.OK)
- {
- label2.Text = openFileDialog1.FileName;
- strClassFilename = openFileDialog1.FileName;
- // 根据班级文件名,得到保存结果的文件名名称:result_班级文件名
- strResultFilename = "result1_" + openFileDialog1.SafeFileName;
- // 获取学生的学号与姓名
- StreamReader srReadFile = new StreamReader(strClassFilename, System.Text.Encoding.Default);
- int numStu = 0;
- // 读取流直至文件末尾结束
- while (!srReadFile.EndOfStream)
- {
- string strReadLine = srReadFile.ReadLine(); //读取每行数据
- //按照空格进行分割
- string[] sArray = strReadLine.Split(' ');
- ListId.Add(sArray[1]);
- ListName.Add(sArray[2]);
- numStu = numStu + 1;
- }
- // 关闭读取流文件
- srReadFile.Close();
- totalStu = numStu;
- void CreateRmArrayAndUpdateImg(int RmNum)
- {
- // 产生三个不重复的随机数字组成数组,并从其中产生一个待猜测的数字
- //int RmNum = 3;
- int[] rmArray = new int[RmNum + 1];
- Hashtable hashtable = new Hashtable();
- Random rm = new Random();
- for (int i = 0; hashtable.Count < RmNum; i++)
- {
- int nValue = rm.Next(0, totalStu);
- if (!hashtable.ContainsValue(nValue))
- {
- rmArray[i] = nValue;
- hashtable.Add(nValue, nValue);
- }
- }
- rmArray[RmNum] = rm.Next(0, RmNum);
- //保存带猜测数组
- ArrayList arrTmp = new ArrayList();
- foreach (int tmp in rmArray)
- arrTmp.Add(tmp);
- ListGuessArray.Add(arrTmp);
- // 产生相关的相片
- label3.Text = ListId[rmArray[0]].ToString() + ListName[rmArray[0]].ToString();
- label4.Text = ListId[rmArray[1]].ToString() + ListName[rmArray[1]].ToString();
- label5.Text = ListId[rmArray[2]].ToString() + ListName[rmArray[2]].ToString();
- // 更新图片,需要判断图片是否存在;若不存在则使用一幅画来替代test.jpg
- int nGuess = rmArray[rmArray[RmNum]];
- String strTest = folderName + "/" + "test.jpg";
- String strTmp = folderName + "/" + ListId[(int)nGuess].ToString() + ListName[(int)nGuess].ToString() + ".jpg";
- pictureBox1.Image = new Bitmap(GetPhoteFilename(strTmp, strTest));
- quanju = nGuess;
- }
- // 获取显示的图片
- String GetPhoteFilename(String strFilename, String strTest)
- {
- if (File.Exists(@strFilename))
- {
- return strFilename;
- }
- else
- {
- return strTest;
- }
- }
- //获取最后一次猜测
- ArrayList arr = (ArrayList)ListGuessArray[ListGuessArray.Count - 1];
- label6.Text = ListId[(int)quanju].ToString() + ListName[(int)quanju].ToString();
- // 正确的答案
- int correct = (int)arr[3];
- string caption = "猜猜看游戏结果";
- string message;
- if (label6.Text==label3.Text)
- {
- message = "哇,记忆力真棒!是否继续?";
- }
- else
- {
- message = "哈哈,猜错了!是否继续?";
- }
- MessageBoxButtons buttons = MessageBoxButtons.YesNo;
- DialogResult result;
- // Displays the MessageBox.
- result = MessageBox.Show(message, caption, buttons);
- //是否继续
- if (result == System.Windows.Forms.DialogResult.Yes)
- {
- label4.Text = "";
- label5.Text = "";
- label6.Text = "";
- // 更换相片
- CreateRmArrayAndUpdateImg(3);
- }
- else
- {
- // Closes the parent form.
- this.Close();
- }
- private void button3_Click(object sender, EventArgs e)
- {
- Form1 f1 = new Form1();
- this.Hide();
- f1.Show();
附:数据库与执行代码下载地址:http://pan.baidu.com/s/1gdJBRlL