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

---------------------- 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值