功能介绍:
此demo是基于TCP套接字编程,目的是实现一个聊天室效果。类似于QQ群效果,如果上线可以通知其他好友,下线也会通知其他好友。
需要用的技术:
一、socket编程。
1& socket 网络编程常识:既要考虑客户端 又要考虑服务器端。
2&TCP 一对多开发步骤:
服务端:
①:创建socket,使用socket()
#include &sys/socket.h&
int socket(int family, int type, int protocol);
family: 指明协议族
& & & & & & & & & & & & & & & & & AF_INET: IPv4协议;
& & & & & & & & & & & & & & & & &AF_INET6: IPv6协议;
& & & & & & & & & & & & & & & & &AF_LOCAL: &Unix域协议;
& & & & & & & & & & & & & & & & &AF_ROUTE: 路由套接字;
& & & & & & & & & & & & & & & & &AF_KEY: 密钥套接字;
& & & & & & & & & & & &type:指明套接字类型
& & & & & & & & & & & & & & & & &SOCK_STREAM & 字节流套接字(TCP)
& & & & & & & & & & & & & & & & &SOCK_DGRAM & &数据报套接字(UDP)
& & & & & & & & & & & & & & & & &SOCK_SEQPACKET &有序分组套接字
& & & & & & & & & & & & & & & & &SOCK_RAW & & & &原始套接字
& & & & & & & & & & & protocol:设为某个协议类型常值 &一般设为 0;
② 准备通信地址,sockaddr_in:& & & &&
struct sockaddr{
sa_family_t
sa_data[];
struct in_addr{
struct sockaddr_in{
sa_family_t
//协议族 要和socket中的family相同
//网络端口
struct in_addr
//网络地址
& & & & & & & & & & & & &需要注意的是在对sockaddr_in 赋值的时候需要用到两个函数:
#include &arpa/inet.h&
uint16_t htons(uint16_t hostint16);
//转换成网络字节序表示的16位整型数
in_addr_t inet_addr(const char *cp);
//把字符串转换成32位二进制网络字节序的IPV4地址
③:绑定 套接字描述符 和 通信地址 使用函数 bind();
#include &sys/socket.h&
int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
& & & & & & & & & & & 需要注意的是为使不同格式地址能够被传入到套接字函数,地址被强制转换成通用的地址结构 sockadd表示。
④:***客户端, 使用函数 listen();
#include &sys/socket.h&
int listen(int sockfd, int backlog);
⑤:等待客户端的连接,使用函数 accept(). 此函数在客户端连接上来后,将返回一个新的socket描述符,这个心得描述符用于和客户端的交互。
#include &sys/socket.h&
int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);
&使用此函数需要注意的是,如果想从客户端那里得到一些信息需要重新声明一个 struct socketaddr_in 类型的参数,然后传给此函数的第二个和第三个参数即可。
⑥:把accept 返回的socket描述符当做文件描述符来操作即可;
#include &unistd.h&
ssize_t read(int filedes, void *buf, size_t nbytes);
ssize_t write(int filedes, const void *buf, size_t nbytes);
ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags);
ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags);
&recv 的返回值: &0表示接受到消息的字节数; =0表示对方已经断开连接; &0 表示出错;
⑦:关闭描述符;
客户端:
①:创建socket,使用socket()
②: 准备通信地址,sockaddr_in:& & &
③:建立连接 使用函数 connect()
#include &sys/socket.h&
int connect(int sockfd, const struct sockaddr *addr, socklen_t len);
④:把socketfd当做文件描述符来使用即可,就像服务端的第六步。
二、多线程技术;
编程思想:
一、首先需要两个执行程序,一个模拟客户端,一个模拟服务端
二、客户端首先使用socket connect 等函数连接上服务器,然后创建多线程用来接收服务器发来的消息,主线程用来发送消息到服务器。
三、服务器端:
①:首先创建一个全局变量数组用来保存客户端连接上来的信息,因为不止一个客户端连接上。
②:创建 socket 套接字,然后***客户端发来的消息,当有客户端连接上来的时候创建多线程为此客户端服务。
& & & & & & & & & 需要注意的是对全局变量&&保存所有客户端套接字的数组。当客户端断开连接的时候需要清理数组中的信息。
client.c:
1 #include &stdio.h&
2 #include &pthread.h&
3 #include &sys/socket.h&
4 #include &netinet/in.h&
5 #include &arpa/inet.h&
6 #include &stdlib.h&
7 #include &unistd.h&
8 #include &string.h&
9 #include &signal.h&
10 //准备工作
12 char* IP = "127.0.0.1";//本机IP,回送地址
13 short PORT = 10222;
14 typedef struct sockaddr SA;//类型转换
15 char name[20];//客户端昵称
16 //启动客户端,连接服务器
17 void init(){
printf("聊天室客户端开始启动\n");
sockfd = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = inet_addr(IP);
if(connect(sockfd,(SA*)&addr,sizeof(addr))==-1){
perror("无法连接到服务器");
printf("客户端启动失败\n");
printf("客户端启动成功\n");
31 //开始通信
32 void* recv_thread(void* p){//收消息
char buf[100] = {0};
if(recv(sockfd,buf,sizeof(buf),0)&=0){
printf("%s\n",buf);
41 void start(){
//发送消息
//发消息之前,启动一个线程,用来接受服务器发送过来的消息
pthread_create(&pid,0,recv_thread,0);
char buf[100] = {0};
scanf("%s",buf);//接受用户输入
char msg[100] = {0};
sprintf(msg,"%s 说:%s",name,buf);
send(sockfd,msg,strlen(msg),0);//发给服务器
54 void sig_close(){
//关闭客户端的描述符
close(sockfd);
59 int main(){
signal(SIGINT,sig_close);//关闭CTRL+C
printf("请输入您的昵称:");
scanf("%s",name);
init();//连接服务器
send(sockfd,name,strlen(name),0);//将昵称发给服务器
start();//开始通信
1 #include &stdio.h&
2 #include &pthread.h&
3 #include &sys/socket.h&
4 #include &netinet/in.h&
5 #include &arpa/inet.h&
6 #include &stdlib.h&
7 #include &unistd.h&
8 #include &string.h&
9 #include &signal.h&
10 //准备工作
12 char* IP = "127.0.0.1";//本机IP,回送地址
13 short PORT = 10222;
14 typedef struct sockaddr SA;//类型转换
15 struct client{//
char name[20];//存储客户昵称
int//客户端socket描述符
19 struct client c[100] = {0};//最多记录100个链接到服务器的客户端
20 int size = 0;//记录客户端的个数,数组的索引
21 //初始化服务器的网络,创建socket
22 void init(){
printf("聊天室服务器开始启动..\n");
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd == -1){
perror("创建socket失败");
printf("服务器启动失败\n");
//准备网络通信地址
struct sockaddr_
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = inet_addr(IP);
if(bind(sockfd,(SA*)&addr,sizeof(addr))==-1){
perror("绑定失败");
printf("服务器启动失败\n");
printf("成功绑定\n");
//设置***
if(listen(sockfd,10)==-1){
perror("设置***失败");
printf("服务器启动失败\n");
printf("设置***成功\n");
printf("初始化服务器成功\n");
//等待客户端链接,放到另一个函数中
51 //线程函数,用来接受客户端的消息,并把消息发给所有客户端
52 //分发消息函数
53 void sendMsgToAll(char* msg){
int i = 0;
for(;i&i++){
printf("sendto%d\n",c[i].fds);
send(c[i].fds,msg,strlen(msg),0);
60 void* service_thread(void* p){
int fd = *(int*)p;//拿到标记客户端的sockfd
printf("pthread=%d\n",fd);//输出测试
//记录客户端的sockfd
c[size].fds =
char name[20] = {0};
if(recv(fd,name,sizeof(name),0)&0){
strcpy(c[size].name,name);//拿到昵称
char tishi[100] = {0};
//群发通知消息
sprintf(tishi,"热烈欢迎 %s 登录聊天室..",name);
//发给所有人
sendMsgToAll(tishi);
char buf[100] = {0};
if(recv(fd,buf,sizeof(buf),0)==0){
//返回0,表示TCP另一端断开链接
//有客户端退出
printf("fd=%dquit\n",fd);//测试
char name[20] = {0};
for(i=0;i&i++){
if(c[i].fds == fd){
strcpy(name,c[i].name);
c[i].fds = c[size-1].
strcpy(c[i].name,c[size-1].name);//用最后一个有效的数组元素,覆盖当前没用的这个保存退出的客户端的信息的数组元素
printf("quit-&fd=%dquit\n",fd);
char msg[100] = {0};
sprintf(msg,"欢送 %s 离开聊天室,再见!",name);
//群发退出通知
sendMsgToAll(msg);
close(fd);
return;//客户端退出了,结束服务线程
sendMsgToAll(buf);//接受成功,广播聊天信息
102 //等待客户端的连接,启动服务器的服务
103 void service(){
printf("服务器开始服务\n");
struct sockaddr_
socklen_t len = sizeof(fromaddr);
int fd = accept(sockfd,(SA*)&fromaddr,&len);
if(fd == -1){
printf("客户端链接出错\n");
continue;//继续循环,处理连接
//如果客户端成功连接上
printf("fd=%d\n",fd);//测试
//启动线程
pthread_create(&pid,0,service_thread,&fd);
120 void sig_close(){
121 //关闭服务器的socket
close(sockfd);
printf("服务器已经关闭\n");
126 int main(){
signal(SIGINT,sig_close);//退出CTRL+C
service();
以上的代码是老师写的,老师用的是数组来保存所有的客户端的信息。但是自己在做这个程序的时候想法有点偏差,我用的是动态分配的链表技术来保存连接上来得客户端的socket 套接字,动态分配,动态删除。代码如下:
client.c:
1 #include &stdio.h&
2 #include &sys/socket.h&
3 #include &netinet/in.h&
4 #include &unistd.h&
5 #include &arpa/inet.h&
6 #include &stdlib.h&
7 #include &string.h&
9 struct info{
char name[10];
char buf[100];
14 //利用多线程接收发来的信息,可以在任何时候接收信息,包括发信息的时候
15 void* getmssage(void* p){
int* sockfd = (int*)p;
struct info from;
while(recv(*sockfd,&from,sizeof(from),0) & 0){
printf("%s说:%s\n",from.name,from.buf);
memset(from.name,0,sizeof(from.name));
memset(from.buf,0,sizeof(from.buf));
25 int main(){
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd == -1) perror("socket"),exit(-1);
struct sockaddr_
addr.sin_family = AF_INET;
addr.sin_port = htons(2222);
addr.sin_addr.s_addr = inet_addr("172.30.13.70");
int res = connect(sockfd,(struct sockaddr*)&addr,sizeof(addr));
if(res == -1) perror("connect"),exit(-1);
struct info in;
printf("请输入用户名:");
scanf("%s",in.name);
getchar(); //此时必须要用getchar 因为第 43 行用的是gets接收数据, 38行的scanf函数接收数据的时候碰到 \n就结束了,下面的gets 就会把缓存区的 \n 给接收到, 如果下面用 scanf 接收数据的话,此时就不需要用 getchar了, 因为 scanf 在第一个字符碰到 \n的时候会直接把 \n 给忽略掉
pthread_create(pid,0,getmssage,(void*)&sockfd);
//scanf("%s",in.buf);
gets(in.buf);
if(!strcmp(in.buf,"bye")){
strcpy(in.buf,"退出登陆");
send(sockfd,&in,sizeof(in),0);
if(send(sockfd,&in,sizeof(in),0) == -1) perror("send"),exit(-1);
memset(in.buf,0,strlen(in.buf));
server.c:
1 #include &stdio.h&
2 #include &stdlib.h&
3 #include &sys/socket.h&
4 #include &netinet/in.h&
5 #include &arpa/inet.h&
6 #include &string.h&
7 #include &sys/types.h&
9 int accfd[10];
10 static int i = 0;
11 int pthid[10];
13 struct info{
struct info*
20 struct clinfo{
char name[10];
char buf[100];
25 static int i = 0;
26 struct info*
28 void* del(int n){
struct info *p;
struct info *t;
p = head-&
printf("del n:%d\n",n);
if(p-&num == n){
t-&next = p-&
printf("after free\n");
t = head-&
printf("t-&num:%d\n",t-&num);
53 void* message(void* p){
printf("this is message\n");
int num = (int)p;
struct info* t =
if(t-&num == num){
accfd = t-&
pthid = t-&
memset(cin.buf,0,sizeof(cin.buf));
memset(cin.name,0,sizeof(cin.name));
while(recv(accfd,&cin,sizeof(cin),0) & 0){
printf("%s say: %s\n",cin.name,cin.buf);
t = head-&
printf("t-&num:%d,num:%d\n",t-&num,num);
if(t-&num != num){
send(t-&accfd,&cin,sizeof(cin),0);
if(!strcmp(cin.buf,"退出登陆")){
printf("即将退出线程\n");
close(accfd);
pthread_exit(0);
memset(cin.buf,0,sizeof(cin.buf));
memset(cin.name,0,sizeof(cin.name));
98 struct info* init(){
struct info* in;
in = (struct info*)malloc(sizeof(struct info));
in-&next = NULL;
return in;
105 int main(){
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd == -1) perror("socket"),exit(-1);
struct sockaddr_
addr.sin_family = AF_INET;
addr.sin_port = htons(2222);
addr.sin_addr.s_addr = inet_addr("172.30.13.70");
//解决地址被占用问题
int reuse = 10;
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse));
int res = bind(sockfd,(struct sockaddr*)&addr,sizeof(addr));
if(res == -1) perror("bind"),exit(-1);
listen(sockfd,100);
struct sockaddr_in from;
socklen_t len = sizeof(from);
head = init();
//得到新的描述符
int accfd = accept(sockfd,(struct sockaddr*)&from,&len);
struct info* p =
struct info* tmp = init();
//让指针指向链表的尾部
while(p-&next){
tmp-&num = i++;
tmp-&accfd =
printf("%s连接上来\n",inet_ntoa(from.sin_addr));
//创建线程
pthread_create(&(tmp-&pthid),0,message,(void*)(i-1));
阅读(...) 评论()关于vista玩cs1.6有办法用CSMATE或CSAY吗? 有没有其他中文输入支持VISTA的??_百度知道& 反恐精英 CS1.6完美中文硬盘版
反恐精英 CS1.6完美中文硬盘版
《反恐精英》是反恐精英正式版系列作品第一部,是正统作品第二部,于2001年发行。是一个总服务器数量达到11万5000,每月游戏时间达到5万分钟的游戏系列,也是2006年以前世界上玩家最多的射
游戏版本:
制作机构:ValveSoftware
整理时间:
软件大小:159MB
游戏语言:简体中文
反恐精英1.6 游戏截图 (1/7)
游戏名称:反恐精英CS1.6
英文名称:Counter-Strike
游戏类型:第一人称射击类
游戏发行:SierraEntertainment
游戏开发:ValveSoftware
游戏平台:PC
发行时间:日
版本说明:游戏基于Ver.3213版制作,解压即可玩。
【运行说明】
1、解压压缩包
2、运行cstrike.exe进入游戏
注:key全是3
【游戏简介】
第一次进入游戏后,想象着眼前立刻将出现一幅激烈的战斗场景。但事实正相反,出现在玩家眼前的是一个购物模 式:每个新进入的玩家都将获得一定数量的金钱,你可以使用这些金钱去购买自己最称手的武器。
当然了,你所能购买的武器种类将受到你所选择的一方的限制,就比如说***是不可能扛着&臭名昭著&的AK-47 冲锋***上街值勤的。如果你手头宽裕的话,你还可以购买一些诸如头盔、防弹衣之类的防具(套在恐怖分子头上的黑***当然是免费赠送的,如果你选择加入恐怖分 子行列的话)。
在最新的CS 1.6版中,玩家可以见到多个游戏方式各不相同的任务场景。游戏中有反炸弹,拯救人质,逃脱,保护重要人物4种模式
No-Steam Counter-Strike1.6 Ver.3213版本特性:
&本程序所有游戏所需文件均由官方正版游戏文件的GCF格式中提取
&内涵官方ZBOT机器人
&完美解决目前国内各个版本CS1.6 加入ZBOT模式之后,游戏将变为CZ与ZBOT控制面版丢失错误的问题!
&拥有CZ ZBOT极其特性与CS1.6特性!
&简介使用的游戏&H&键功能!
&支持中英繁三种语言,并内涵中英繁三种语言转换文件
&修复官方在游戏汉化方面的一些错误!例:地图信息说明
&优化了游戏文件,使得游戏运行的更加稳定流畅,CPU负荷率更小。
&完全官方BOT语音,英文原版语音[中文语音&
&更为专业化、实用性的键盘设置!
&加入Bot中英文转换器、CS1.6语言转换器、HLTV服务器开启器、CS1.6游戏模式转换器等强大的BAT自中转换文件,更为人性化设置!
&与CS流行反***器Cd-Client完全兼容
&内嵌VALVE专业反***器VAC2!
&内附PCgames CS1.6 附加资源包,包含中文Server管理插件,最新参数的cfg优化脚本!
【配置要求】
最低配置:
CPU:500mhz,
内存:96mbram,
显卡:16mbvideocard,
操作系统:Windows2000/XP/ME/SE,
外设及环境:鼠标,键盘,耳麦,互联网
推荐配置:
CPU:800mhz,或更高
内存:128mbram,或更高
显卡:32mb+videocard,或更高
操作系统:Windows2000/XP或更高
外设及环境:鼠标,键盘,耳麦,互联网
[][][][][][]
[][][][][][]
[][][][][][]
CopyRight (C) 3DMGAME- ,All Rights Reserved
服务***:(010-)
此下载由3DM游戏网提供
请选择游戏版本:
本站发布资源为互联网转载,非本站自制,仅供网友做交流学习之用!
请下载完毕后于24小时内删除,切勿用于商业用途,由此引发的法律纠纷及连带的责任本站和发布者概不承担共有 7735 人关注过本帖
标题:来,你也可以用 C 语言写一个聊天机器人
等 级:论坛游侠
帖 子:64
专家分:157
&&问题点数:0&&回复次数:12&&&
来,你也可以用 C 语言写一个聊天机器人
你是不是一直在面对着枯燥的 C 语言特性、摸索着前人写过的各种算法,不是因为自己的兴趣,而是依靠自身的毅力,学得很苦吧。
好吧,我们找一个好玩一点的东西,一起来写个聊天机器人吧。我知道只是个简单的例子,看完也不一定真有人去写一个聊天机器人,但如果你真想去写的话,这里的内容,可以帮助你实现你的目标。
噢,可以直接去看原文:
/articles/36106/chatbot-tutorial
聊天机器人就是让你能够对他做出动作(姿势或语言),然后他会根据你的行为对你做出反应的程序。当你为它输入自然语言中的一些问题的话,他也可以给你一些看起来有意义的同一语言的回答。
下面是一个非常基本的聊天机器人的代码,很简单的几行:
// Program Name: chatterbot1
// Description: this is a very basic example of a chatterbot program
// 描述:这是一个聊天机器人程序一个非常基本的例子
// Author: Gonzales Cenelia
#include &iostream&
#include &string&
#include &ctime&
int main()
&&& std::string Response[] = {
&&&&&&&&&我听到了!&,
&&&&&&&&&你是在和我说话。&,
&&&&&&&&&继续说,我在听。&,
&&&&&&&&&哈哈,真是非常有趣的谈话。&,
&&&&&&&&&后来呢?&
&&& srand((unsigned) time(NULL));
&&& std::string sInput = &&;
&&& std::string sResponse = &&;
&&& while(1) {
&&&&&&&&std::cout && &&&;
&&&&&&&&std::getline(std::cin, sInput);
&&&&&&&&int nSelection = rand() % 5;
&&&&&&&&sResponse = Response[nSelection];
&&&&&&&&std::cout && sResponse && std::
&&& return 0;
很简单吧?但要做到适当的响应,它可能是很难写的一个程序。1951,图灵提出了一个测试,现在被称为图灵测试。在这项测试中,测试的双方,一方是计算机程序,另一方是一个真正的人类,法官用来判断谁是真正的人。
聊天机器人一般被认为属于弱人工智能领域,但这并不意味着聊天机器人就没有潜力。由于它相当的简单,正好方便大多数爱好者去尝试实现更智能的聊天机器人,所以说,它会是是一个伟大开始的地方。
现在,让我们回到我们以前的程序,前面那个代码存在哪些问题?
嗯,是的。我们可以清楚地看到,这个程序是不是真的想理解用户所说的,相反,他只是随机选择一个已经存在的句子,响应每次用户在键盘上的输入。我们还注意到,程序经常重复自己。这其中的一个原因是由于内含的句子数据库非常小(只有5句),另一个原因是我们还没有实现任何机制来控制这个不太受欢迎的行为。
那,我们该如何改进它?很简单,我们需要引入关键词匹配。
关键词只是一个句子(不一定是完整的)或一个字,程序可以从用户的输入里识别出来,然后让自己的回答对应它。让我们继续改进刚才那个聊天机器人,现在我们称其为 chatterbot2。
// Program Name: chatterbot2
// Description: this is an improved version
// of the previous chatterbot program &chatterbot1&
// this one will try a little bit more to understand what the user is trying to say
// 描述:这是一个改进版,相比于前面的聊天机器人程序,这次将尝试一点点更多地理解用户说什么
// Author: Gonzales Cenelia
#pragma warning(disable: 4786)
#include &iostream&
#include &string&
#include &vector&
#include &ctime&
const int MAX_RESP = 3;
typedef std::vector&std::string&
vstring find_match(std::string input);
void copy(char *array[], vstring &v);
typedef struct {
&&& char *
&&& char *responses[MAX_RESP];
record KnowledgeBase[] = {
&&& {&WHAT IS YOUR NAME&,
&&& {&嗯,我的名字叫瞎聊。&,
&&&&&&你可以叫我公主...,是啊,我是大***啊。&,
&&&&&&为什么你想知道我的名字?下一步是要交换QQ号吗?&}
&&& {&HI&,
&&& {&哈哈,好啊!&,
&&&&&&你是谁?&,
&&&&&&噢,你好!&}
&&& {&HOW ARE YOU&,
&&& {&我干得不坏!&,
&&& &你干得怎么样?&,
&&& &为什么你会想知道我是怎么做到的?&}
&&& {&WHO ARE YOU&,
&&& {&我尼玛就是个程序啊。&,
&&&&&&表说,我知道你知道我是谁。&,
&&&&&&为什么还问?&}
&&& {&ARE YOU INTELLIGENT&,
&&& {&是的,当然是的。&,
&&&&&&你是怎么想的?&,
&&&&&&哈哈,事实上我确实很聪明。&}
&&& {&ARE YOU REAL&,
&&& {&这对你真的是个问题吗?&,
&&&&&&啥意思啊?你?&,
&&&&&&我尽量让我看起来像个真正的人类。&}
size_t nKnowledgeBaseSize = sizeof(KnowledgeBase)/sizeof(KnowledgeBase[0]);
int main() {
&&& srand((unsigned) time(NULL));
&&& std::string sInput = &&;
&&& std::string sResponse = &&;
&&& while(1) {
&&&&&&&&std::cout && &&&;
&&&&&&&&std::getline(std::cin, sInput);
&&&&&&&&vstring responses = find_match(sInput);
&&&&&&&&if(sInput == &BYE&) {
&&&&&&&&&&&&std::cout && &和你聊天太愉快了,下次再来!& && std::&&
&&&&&&&&&&&&
&&&&&&&&else if(responses.size() == 0)&&{
&&&&&&&&&&&&std::cout && &我,我,我不确定我是否能理解你说的是什么 ...& && std::
&&&&&&&&else {
&&&&&&&&&&&&int nSelection = rand()&&% MAX_RESP;
&&&&&&&&&&&&sResponse =&&&responses[nSelection]; std::cout && sResponse && std::
&&& return 0;
// make a&&search for the&&user's input
// inside the database of the program
vstring find_match(std::string&&input) {
&&& for(int i = 0; i & nKnowledgeBaseS&&++i) {&&
&&&&&&&&if(std::string(KnowledgeBase[i].input) == input) {
&&&&&&&&&&&©(KnowledgeBase[i].responses, result);
&&&&&&&&&&&&
void copy(char&&*array[], vstring &v) {
&&& for(int i = 0;&&i & MAX_RESP; ++i) {
&&&&&&&&v.push_back(array[i]);
现在,程序有了点进步了,它可以尽可能地选择一些接近的句子来做出反应。你可以尝试输入:
WHAT IS YOUR NAME, HOW ARE YOU, ARE YOU INTELLIGENT ... 等语句来测试。
搜索更多相关主题的帖子:
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
吐槽:你这明显是C++
来 自:宜昌
等 级:职业侠客
帖 子:215
专家分:338
你醒了?快起来敲代码!!
等 级:论坛游侠
帖 子:56
专家分:164
自己写过程序解闷还是可以的,宅男们
来 自:重庆邮电大学
等 级:论坛游民
帖 子:173
专家分:30
显然这是c plus plus
C语言好难啊~
等 级:论坛游侠
帖 子:64
专家分:157
&&各位大神,好专业啊,真是惭愧死我了。 得改,一定要改改,C 版绝不用带尾巴的代码。
允许我用代码框简单改写成 C 代码,当然,我努力要写得看起来比 C++ 更加简单,最起码也不能比原始 C++ 更复杂,C 是优秀语言嘛&&
全部代码包括了上面的二个例子代码:
程序代码:
#include &stdlib.h&
#include &stdio.h&
#include &time.h&
#include &string.h&
&&& 描述:这是一个聊天机器人程序一个非常基本的例子 chatterbot1
void chatterbot1()
&&& char* Response[] = {
&&&&&&&&&我听到了!&,
&&&&&&&&&你是在和我说话。&,
&&&&&&&&&继续说,我在听。&,
&&&&&&&&&哈哈,真是非常有趣的谈话。&,
&&&&&&&&&后来呢?&&&&
&&& srand((unsigned) time(NULL));
&&& char sInput[
&&& char* sResponse = NULL;
&&& while(
&&&&&&&&printf(&&&);
&&&&&&&&scanf(&
&&&&&&&&fflush(stdin);
&&&&&&&&if(sInput[
&&&&&&&&&&&&printf(&和你聊天真的很愉快, 下次再见。\n&);
&&&&&&&&&&&&_sleep(
&&&&&&&&&&&&break;
&&&&&&&&int nSelection = rand() %
&&&&&&&&sResponse = Response[nSelection];
&&&&&&&&printf(&%s\n&, sResponse);
&&& 描述:这是一个改进版聊天机器人程序 chatterbot2
const int MAX_RESP =
typedef struct {
&&& char *
&&& char *responses[MAX_RESP];
record KnowledgeBase[] = {
&&& {&WHAT IS YOUR NAME&,
&&& {&嗯,我的名字叫瞎聊。&,
&&&&&&你可以叫我公主...,是啊,我是大***啊。&,
&&&&&&为什么你想知道我的名字?下一步是要交换QQ号吗?&}
&&& {&HI&,
&&& {&哈哈,好啊!&,
&&&&&&你是谁?&,
&&&&&&噢,你好!&}
&&& {&HOW ARE YOU&,
&&& {&我干得不坏!&,
&&& &你干得怎么样?&,
&&& &为什么你会想知道我是怎么做到的?&}
&&& {&WHO ARE YOU&,
&&& {&我尼玛就是个程序啊。&,
&&&&&&表说,我知道你知道我是谁。&,
&&&&&&为什么还问?&}
&&& {&ARE YOU INTELLIGENT&,
&&& {&是的,当然是的。&,
&&&&&&你是怎么想的?&,
&&&&&&哈哈,事实上我确实很聪明。&}
&&& {&ARE YOU REAL&,
&&& {&这对你真的是个问题吗?&,
&&&&&&啥意思啊?你?&,
&&&&&&我尽量让我看起来像个真正的人类。&}
size_t nKnowledgeBaseSize = sizeof(KnowledgeBase)/sizeof(KnowledgeBase[
record* find_match(char*&&input) {
&&& for(int i =
&&&&&&&&if( !stricmp( KnowledgeBase[i].input, input ) )
&&&&&&&&&&&&return &KnowledgeBase[i];
&&& return NULL;
void chatterbot2()
&&& srand((unsigned) time(NULL));
&&& char sInput[
&&& char* sResponse = NULL;
&&& while(
&&&&&&&&printf(&&&);
&&&&&&&&scanf(&
&&&&&&&&fflush(stdin);
&&&&&&&&record* responses = find_match(sInput);
&&&&&&&&if(sInput == &BYE&) {
&&&&&&&&&&&&printf(&和你聊天太愉快了,下次再来!\n&);
&&&&&&&&&&&&_sleep(
&&&&&&&&&&&&break;
&&&&&&&&else if( !responses )&&{
&&&&&&&&&&&&printf(&我,我,我不确定我是否能理解你说的是什么 ...\n&);
&&&&&&&&else {
&&&&&&&&&&&&int nSelection = rand()&&% MAX_RESP;
&&&&&&&&&&&&sResponse = responses-&responses[nSelection];
&&&&&&&&&&&&printf(&%s\n&, sResponse);
// 太久不写代码了,我不确信 main 是否是这样声明的...
int main()
&&& chatterbot1();
&&& chatterbot2();
&&& return
等 级:新手上路
楼上改的很好
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:731
专家分:1546
怎么样能嵌入到QQ群,QQ的聊天界面中去呢?
我恰巧最近在做这么个功能的东西
学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Black Cat&&&&&&Hello Tomorrow~
等 级:友情版主
威 望:203
帖 子:14897
专家分:62564
以下是引用AleTiff在 13:15:36的发言:
&&各位大神,好专业啊,真是惭愧死我了。 得改,一定要改改,C 版绝不用带尾巴的代码。
允许我用代码框简单改写成 C 代码,当然,我努力要写得看起来比 C++ 更加简单,最起码也不能比原始 C++ 更复杂,C 是优秀语言嘛&&
全部代码包括了上面的二个例子代码:
#include&&
#include&&
#include&&
#include&&
&&& 描述:这是一个聊天机器人程序一个非常基本的例子 chatterbot1
void chatterbot1()
&&& char* Response[] = {
&&&&&&&&&我听到了!&,
&&&&&&&&&你是在和我说话。&,
&&&&&&&&&继续说,我在听。&,
&&&&&&&&&哈哈,真是非常有趣的谈话。&,
&&&&&&&&&后来呢?&&&&&&
&&& srand((unsigned) time(NULL));
&&& char sInput[5] = {0};
&&& char* sResponse = NULL;
&&& while(1) {
&&&&&&&&printf(&&&);
&&&&&&&&scanf(&%4s&, &sInput);
&&&&&&&&fflush(stdin);
&&&&&&&&if(sInput[0] == 0x71 || sInput[0] == 0x51 ){
&&&&&&&&&&&&printf(&和你聊天真的很愉快, 下次再见。\n&);
&&&&&&&&&&&&_sleep(1000);
&&&&&&&&&&&&
&&&&&&&&int nSelection = rand() % 5;
&&&&&&&&sResponse = Response[nSelection];
&&&&&&&&printf(&%s\n&, sResponse);
&&& 描述:这是一个改进版聊天机器人程序 chatterbot2
const int MAX_RESP = 3;
typedef struct {
&&& char *
&&& char *responses[MAX_RESP];
record KnowledgeBase[] = {
&&& {&WHAT IS YOUR NAME&,&&
&&& {&嗯,我的名字叫瞎聊。&,
&&&&&&你可以叫我公主...,是啊,我是大***啊。&,
&&&&&&为什么你想知道我的名字?下一步是要交换QQ号吗?&}
&&& {&HI&,&&
&&& {&哈哈,好啊!&,
&&&&&&你是谁?&,
&&&&&&噢,你好!&}
&&& {&HOW ARE YOU&,
&&& {&我干得不坏!&,
&&& &你干得怎么样?&,
&&& &为什么你会想知道我是怎么做到的?&}
&&& {&WHO ARE YOU&,
&&& {&我尼玛就是个程序啊。&,
&&&&&&表说,我知道你知道我是谁。&,
&&&&&&为什么还问?&}
&&& {&ARE YOU INTELLIGENT&,
&&& {&是的,当然是的。&,
&&&&&&你是怎么想的?&,
&&&&&&哈哈,事实上我确实很聪明。&}
&&& {&ARE YOU REAL&,
&&& {&这对你真的是个问题吗?&,
&&&&&&啥意思啊?你?&,
&&&&&&我尽量让我看起来像个真正的人类。&}
size_t nKnowledgeBaseSize = sizeof(KnowledgeBase)/sizeof(KnowledgeBase[0]);
record* find_match(char*&&input) {&&
&&& for(int i = 0; i & nKnowledgeBaseS&&++i) {
&&&&&&&&if( !stricmp( KnowledgeBase.input, input ) )
&&&&&&&&&&&&return &KnowledgeB
&&& return NULL;&&
void chatterbot2()
&&& srand((unsigned) time(NULL));
&&& char sInput[20] = {0};
&&& char* sResponse = NULL;
&&& while(1) {
&&&&&&&&printf(&&&);
&&&&&&&&scanf(&%19[^\n]&, &sInput);
&&&&&&&&fflush(stdin);
&&&&&&&&record* responses = find_match(sInput);
&&&&&&&&if(sInput == &BYE&) {
&&&&&&&&&&&&printf(&和你聊天太愉快了,下次再来!\n&);
&&&&&&&&&&&&_sleep(1000);
&&&&&&&&&&&&
&&&&&&&&}&&
&&&&&&&&else if( !responses )&&{
&&&&&&&&&&&&printf(&我,我,我不确定我是否能理解你说的是什么 ...\n&);
&&&&&&&&else {
&&&&&&&&&&&&int nSelection = rand()&&% MAX_RESP;
&&&&&&&&&&&&sResponse = responses-&responses[nSelection];
&&&&&&&&&&&&printf(&%s\n&, sResponse);&&
&&&&&&&&}&&
// 太久不写代码了,我不确信 main 是否是这样声明的...
int main()
&&& chatterbot1();
&&& chatterbot2();
&&& return 0;
} 来学习的 谢谢
等 级:新手上路
回复 楼主 AleTiff
LZ我想学习,目前C语言是最有效(编程简单,实现效果比较多)的编写机器人聊天软件的工具吗?&&好像还有易语言也可以编写,那个效果如何?
版权所有,并保留所有权利。
Powered by , Processed in 0.049826 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved