一:在源码管理器中打开VS

注意,下文这样的打开方式是在 TFS 的源码服务器中打开解决方案。如果我们使用 SVN,则直接在硬盘上打开解决方案就可以了。

打开VS:

然后按上图中的步骤1和2(双击2处),打开我们的解决方案,如下:

注意,双击红框,会显示Solution Explorer。

我们在上一节中,只是创建了打老鼠的解决方案,还完全没有编写任何代码。这个时候运行解决方案一下(记得吗,菜单中Debug->Start without debug,或Ctrl+F5。我喜欢用快捷键,而且你也必须快速熟悉起这些快捷键,使用快捷键可以节约时间)。

运行起来后,是一个空白的Windows窗体,如下:

二:导入资源文件

现在我们就要在这个窗体上打老鼠了。

打老鼠这个游戏的最终效果图如下:

为了完成这个游戏,有两个图片资源要用到(请自行右键下载):

bg.png

mouse.png

请把这两个图片保存到我们的项目的根目录下,请查看下节视频进行图片资源的导入及背景设置:

最后,我们看到的整个VS画面应该是这样的:

三:实现最简单的功能

接下来,我们就该简单的把打老鼠游戏的整个编码实现思想说一下了。我们看到背景上有11个老鼠洞:

1:首先给11个老鼠洞都覆盖上老鼠形象;

2:把全体老鼠形象设置为不可见;

3:给程序设定一个始终,让时钟每隔1秒随机显示一个老鼠形象;

四:视频

非公开,请联系 最课程(www.zuikc.com

五:代码讲解

现在,我们来看看视频中的代码到底是什么意思:

private List<PictureBox> _mouses = new List<PictureBox>();
        private Timer _timer = new Timer();
        private Random _random = new Random();
        private PictureBox _oldMouse;
        private int _score = 0;

在这里,我们定义了一些变量,其中:

_mouses 用来存放全部的老鼠图片;
  _timer 是一个计时器;
  _random 在这里代表了一个随机数;
  _oldMouse 在这里当前正在出现的那只老鼠;
  _score 用于记录分数,暂时还没起到作用;

再看下面这段代码:

foreach (Control item in this.Controls)
            {
                if(item is PictureBox)
                {
                    _mouses.Add(item as PictureBox);
                }
            }

_timer.Interval = 1000;
            _timer.Tick += _timer_Tick;
            _timer.Start();

foreach 表示这是一个循环,我们需要把所有的老鼠都加入到 _mouses 这个变量中去,因为一开始这个变量中是空的,没有老鼠的;
   _timer.Interval = 1000; 表示为定时器的时间设置为 1 秒;
   _timer.Tick += _timer_Tick; 表示定时器定时时间到的时候,要触发一个函数,这个函数叫 _timer_Tick;
   _timer.Start(); 表示定时器开始计时吧;

再看定时器触发的这个函数:

void _timer_Tick(object sender, EventArgs e)
        {
            if(_oldMouse != null)
            {
                _oldMouse.Visible = false;
            }

int index = _random.Next(1, 11);
            _oldMouse = _mouses[index];

_oldMouse.Visible = true;
        }

在这个函数里面的逻辑就是,如果当前有老鼠正在显示着,就应该先隐藏,让另外一只老鼠出现;

运行程序,我们就会发现每隔 1 秒,就会随机出现一只老鼠;

现在,我们继续完善代码,要实现:当老鼠形象出现的时候,鼠标击中了老鼠则计分+1,并显示出来;

实际上,只要修改上面的 foreach 循环中的代码为:

foreach (Control item in this.Controls)
            {
                if(item is PictureBox)
                {
                    _mouses.Add(item as PictureBox);
                    item.MouseDoubleClick += item_MouseDoubleClick;
                }
            }

即,为老鼠增加鼠标双击事件,其事件方法为:

void item_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            _score++;
            _labelScore.Text = _score.ToString();
        }

这就完成了“鼠标击中了老鼠则计分+1,并显示出来”,我们看到,上面多了个没见过的变量  _labelScore,它是怎么出现的呢,看视频。

六:截止目前为止的打老鼠知识点

到目前为止,我们实现的打老鼠游戏虽然简单,却已经包含了很多的语法知识,如下11个知识点:

接下来,我们就需要一一学习一下这些知识。(注意,在本节下面的详细叙述当中,各个知识点我会只讲到当前必须知道的程度,随着课程的深入会逐步补充各个知识点的深入阐述。)

1和2:被引用的命名空间以及定义当前的类的命名空间

把类在归类一下,就叫命名空间。

命名空间和文件夹的关系?没有关系!当然,常用的做法是,一个命名空间就使用一个文件夹。

