一:在源码管理器中打开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. 【LOJ】#2531. 「CQOI2018」破解 D-H 协议

    题解 BSGS直接解出a和b来即可 代码 #include <bits/stdc++.h> #define fi first #define se second #define pii p ...

  2. 【LOJ】#2115. 「HNOI2015」落忆枫音

    题解 如果不加这条边,那么答案是所有点入度的乘积 加上了这条边之后,我们转而统计不合法的方案数 就是相当于统计一条路径从y到x,新图所有点度的乘积除上这条路径所有点的点度乘积 初始化为\(f[y] = ...

  3. PocketMoney

    PocketMoney( Money.pas/cpp/c)Description学校为了表彰tsoi的优异成绩, m个领导每人都决定给tsoi的一些人发一些小红包.于是n个Tsoier排成一排,等待着 ...

  4. js中怎么为同级元素添加点击事件

    事件件是javascript脚本语言的重要组成部分,因为有事件才使用户页面的体验更加的美好.元素添加事件是js语言中最基础的.我们可以为元素本身添加事件,也可以通过事件绑定和事件监听为元素的父元素和子 ...

  5. 004.iSCSI客户端配置示例-Linux

    一 安装软件 [root@system2 ~]# yum -y install iscsi-initiator-utils 二 修改相关参数 [root@system2 ~]# vi /etc/isc ...

  6. 用pt-stalk定位MySQL短暂的性能问题

    背景] MySQL出现短暂的3-30秒的性能问题,一般的监控工具较难抓到现场,很难准确定位问题原因. 对于这类需求,我们日常的MySQL分析工具都有些不足的地方: 1. 性能监控工具,目前粒度是分钟级 ...

  7. BZOJ.1076.[SCOI2008]奖励关(概率DP 倒推)

    题目链接 BZOJ 洛谷 真的题意不明啊.. \(Description\) 你有k次选择的机会,每次将从n种物品中随机一件给你,你可以选择选或不选.选择它会获得这种物品的价值:选择一件物品前需要先选 ...

  8. HDU 5909 Tree Cutting 动态规划 快速沃尔什变换

    Tree Cutting 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5909 Description Byteasar has a tree T ...

  9. 使用 IntraWeb (20) - 基本控件之 TIWGrid

    TIWGrid 最终通过 Html Table 呈现; 其每个 Cell 都是一个 TIWGridCell 对象, Cell 对象的 Control 属性非常好, 可以非常方便地嵌入其他控件. TIW ...

  10. spring-boot 速成(4) 自定义配置

    spring-boot 提供了很多默认的配置项,但是开发过程中,总会有一些业务自己的配置项,下面示例了,如何添加一个自定义的配置: 一.写一个自定义配置的类 package com.example.c ...