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