Bootstrap

《猜猜看》游戏的开发总结

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个窗口:

[csharp]  view plain copy
  1. using System.Linq;  
  2. using System.Text;  
  3. using System.Windows.Forms;  
  4.   
  5. namespace caicaikan1  
  6. {  
  7.     public partial class Form1 : Form  
  8.     {  
  9.         public Form1()  
  10.         {  
  11.             InitializeComponent();  
  12.         }  
  13.   
  14.         private void button1_Click(object sender, EventArgs e)  
  15.         {  
  16.             Form2 f2 = new Form2();  
  17.             this.Hide();  
  18.             f2.Show();  
  19.         }  
  20.   
  21.         private void button2_Click(object sender, EventArgs e)  
  22.         {  
  23.             Form3 f3 = new Form3();  
  24.             this.Hide();  
  25.             f3.Show();  
  26.         }  
 打开所在图片文件的目录,使用folderBrowserDialog控件:
[csharp]  view plain copy
  1. private void button1_Click(object sender, EventArgs e)  
  2.         {  
  3.             // Show the FolderBrowserDialog.  
  4.             DialogResult result = folderBrowserDialog1.ShowDialog();  
  5.             if (result == DialogResult.OK)  
  6.             {  
  7.                 folderName = folderBrowserDialog1.SelectedPath;  
  8.                 label1.Text = folderName;  
  9.             }  
  10.         }  
获取相应学生名单,使用openFileDialog控件:

[csharp]  view plain copy
  1. // 获取相应的学生名单  
  2.           openFileDialog1.InitialDirectory = folderName;  
  3.           openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";  
  4.           openFileDialog1.FilterIndex = 2;  
  5.           openFileDialog1.RestoreDirectory = true;  
  6.   
  7.           if (openFileDialog1.ShowDialog() == DialogResult.OK)  
  8.           {  
  9.               label2.Text = openFileDialog1.FileName;  
  10.               strClassFilename = openFileDialog1.FileName;  
  11.   
  12.               // 根据班级文件名,得到保存结果的文件名名称:result_班级文件名  
  13.               strResultFilename = "result1_" + openFileDialog1.SafeFileName;  
  14.   
  15.               // 获取学生的学号与姓名  
  16.               StreamReader srReadFile = new StreamReader(strClassFilename, System.Text.Encoding.Default);  
  17.   
  18.               int numStu = 0;  
  19.               // 读取流直至文件末尾结束  
  20.               while (!srReadFile.EndOfStream)  
  21.               {  
  22.                   string strReadLine = srReadFile.ReadLine(); //读取每行数据  
  23.                   //按照空格进行分割  
  24.                   string[] sArray = strReadLine.Split(' ');  
  25.                   ListId.Add(sArray[1]);  
  26.                   ListName.Add(sArray[2]);  
  27.   
  28.                   numStu = numStu + 1;  
  29.               }  
  30.               // 关闭读取流文件  
  31.               srReadFile.Close();  
  32.               totalStu = numStu;  
对图片的显示以及Lable标签名字的变化:

[csharp]  view plain copy
  1. void CreateRmArrayAndUpdateImg(int RmNum)  
  2.         {  
  3.             // 产生三个不重复的随机数字组成数组,并从其中产生一个待猜测的数字  
  4.             //int RmNum = 3;  
  5.   
  6.             int[] rmArray = new int[RmNum + 1];  
  7.   
  8.             Hashtable hashtable = new Hashtable();  
  9.             Random rm = new Random();  
  10.   
  11.             for (int i = 0; hashtable.Count < RmNum; i++)  
  12.             {  
  13.                 int nValue = rm.Next(0, totalStu);  
  14.                 if (!hashtable.ContainsValue(nValue))  
  15.                 {  
  16.                     rmArray[i] = nValue;  
  17.                     hashtable.Add(nValue, nValue);  
  18.                 }  
  19.             }  
  20.             rmArray[RmNum] = rm.Next(0, RmNum);  
  21.   
  22.             //保存带猜测数组  
  23.             ArrayList arrTmp = new ArrayList();  
  24.             foreach (int tmp in rmArray)  
  25.                 arrTmp.Add(tmp);  
  26.             ListGuessArray.Add(arrTmp);  
  27.   
  28.   
  29.             // 产生相关的相片  
  30.   
  31.             label3.Text = ListId[rmArray[0]].ToString() + ListName[rmArray[0]].ToString();  
  32.             label4.Text = ListId[rmArray[1]].ToString() + ListName[rmArray[1]].ToString();  
  33.             label5.Text = ListId[rmArray[2]].ToString() + ListName[rmArray[2]].ToString();  
  34.   
  35.             // 更新图片,需要判断图片是否存在;若不存在则使用一幅画来替代test.jpg  
  36.             int nGuess = rmArray[rmArray[RmNum]];  
  37.             String strTest = folderName + "/" + "test.jpg";  
  38.   
  39.             String strTmp = folderName + "/" + ListId[(int)nGuess].ToString() + ListName[(int)nGuess].ToString() + ".jpg";  
  40.             pictureBox1.Image = new Bitmap(GetPhoteFilename(strTmp, strTest));  
  41.   
  42.             quanju = nGuess;  
  43.   
  44.         }  
  45.         // 获取显示的图片  
  46.         String GetPhoteFilename(String strFilename, String strTest)  
  47.         {  
  48.             if (File.Exists(@strFilename))  
  49.             {  
  50.                 return strFilename;  
  51.             }  
  52.             else  
  53.             {  
  54.                 return strTest;  
  55.             }  
  56.         }  
对单击图片时触发事件,对正确错误的判断:

[csharp]  view plain copy
  1. //获取最后一次猜测  
  2.            ArrayList arr = (ArrayList)ListGuessArray[ListGuessArray.Count - 1];  
  3.   
  4.   
  5.            label6.Text = ListId[(int)quanju].ToString() + ListName[(int)quanju].ToString();  
  6.   
  7.            // 正确的答案  
  8.            int correct = (int)arr[3];  
  9.            string caption = "猜猜看游戏结果";  
  10.            string message;  
  11.            if (label6.Text==label3.Text)  
  12.            {  
  13.                message = "哇,记忆力真棒!是否继续?";  
  14.            }  
  15.            else  
  16.            {  
  17.                message = "哈哈,猜错了!是否继续?";  
  18.            }  
  19.   
  20.            MessageBoxButtons buttons = MessageBoxButtons.YesNo;  
  21.            DialogResult result;  
  22.   
  23.            // Displays the MessageBox.  
  24.   
  25.            result = MessageBox.Show(message, caption, buttons);  
  26.   
  27.            //是否继续  
  28.            if (result == System.Windows.Forms.DialogResult.Yes)  
  29.            {  
  30.                label4.Text = "";  
  31.                label5.Text = "";  
  32.                label6.Text = "";  
  33.                // 更换相片  
  34.                CreateRmArrayAndUpdateImg(3);  
  35.            }  
  36.            else  
  37.            {  
  38.                // Closes the parent form.  
  39.                this.Close();  
  40.            }  
单击返回按钮回到主界面重新选取:

[csharp]  view plain copy
  1. private void button3_Click(object sender, EventArgs e)  
  2. {  
  3.     Form1 f1 = new Form1();  
  4.     this.Hide();  
  5.     f1.Show();  

附:数据库与执行代码下载地址:http://pan.baidu.com/s/1gdJBRlL


 




;