///////////////////////////////////////
///////////////人工智能////////////////
///////////////////////////////////////
////////版权耿心旷所有/////////////////
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<io.h>
FILE *words;
char file_name[129];
char my_name[65]; //玩家给电脑起的名字
char my_word[513]; //临时储存的话
char user_word[513];
void init_access(void); //判断是否已经存在文件,否则重新打开
void process(void);
void chat_pattern(void);
void learn_new_pattern(void); //加入新的对话
void learn_old_pattern(void); //对原有的对话之间的关系进行强化联系
void get_my_name(void); //在文件中查找 my_name[] 保存在 my_name[]中
void change_my_name(char temp[]); //在文件中将 my_name[] 修改为 temp[]
int get_new_chat(void); //返回本次得到语句在文件中的位置 (可能新加入语句)
int get_old_chat(void); //返回本次得到语句在文件中的位置 (新加入语句)
int is_equal(char current[]); //在文件中查找是否有与current[]相同的,如果有返回0,否则返回相同的话的编号
int add_word(char temp[],int i); //增加一句话temp[],第i句话相对于该话概率加一 ,返回加的编号
void add_p(int i,int j); //将地i句话对于第j句话的概率加一
void get_word(int index); //得到编号为index的话,并保存在my_word[]中
int get_similar(char word[]); //返回文件中与word[]最相近的话的编号,应用相同子序列
int get_index(int index); //返回文件中编号index对应的另一句话的编号(其中有概率问题)
int get_lcs(char a[],char b[]); //返回相同子序列长度
int main()
{
init_access();
process();
return 0;
}
void init_access(void)
{
int choice=-1;
printf("\n输入 0 退出\n输入 1 添加思维语言包\n输入 2 修改我的名字\n输入 3 跳过\n\n请选择步骤:");
scanf("%d",&choice);
while( choice!=0 && choice!=1 && choice!=2 && choice!=3 )
{
printf("\n输入错误,请重新选择\n");
printf("\n输入 0 退出\n输入 1 添加思维语言包\n输入 2 修改我的名字\n输入 3 跳过\n\n请选择步骤:");
scanf("%d",&choice);
}
srand((unsigned)time(NULL));
strcpy(file_name,"init.in");
if(access(file_name,0)==-1)
{
words=fopen(file_name,"w");
fclose(words);
}
get_my_name();
switch (choice)
{
case 0:
exit(0);
case 1:
printf("\n请输入要添加的思维语言包名称(输入 0 跳过):");
scanf("%s",file_name);
if(strcmp(file_name,"0")==0)
{
break;
}
while( access(file_name,0)==-1 ) //文件不存在
{
printf("\n文件不存在,请重新输入(输入 0 跳过):");
scanf("%s",file_name);
if(strcmp(file_name,"0")==0)
{
break;
}
}
get_my_name();
break;
case 2:
printf("\n给我起一个名字吧(最长十个字哦):");
scanf("%s",my_name);
while( strlen(my_name)>20 )
{
printf("\n这个太长了,重新起一个名字吧:");
scanf("%s",my_name);
}
change_my_name(my_name);
break;
case 3:
break;
}
}
void process(void)
{
int choice=-1;
printf("\n输入 0 退出\n输入 1 人机聊天模式(学习语句越多越智能哦)\n输入 2 学习新语句模式(学习语句较少时推荐)\n输入 3 强化关联性模式(学习语句较多时推荐)\n\n请选择模式:");
scanf("%d",&choice);
while( choice!=0 && choice!=1 && choice!=2 && choice!=3 )
{
printf("\n输入错误,请重新选择\n");
printf("\n输入 0 退出\n输入 1 人机聊天模式(学习语句越多越智能哦)\n输入 2 学习新语句模式(学习语句较少时推荐)\n输入 3 强化关联性模式(学习语句较多时推荐)\n\n请选择模式:");
scanf("%d",&choice);
}
switch (choice)
{
case 0:
return;
case 1:
printf("\n您已选择人机聊天模式,输入 0 结束\n");
chat_pattern();
break;
case 2:
printf("\n您已选择学习新语句模式\n\n请连续输入对话,输入 0 结束\n");
learn_new_pattern();
break;
case 3:
printf("\n您已选择强化关联性模式\n\n请连续输入对话,输入 0 结束\n");
learn_old_pattern();
break;
}
process();
}
void get_my_name(void)
{
int index;
words=fopen(file_name,"r");
fseek(words,10,0);
fscanf(words,"%s",my_name);
fclose(words);
}
void change_my_name(char temp[])
{
words=fopen(file_name,"r+");
fseek(words,10,0);
fprintf(words,"%s",temp);
fclose(words);
}
void learn_new_pattern(void)
{
char temp[513];
int index;
printf("\n我应该这样说:");
scanf("%s",temp);
if(strcmp(temp,"0")==0) //输入0后结束
{
return;
}
index=is_equal(temp);
if(index==0)
{
index=add_word( temp , get_new_chat() );
}
else
{
add_p( index , get_new_chat() );
}
}
void learn_old_pattern(void)
{
char temp[513];
printf("\n我应该这样说:");
int index;
scanf("%s",temp);
if(strcmp(temp,"0")==0) //输入0后结束
{
return;
}
index=get_similar(temp);
add_p( index , get_old_chat() );
}
int get_new_chat(void)
{
char temp[513];
int index;
printf("\n我应该这样说:");
scanf("%s",temp);
if(strcmp(temp,"0")==0) //输入0后结束
{
return 1;
}
index=is_equal(temp);
if(index==0)
{
index=add_word( temp , get_new_chat() );
}
else
{
add_p( index , get_new_chat() );
}
return index;
}
int get_old_chat(void)
{
char temp[513];
int index;
printf("\n我应该这样说:");
scanf("%s",temp);
if(strcmp(temp,"0")==0) //输入0后结束
{
return 1;
}
index=get_similar(temp);
add_p( index , get_old_chat() );
return index;
}
int is_equal(char current[])
{
char temp[513];
int i;
words=fopen(file_name,"r");
while( !feof(words) )
{
fscanf(words,"%s",temp);
if(strcmp(temp,"file_w")==0)
{
fscanf(words,"%d %s",&i,temp);
if(strcmp(temp,current)==0)
{
fclose(words);
return i;
}
}
}
fclose(words);
return 0;
}
int add_word(char temp[],int i)
{
int temp_n;
words=fopen(file_name,"r+");
fseek(words,0,0);
fscanf(words,"%d",&temp_n);
fseek(words,0,0);
fprintf(words,"%d",++temp_n);
fclose(words);
words=fopen(file_name,"a");
fprintf(words,"\nfile_w %d %s 1 1 %d 1 ",temp_n,temp,i);
fclose(words);
return temp_n;
}
void chat_pattern(void)
{
int index;
printf("\n%s:你好啊!你一定有什么想对我说吧\n",my_name);
while(1)
{
if( 100*rand()/RAND_MAX < 30 )
{
index=1+10*rand()/RAND_MAX;
switch (index)
{
case 1:
printf("\n%s:真是越来越喜欢和你说话了呢\n",my_name);
break;
case 2:
printf("\n%s:啥时候有空让我学习学习新语句吧\n",my_name);
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
case 9:
break;
case 10:
break;
}
}
else
{
printf("\n我:");
scanf("%s",user_word);
if(strcmp(user_word,"0")==0)
{
return;
}
get_word(get_index(get_similar(user_word)));
printf("\n%s:%s\n",my_name,my_word);
}
}
}
void add_p(int i,int j)
{
char temp[513];
int p,sum,num,sum_j,is_show=0; //is_show,判断是否出现j
FILE *mid;
words=fopen(file_name,"r");
mid=fopen("mid","w+");
fscanf(words,"%d",&sum); //////////////////////
fprintf(mid,"%-10d",sum); //为以后新增sun与名字长度(<=10)准备
fseek(words,10,0);
fscanf(words,"%s",temp);
fprintf(mid,"%-25s",temp);
while( !feof(words) )
{
fscanf(words,"%s",temp);
if( strcmp(temp,"file_w")==0 )
{
fscanf(words,"%d",&num);
fprintf(mid,"\nfile_w %d ",num);
if( num==i )
{
fscanf(words,"%s %d %d",temp,&sum,&sum_j);
fprintf(mid,"%s %d %d ",temp,sum,++sum_j);
for(p=1;p<=sum;p++)
{
fscanf(words,"%d %d",&num,&sum_j);
if(num==j) is_show=1;
if(is_show)
fprintf(mid,"%d %d ",num,++sum_j);
else
fprintf(mid,"%d %d ",num,sum_j);
}
if(!is_show)
{
fprintf(mid,"%d %d ",j,++sum_j);
}
}
}
else
if(!feof(words