黑马程序员——.NET笔记10 面向对象版聊天机器人

来源:互联网 发布:sql left join where 编辑:程序博客网 时间:2024/06/04 18:25

---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------


面向对象版聊天机器人练习

机器人有名字、FullLevel

可以SayHi、Eat(int foodCount)、Speak

异常处理:喂太多撑死

有两个机器人,一开始通过1、2数字选择

看视频讲解前写的代码:

using System;namespace ConsoleApplication1{     class Program        {        static void Main(string[] args)          {                       Android x1 = new Android();             Android x2 = new Android();             x1.Name = "小Q";            x2.Name = "小I";             Console.WriteLine("聊天机器人{0}和{1}诞生!\n输入1选择{0},输入2选择{1},然后你可以跟它对话了。",x1.Name,x2.Name);             string s = Console.ReadLine();            if (s=="1")             {                 while (true)                {                     x1.Speak();                 }            }                        else //输入2或其它字符            {                                while (true)                {                    x2.Speak();                }            }               }        }        class Android     {                private string name;        public string Name        {                get{ return name; }            set{ this.name = value; }        }                private int FullLevel=5;        public void SayHi()         {                       Console.WriteLine("你好,我叫{0}",Name);        }               public void Eat(int foodCount)         {                       if (FullLevel>100)             {                               Console.WriteLine("我吃饱了。");            }                       else                    {                                FullLevel=FullLevel+foodCount;            }                }                public void Speak()          {                        string str = Console.ReadLine();            if (FullLevel>0 && FullLevel<3)             {                               Console.WriteLine("我很饿,给点吃的吧。(喂食方式,输入:喂食)");            }                        else if (str!="喂食" && FullLevel<0)              {                        Console.WriteLine("饿死了,不说了。");                  return;                    }                        else if (str.Contains("名字")||str.Contains("叫什么"))             {                                this.SayHi();            }                        else if (str.Contains("女朋友"))              {                                Console.WriteLine("机器人不需要女朋友。");             }                        else if (str=="喂食")             {                                this.Eat(10);                  Console.WriteLine("体力正在恢复……");              }                       else               {                               Console.WriteLine("不懂你在说什么……");             }                       FullLevel--;              }       }}
听完讲解后修改部分:

类似于Python中,变量名 与 变量(值) 之间的对应关系是一种绑定 ,代码中用“=”对变量名进行赋值,实际上是变量名绑定到另一个变量,原变量并未改变

上面的理解有误,C#中存在值类型与引用类型,值类型会传递时会传递拷贝副本,引用类型传递引用

C#的值类型包括:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型。C#的引用类型包括:数组,用户定义的类、接口、委托,object,字符串。数组的元素,不管是引用类型还是值类型,都存储在托管堆上。引用类型在栈中存储一个引用,其实际的存储位置位于托管堆。为了方便,本文简称引用类型部署在托管推上。值类型总是分配在它声明的地方:作为字段时,跟随其所属的变量(实例)存储;作为局部变量时,存储在栈上。值类型在内存管理方面具有更好的效率,并且不支持多态,适合用作存储数据的载体;引用类型支持多态,适合用于定义应用程序的行为。


选择机器人的代码可简化:

            Android x;            if (s=="1")            {                x = x1;            }            else //输入2或其它字符            {                x = x2;            }            while (true)            {                x.Speak();            }

按讲解前想过到的思路可如下实现:

        static void Main(string[] args)        {            Android x1 = new Android();            Android x2 = new Android();            x1.Name = "小Q";            x2.Name = "小I";            Console.WriteLine("聊天机器人{0}和{1}诞生!\n输入1选择{0},输入2选择{1},然后你可以跟它对话了。",x1.Name,x2.Name);            string s = Console.ReadLine();            int c = 0;            Android[] x=new Android[2]{x1,x2};            if (s!="1")            {                c = 1;            }            while (true)            {                x[c].Speak();            }        }


漏了吃太多撑死的处理,在Eat()方法中增加一个else if(){}

            else if (FullLevel > 120)        {                Console.WriteLine("撑死了,不吃了。");                FullLevel = 120;        }

如果要在Speak()中“撑死”,即退出while循环或退出程序该怎么处理?不改动Main()的情况下。

.



---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net