新手小白求助,面向对象聊天机器人

sinat_35368670 2016-06-20 02:30:19
界面
代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace robot
{
public partial class Form2 : Form
{
robot r1 = new robot();



public Form2()
{
r1.name = "小A";
r1.age = 8;

InitializeComponent();
}
public class robot
{

public string name
{
get;
set;
}
public int age
{
get;
set;
}
public string sayhello()
{
return string .Format ("你好!我叫{0}", name);


}
public string speak(string str)//对话方法
{
if (str.Contains("姓名") || str.Contains("名字") || str.Contains("叫什么"))
{
return string.Format ("嘻嘻,我叫{0}", name);
}
else if (str.Contains("年龄") || str.Contains("多大了") || str.Contains("多大岁数"))
{
return string.Format("今年{0}岁了", age);

}

else if (str.Contains("你好") || str.Contains("hello") || str.Contains("hi"))
{
return string.Format("你也好,哈哈");
}
else if (str.Contains("天气") || str.Contains("心情"))
{
return string.Format("天气好心情自然就好了阿,嘿嘿");

}
else if (str.Contains("笑话") || str.Contains("搞笑的"))
{
return string.Format("从前有个鬼,他放了个屁,然后死掉了,哈哈哈哈");
}
else
{
return string.Format("不好意思,你在说什么我听不懂欸!");
}
}

}

private void button2_Click(object sender, EventArgs e)
{
textBox2 .Text += textBox1.Text + "\n";
textBox1.Text = "";

}



private void textBox2_TextChanged(object sender, EventArgs e)
{
textBox2.Text = "";
textBox2 .Text = r1.sayhello();
string str = textBox1.Text;
while (true)
{
textBox2 .Text = r1.speak(str);
}
}

}
}





求大神指点一下,现在一发送就未响应
小白新手谢过
...全文
258 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
事件驱动的程序,最起码地,是”先发散、后集中“的编程模式。你把几个各司其职的事件联系起来,就组合成千变万化的可能的状态。没有一个事件是什么死循环的,每一个事件都只是一瞬间的事情。这就是基本的交互程序编程思路。(如果没有学习过交互程序编程,一定要多从这方面的流程设计去努力,不要只用那种简单的数学函数编程的思维方式来搞程序设计) 例如你响应 button2 点击事件时,一方面可以把 textbox1的内容附加到 text2 上面,同时清空 textbox1,但是接下来调用 r.speak(....) 的职责应该是这个事件的事,它负责把 r 说的话再贴到 textbox2 中。 对于 text2,它就算是能够响应用户从 textbox1 上最新录入的话(实际上因为它可能取到的只是上面那个事件已经清空之后的结果),那么它调用 r.speak(...) 也应该只是添加 r 的一句话的返回结果就结束此事件(否则,相同事件下一次什么时候触发?)。 而且 text2 也不应该清空自己。 而且 r.speak(...) 的这个输入值应该是取最新的输入,你的程序一点也没有这方面的概念。 总之,最首要地,是从根上学点的交互设计逻辑。你用一张纸、一支笔就应该能把交互程序设计清楚。你应该先发散地将每一个控件的职责分别设计清楚,然后再不断测试其组合起来(用户输入有着千变万化的可能性)是否逻辑正确。这就好像把一堆电容、电阻搭在一起成为一个简单的逻辑控制器一样。如果一开始就没有根,那就长不成树。
  • 打赏
  • 举报
回复
text2 号称“处理用户输入,它再响应用户时,它就是处理一个事件。而一个事件就是一瞬间就结束的事情,不是什么自始至终控制着整个程序的标题党。当你搞懂这个的时候,凭编程感觉,你就永远也不会在 text2_changed 中写 while 循环了。
  • 打赏
  • 举报
回复
交互式程序设计,每一个动作都应该“停止,把控制权交给windows”。 例如你想模拟一个人操作鼠标到你的“发送按钮”,然后再模拟按下按钮,这里假设你希望按钮在响应“鼠标移入”事件时还可以按照自然的顺序去触发它自己的任意定义的事件(例如“Dragover 事件),因此你首先需要模拟鼠标移动到按钮,然后使用定时器注册为10毫秒之后再来开始”按下鼠标左键“动作。只要你想让外界系统有交互,你的每一个动作就必须”先结束,然后重新开始“的。 你写一个死循环,这就是一些数学函数式的写法。windows系统就算是再多的资源、你的用户再是土豪、工作节奏再缓慢(以至于完全可以忍受卡得要死的程序),也用不起这样的低效率程序。 交互程序的设计流程是“异步、事件驱动”的,下一个动作是事件触发的,而不能按照一根筋的那种方式来设计程序。如果你画一个程序流程图,你的流程图中的“等待用户输入”怎么画? 如果你的老师告诉你在交互程序的画流程图中这样画流程,你能看出这种老师不配教你编程。因为这种程序只有最低级的console程序才是这样的,而图形操作系统为了提高系统性能则都是事件驱动的。
  • 打赏
  • 举报
回复
自制siri
q877455654 2016-06-20
  • 打赏
  • 举报
回复
同意一楼版主所说的
我叫小菜菜 2016-06-20
  • 打赏
  • 举报
回复
我大概知道楼猪想干嘛,但是逻辑有点问题,要注意是一问一答哦,不能问了就根本停不下来。
  • 打赏
  • 举报
回复
while (true) { textBox2 .Text = r1.speak(str); } 虽然不知道你是干嘛,但你这里在死循环

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