如果我们在当前类中要引用到别的类,则方便的做法是把别的类所在的命名空间用using引入进来,如上图的1;

反过来,我们现在在编写打老鼠这个类,就需要为当前的这个类定义一个命名空间,如上图的2;

3和4:类和实例

在C#的世界中,代码是以类为单位组织起来的,我们可以看到:

public partial class Form1 : Form

Form1就是一个类。关于一个类的最简单的形式如下:

class Mouse

{

}

至于打老鼠游戏中的Form1这个类声明当中的partial和后面的冒号后的内容,我们暂时可以不管它。

类和文件的关系?没有关系!当然,常用的做法是,一个类使用一个文件。

对类使用new关键字,就产生了类的一个实例,如:

Mouse aMouse = new Mouse();

5和10和11. 变量

在类以内,方法以外,没有修饰static的变量,为实例变量;

方法以内的变量,叫做局部变量;

变量在方法的声明内,叫做方法参数;

变量(或者说变量名),代表的就是某个你要操作的对象。

6和9. 方法

方法定义了类的行为,也就是类可以干什么。

有一类特殊的方法叫做构造器。它是在产生类的实例的时候首先被调用的。

7. 循环结构

foreach,for,while,都属于循环结构,光看代码,大家应该都能准确理解起意思,不在赘述。

8. 条件结构

If属于条件结构,很简单,不再赘述。

同属于条件结构的还有switch和三元运算符,等我们使用到的时候一并讲解,这里不再赘述。

微信扫一扫,关注最课程,获取每日一练

C#零基础入门03:打老鼠初级的更多相关文章

  1. # 095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 03 封装总结 01 封装知识点总结

    095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  2. 094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 04 static关键字(续)

    094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  3. 093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 03 static关键字(下)

    093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  4. 092 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 02 static关键字(中)

    092 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  5. 091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 01 static关键字(上)

    091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  6. 090 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 04 使用包进行类管理(2)——导入包

    090 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  7. 089 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 使用包进行类管理(1)——创建包

    089 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  8. 086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结

    086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结 本文知识点:面向对象基础(类和对象)总结 说明 ...

  9. 084 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 03 构造方法-this关键字

    084 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 03 构造方法-this关键字 本文知识点:构造方法-this关键字 说明:因为时间紧 ...

随机推荐

  1. 【AtCoder】AGC030

    A - Poisonous Cookies 有毒还吃,有毒吧 #include <bits/stdc++.h> #define fi first #define se second #de ...

  2. 利用yum安装时,报错 [Errno 256] No more mirrors to try.

    问题: [root@gg ~]# yum install -y perl-DBD-MySQL  Loaded plugins: product-id, refresh-packagekit, secu ...

  3. scrollIntoView将指定元素定位到浏览器顶部,底部,中间

    var element = document.getElementById("box"); element.scrollIntoView();//顶部 element.scroll ...

  4. 【GO基础】main redeclared in this block问题的排查与解决

    之前的GO练习环境放在虚拟机内,方便了不少.不过在liteIDE打开的情况下,我迁移了虚拟机,刚好两台机子的VMware版本还不同,这就导致了无法恢复挂起状态,我放弃了挂起. 重新启动后,为了继续练习 ...

  5. 利用angular指令监听ng-repeat渲染完成后执行脚本

    业务中有时需要在异步获取数据并用ng-repeat遍历渲染完页面后执行某个操作,angular本身并没有提供监听ng-repeat渲染完成的指令,所以需要自己动手写.有经验的同学都应该知道,在ng-r ...

  6. Eclipse从SVN检出maven项目后的一些配置

    Eclipse从SVN检出maven项目后,会发现它只是一个普通的java project,如图: 这里我们需要把它转成maven-webapp,并调整相关属性,设置运行环境,关联相关jar目录等. ...

  7. HDU5320 : Fan Li

    考虑枚举左端点i,则随着右端点的右移,一共只有$O(\log n)$种不同的gcd取值.所以首先通过ST表+二分查找预处理出$O(n\log n)$个四元组(x,i,l,r),表示左端点为i,右端点取 ...

  8. 使用Xcode打包上传APP

    1.打开xcode,进入product->Scheme->EditScheme,找到Archive,最上面的设备选择IOSDevice,在BuildConfiguration中选中Rele ...

  9. 一些收集的MikroTik RouterOS破解版虚拟机VMware

    会不定期更新,也许后续自己来做,现在是收集.持续关注这个分享链接即可. 链接:https://pan.baidu.com/s/1j7ciesPm1yAgCJ26dLJ8sg  密码:i64w

  10. Cygwin、MinGw、mingw-w64,MSys msys2区别与联系

    https://www.biaodianfu.com/cygwin-ming-msys.html http://www.mingw-w64.org/doku.php http://blog.csdn. ...