精华内容
下载资源
问答
  • 二叉树实现猜动物小游戏

    千次阅读 2019-03-23 21:13:02
    描述:自己脑海里想动物,然后根据计算机的提示输入yes/no,让计算机它你脑海动物,如果它不对就将自己的动物输入到计算机,让它记住能保证下次它能出来。 源文件main.cpp #include<iostream...

    该游戏玩法如下:

    描述:自己脑海里想一只动物,然后根据计算机的提示输入yes/no,让计算机它猜你脑海中的动物,如果它猜不对就将自己的动物输入到计算机,让它记住能保证下次它能猜出来。

    源文件main.cpp

    #include<iostream>
    #include<cstdlib>
    #include<string>
    #include"bintree.h"
    #include"useful.h"
    using namespace std;
    
    void ask_and_move(binary_tree_node<string>*& current_ptr);
    binary_tree_node<string>* beginning_tree();
    void instruct();
    void learn(binary_tree_node<string>*& leaf_ptr);
    void play(binary_tree_node<string>* current_ptr);
    
    int main() {
    	binary_tree_node<string>* animal_root_ptr;
    	instruct();
    	animal_root_ptr = beginning_tree();
    	do
    		play(animal_root_ptr);
    	while (inquire("还要不要再玩一次?"));
    	cout << "欢迎下次来玩~" << endl;
    	return EXIT_SUCCESS;
    	while (1);
    }
    void instruct() {
    	cout << "现在开始游戏吧" << endl;
    	cout << "你脑海中想象一只动物,让我来猜一猜" << endl;
    }
    void ask_and_move(binary_tree_node<string>*& current_ptr) {
    	cout << current_ptr->data();//输出问题
    	if (inquire("请回答:")) {
    		current_ptr = current_ptr->left();
    	}
    	else
    		current_ptr = current_ptr->right();
    }
    //创建二叉树
    binary_tree_node<string>* beginning_tree(){
    	binary_tree_node<string>* root_ptr;//头节点指针
    	binary_tree_node<string>* child_ptr;//孩子节点指针
    	const string root_question("你是哺乳动物么?");
    	const string left_question("你的体型比猫大,对么?");
    	const string right_question("这个动物是生活在水里么?");
    	const string animal_1("袋鼠");
    	const string animal_2("老鼠");
    	const string animal_3("罗非鱼");
    	const string animal_4("喜鹊");
    
    	//根节点
    	root_ptr = new binary_tree_node<string>(root_question);//头节点指针指向新创建的节点问题
    
    	//左子树
    	child_ptr = new binary_tree_node<string>(left_question);//左孩子问题
    	child_ptr->set_left(new binary_tree_node<string>(animal_1));
    	child_ptr->set_right(new binary_tree_node<string>(animal_2));
    
    	root_ptr->set_left(child_ptr);//将根节点的左节点设置为子节点的左节点
    
    	//右子树
    	child_ptr = new binary_tree_node<string>(right_question);
    	child_ptr->set_left(new binary_tree_node<string>(animal_3));
    	child_ptr->set_right(new binary_tree_node<string>(animal_4));
    
    	root_ptr->set_right(child_ptr);//将根节点的右节点设置为子节点的右节点
    	return root_ptr;
    }
    void learn(binary_tree_node<string>*& leaf_ptr) {
    	string guess_animal;
    	string correct_animal;
    	string new_question;
    	guess_animal = leaf_ptr->data();
    	cout << "好吧,我不知道是什么,还是你告诉我吧?" << endl;
    	getline(cin, correct_animal);
    	cout << "现在请输入一个新的问题来区分 ";
    	cout <<'['<<correct_animal<<']'<< " 和 " << '['<<guess_animal<<']' << endl;
    	getline(cin, new_question);
    	leaf_ptr->set_data(new_question);
    	cout<<correct_animal << "," << new_question << endl;
    	if (inquire("请回答")) {//如果回答的是正确的则做节点
    		leaf_ptr->set_left(new binary_tree_node<string>(correct_animal));
    		leaf_ptr->set_right(new binary_tree_node<string>(guess_animal));
    	}
    	else {
    		leaf_ptr->set_left(new binary_tree_node<string>(guess_animal));
    		leaf_ptr->set_right(new binary_tree_node<string>(correct_animal));
    	}
    }
    void play(binary_tree_node<string>* current_ptr) {
    	cout << "你现在脑海里想象一只动物,想好了然后按下回车.";
    	eat_line();//等待,直到按下回车
    	while (!current_ptr->is_leaf())//如果不是叶子节点就执行ask_and_remove()函数,因为是叶子节点就直接输出最后猜测的结果
    		ask_and_move(current_ptr);
    	cout << ("是" + current_ptr->data()+"吧");
    	if (!inquire(",我猜对了吗?"))//询问是否猜对,否,将该动物添加到二叉树中
    		learn(current_ptr);
    	else
    		cout << "我猜对了,哈哈哈哈" << endl;
    
    }

     bintree.h头文件

    template<class Item>
    class binary_tree_node {
    public:
    	typedef Item value_type;
    	binary_tree_node(const Item& init_data = Item(), binary_tree_node* init_left = NULL, binary_tree_node* init_right = NULL) {
    		data_field = init_data;
    		left_field = init_left;
    		right_field = init_right;
    	}
    	Item data() { return data_field; }
    	binary_tree_node* left() { return left_field; }
    	binary_tree_node* right() { return right_field; }
    	void set_data(Item new_data) { data_field = new_data; }
    	void set_left(binary_tree_node* new_left) { left_field = new_left; }
    	void set_right(binary_tree_node* new_right) { right_field = new_right; }
    	bool is_leaf() {
    		return (left_field == NULL) && (right_field == NULL);
    	}
    
    private:
    	Item data_field;
    	binary_tree_node* left_field;
    	binary_tree_node* right_field;
    };
    

    useful.h

    #ifndef __USEFUL__
    #define __USEFUL__
    double random_fraction();
    double random_real(double low, double high);
    void display(double x);
    void eat_line();
    bool inquire(const char query[]);
    #endif

    useful.cpp

    #include<assert.h>
    #include<ctype.h>
    #include<iostream>
    #include<stdlib.h>
    #include"useful.h"
    using namespace std;
    
    void display(double x) {
    	const char STAR = '*';
    	const char BLANK = ' ';
    	const char VERTICAL_BAR = '|';
    	const int LIMIT = 39;
    	int i;
    	if (x < -LIMIT)
    		x = -LIMIT;
    	else if (x > LIMIT)
    		x = LIMIT;
    	for (int i = -LIMIT; i < 0; i++) {
    		if (i > x)
    			cout << STAR;
    		else
    			cout << BLANK;
    	}
    	cout << VERTICAL_BAR;
    	for (int i = 1; i <= LIMIT; i++) {
    		if (i <= x)
    			cout << STAR;
    		else
    			cout << BLANK;
    	}
    }
    //返回浮点0-1的随机数
    double random_fraction() {
    	//cstdlib
    	return rand() / double(RAND_MAX);
    }
    double random_real(double low, double high) {
    	assert(low <= high);
    	return low + random_fraction()*(high - low);
    }
    void eat_line() {
    	char next;
    	do
    		cin.get(next);//一直等待,直到按下回车
    	while (next != '\n');
    }
    //传入一个数组		
    bool inquire(const char query[]) {
    	char answer;
    	do {
    		cout << query << "[Yes or No]" << endl;
    		cin >> answer;
    		answer = toupper(answer);//这个表示变成大写
    		eat_line();
    	}
    	while ((answer != 'Y') && (answer != 'N'));//如果输入的不是yes/no就继续询问
    	return (answer == 'Y');//返回输入的是否为yes,是返回true否则返回false
    }

    完整代码获取:https://gitee.com/lihiyu/guess_animal

    展开全文
  • 在游戏过程,计算机将通过学习有关动物的新事实并在下场游戏使用此信息来扩展其知识库。 学习成果 您将学习树数据结构,如何搜索它以及遍历它的所有节点。 您还将学习如何使用此结构存储知识库以及如何使用...
  • 考察 产生式系统我在搜索引擎的茫茫大海,你能看见我的这篇文章不是缘分,而是你要交作业了(抖机灵)求点赞,给作者一点分享的鼓励代码没写GUI,因为不喜欢这玩意,直接在终端进行人机交互。使用代码之前,请...

    考察 产生式系统

    我猜在搜索引擎的茫茫大海中,你能看见我的这篇文章不是缘分,而是你要交作业了(抖机灵)

    求点赞,给作者一点分享的鼓励

    代码没写GUI,因为不喜欢这玩意,直接在终端中进行人机交互。使用代码之前,请根据自身情况对字符编码、文件路径进行修改

    代码写的很烂,以后有能力了再把算法加进去优化代码吧

    第一问

    先根据题图,创建规则库(使用了一个文本文件)

    if 有毛发 then 哺乳动物

    if 有乳 then 哺乳动物

    if 吃肉 then 食肉动物

    if 有犬齿 and 有爪 and 眼向前方 then 食肉动物

    if 哺乳动物 and 有蹄 then 有蹄类

    if 哺乳动物 and 反刍动物 then 有蹄类

    if 哺乳动物 and 食肉动物 and 黄褐色 and 暗斑点 then 豹子

    if 哺乳动物 and 食肉动物 and 黄褐色 and 黑条纹 then 老虎

    if 有蹄类 and 长脖子 and 长腿 and 暗斑点 then 长颈鹿

    if 有蹄类 and 黑条纹 then 斑马

    代码:

    rules = {} # 以字典形式存储规则

    """ 读取规则库文件中规则,并存放在rules字典中 - 字典的键:前提 - 字典的值:结论 """

    def readRules(filePath):

    global rules

    for line in open(filePath, mode = 'r', encoding = 'utf-8'):

    line = line.replace('if', '').strip()

    temp = line.split(' then ')

    premise = temp[0]

    conclusion = temp[1]

    rules[premise] = conclusion

    """ 2. 推理机用这些事实(即:facts变量),依次与知识库中的规则的前提匹配 - 注意:匹配成功的规则可能不止一条,进行冲突消解 3. 若某规则的前提全被事实满足,则规则可以得到运用 4. 规则的结论部分作为新的事实存储 5. 用更新过的事实再与其它规则的前提匹配,直到不再有可匹配的规则为止 """

    def matchRules(facts):

    print()

    # 循环匹配

    isEnd = False

    def loop():

    global rules

    nonlocal facts, isEnd

    rules_copy = rules.copy()

    i = 0

    for premise in rules:

    flag = True

    # print(premise+ ':' + rules[premise])

    pre = premise.split(' and ')

    for p in pre:

    if p in facts:

    pass

    else:

    flag = False

    if(flag):

    print('该动物:' + premise + ' -> ' + rules[premise])

    for p in pre:

    facts = facts.replace(p, ' ')

    facts = facts + rules[premise]

    rules_copy.pop(premise)

    else:

    i += 1

    if i == len(rules):

    isEnd = True

    rules = rules_copy

    # 是否推导出最终结论

    while(not isEnd):

    loop()

    """ 1. 用户通过人机界面输入一批事实 """

    def ui():

    print('----')

    print('--------动物识别系统--------')

    print('----')

    print('注意!请按照规则库中的前提来阐述事实', end='\n\n')

    facts = input('请输入事实:')

    matchRules(facts)

    def main():

    filePath = r'动物识别系统/rules.txt'

    readRules(filePath)

    ui()

    if __name__ == '__main__':

    main()

    人机交互示例:

    ----

    --------动物识别系统--------

    ----

    注意!请按照规则库中的前提来阐述事实

    请输入事实:该动物有暗斑点、长脖子、长腿、有乳、有蹄。

    该动物:有乳 -> 哺乳动物

    该动物:哺乳动物 and 有蹄 -> 有蹄类

    该动物:有蹄类 and 长脖子 and 长腿 and 暗斑点 -> 长颈鹿

    第二问

    把规则库换成以下规则,在看看系统的执行情况:

    有毛发的动物是哺乳类;

    有奶的动物是哺乳类;

    有羽毛的动物是鸟类;

    若动物会飞且生蛋,则它是鸟类;

    吃肉的哺乳类称为食肉动物;

    犬牙利爪,眼睛向前的是食肉类;

    反刍食物的哺乳类是有蹄类;

    有蹄的哺乳类是有蹄类;

    黄褐色有黑色条纹的食肉类是老虎;

    黄褐色有暗斑点的食肉类是金钱豹;

    长腿长脖有黄褐色暗斑点的有蹄类是长颈鹿;

    有黑白条纹的有蹄类是斑马;

    不会飞腿长脖黑白色的鸟是鸵鸟;

    不会飞善游泳黑白色的鸟是企鹅;

    善飞的鸟是信天翁.

    把规则库重新写一遍就可以了,或者你再新建一个文本文件

    if 有毛发 then 哺乳类

    if 有奶 then 哺乳类

    if 有羽毛 then 鸟类

    if 会飞 and 生蛋 then 鸟类

    if 吃肉 and 哺乳类 then 食肉动物

    if 犬牙 and 利爪 and 眼睛向前 then 食肉类

    if 哺乳类 and 反刍食物 then 有蹄类

    if 哺乳类 and 有蹄 then 有蹄类

    if 食肉类 and 黄褐色 and 黑色条纹 then 老虎

    if 食肉类 and 黄褐色 and 暗斑点 then 金钱豹

    if 有蹄类 and 长脖 and 长腿 and 黄褐色 and 暗斑点 then 长颈鹿

    if 有蹄类 and 黑白条纹 then 斑马

    if 鸟 and 不会飞 and 长脖子 and 长腿 and 黑白色 then 鸵鸟

    if 鸟 and 不会飞 and 善游泳 and 黑白色 then 企鹅

    if 鸟 and 善飞 then 信天翁

    最后吐槽一句,产生式系统是真的傻,如果不对输入进行模糊判断,嘁嘁嘁(我没有这样搞,因为搞不好,以后有能力了再加上)

    所以呢,我这垃圾代码,执行时输入一系列事实之前需要先看看规则库的的前提;不然,你在事实中输入’有奶‘,而规则库中是’有乳‘,俺这代码可不认你的’有奶‘

    展开全文
  • 大家好,我是本公众号的小编每天加班都到很晚,是为了给大家收集最好玩的游戏从做这个号开始到现在已玩过几千款各式各样的游戏现推荐的每款游戏都是小编亲自试玩过几千款游戏我们只推荐百款这百款游戏无论从...
    大家好,我是本公众号的小编每天加班都到很晚,是为了给大家收集最好玩的游戏从做这个号开始到现在已玩过几千款各式各样的游戏现推荐的每一款游戏都是小编亲自试玩过几千款游戏中我们只推荐一百款这一百款游戏无论从玩法、画质都是同类型中最好最优质而且体验感觉超好的,才能做为推荐对象,动作类小游戏、体育类小游戏、益智类小游戏、射击类冒险类小游戏、策略类小游戏、敏捷类小游戏、搞笑类休闲小游戏应有尽有...关注我们,从此你再也不用去费力找游戏了每天都能玩到最热门最好玩的游戏为了丰富大家的娱乐需求,小编贴心地增加了视频模块里面包含当下最热最好看的电影、新番、影视剧、综艺等全网VIP内容,如果你找不到想看的,请记得搜索哦下方卡片,点击开始吧↓↓↓全民猜歌小程序游戏

    开始游戏玩百款热门好玩小游戏dbb47325843cef279ce484f23f97df27.png

    9e7407cdcc65030cb7edf9d04d2af572.png

    全民猜歌小程序游戏是一款常好玩的游戏;游戏支持人机对战,也可以进行多人在线联网对战;游戏操作简单,玩法新颖,上面“开始游戏”即刻开启游戏之旅!封为国师,或提供古代魔法典籍供其修炼,魔法师公会也因此修饰的金碧辉煌。魔法师公会门口没有人类守卫,而是两个被赋予了魔法力量的石像,当张新一和冰兰走过去的时候,两个石像突然用石头武器挡住了两个人的去路:“你们两个身上没有魔法精灵的存在,我不能放你们进去!”“我是月神帝国将军,我来找魔法师公会会长克劳迪亚!”张新一喊道,石像顿了顿,将武器移开:“那么,请进吧!”当两个人走进魔法师公会大厅的时候,一个身披魔法袍、用魔法杖做拐杖用的老头迎了过来,他的头上顶着一个名字:克劳迪亚·克里斯马斯。“哈哈!你们还在门口的时候,我就知道有客人要来了!”克劳迪亚以前是宫廷大魔法师,虽然现在已经老了,但是却依然很受尊敬。“我们给你带来了你非常感兴趣的东西!不知道你愿不愿意……”张新一将《禁咒神语》拿到了手中,克劳迪亚看到了书的封面后,脸色突然大变:“啊!我敢保证,如果你手中的东西是真的的话,那绝对是一件无价之宝!赶紧跟我来吧!”克劳迪亚带着两个人沿着走廊朝魔法师公会的后院走去——走廊两边,每隔五米都有一副巨大的壁画,壁画上的人物都栩栩如生,更让两个人惊讶的是,画上的人竟然会动!张新一和冰兰都好奇的看了起来,克劳迪亚看两个人有兴趣,就解释道:“这些都是我们的先辈的一些英勇事迹!图画被赋予了魔法的力量,所

    ?求支持!点亮在看,你最好看?

    e60b18e8bc4bd746723abbb3325f0cc2.gif
    展开全文
  • 2、程序保存了个基本问题的知识,每个问题让它减少考虑动物数。当程序已经减少它的考虑到仅动物,它就这个动物。假如者是对的,程序赢了,否则,程序问玩者想的动物名字。然后,问如何区分新的动物...

    一、目标与要求

    基本要求
    1、程序的用户作为玩者的角色,计算机是猜者的角色。
    2、程序保存了一个基本问题的知识,每一个问题让它减少考虑中的动物数。当程序已经减少它的考虑到仅一只动物,它就猜这个动物。假如猜者是对的,程序赢了,否则,程序问玩者想的动物名字。然后,问如何区分新的动物和所猜的动物。它保存这个问题并且储存这个新的动物在下一次玩的游戏的基本知识中。
    3、每一次学到的新动物的特征,就被这个程序加入到基本知识中。随着时间的流逝,程序的基本知识在增长,玩者想出不在基本知识中的动物变得越来越难—这个程序在猜动物时变成一位专家。在某些领域通过用一些基本知识来陈述专家见解的程序叫做专家系统,并且这个系统的研究是人工智能的一个分支。尽管大部分专家系统使用程序不能修改的固定知识,动物游戏的程序是一个特殊的自学习专家系统的例子,因为当它们遇见新的情况时就增加新的动物到基本知识里。这个改变基本知识的能力,使得动物程序能模仿学习的过程。

    二、工具/准备工作

    复习数据结构与算法课程的查找的相关内容、文本编辑功能,实现文本的读取和编写、建立二叉树的相关知识等数据查找结构,对问题进行分析需要采取什么数据结构对动物信息存储,根据相关关键词查找具有该特征的动物,画出二叉树结构树;以哺乳动物为根结点,左孩子指针为“是”,右孩子为“否”,第二个关键字为“是否会飞。共四种情况,分别下图所示:
    在这里插入图片描述

    三、实验分析

    分析算法设计方法,类结构与主要算法实现原理等内容。

    1、首先要建立数据结构存储信息。建立树类BinaryTree、树节点类BinaryTreeNode,左右孩子指针LeftChild、Rightchild,用于存储动物具体信息,根节点储存关键字,“”是“则选择左节点,“否”则选择右节点
    2、建立文本文件“知识库.txt”,用于动物学习专家来读取相关信息。通过对文本文件“知识库.txt”进行读取,动物游戏专家就可以轻易的掌握固定的知识,根据动物游戏专家的知识可以完成简单的猜动物游戏。
    3、 将专家从知识库中读取的信息,根据
    前序遍历
    的方式存储在队列中,进行查找操作在这里插入图片描述
    4. 进行猜动物游戏,玩家想一个动物,与专家进行游戏,
    举例:
    若玩家想的是“猪”,选择是哺乳动物(1号关键字选择“是”)、不会飞的动物(2号关键字选择“否”),则专家可以猜出答案“猪”。
    若玩家想的动物是哺乳动物、会飞的动物:“飞猪”,那么专家将无法得到正确的答案,此时则需要玩家输入“动物名称、动物特征”,飞猪,哺乳动物、会飞的则专家将更新信息,将蝙蝠改为“飞猪”;
    5. 玩家可以继续上述的3过程,直到不再游戏,选择“否”

    四、实验步骤

    详细介绍实验操作步骤。

    1、建立数据结构二叉树及其结点类

    class BinaryTree;//树类 
    class BinaryTreeNode;//树节点类 
    class BinaryTreeNode
    {
    		friend class BinaryTree;
    public:
    	BinaryTreeNode() { L = NULL; R = NULL; }//构造函数,构造根结点
    	BinaryTreeNode(string &an, BinaryTreeNode *l = NULL, BinaryTreeNode *r = NULL);  
    	//分支结点构造函数,主要使用这个
    	void GetAn(string & data)const { data=Data; }
        void release();
    protected:
    	string Data;	//所有数据 
    	BinaryTreeNode * L;	//左孩子指针
    	BinaryTreeNode * R;    //右孩子指针 
    };
    class BinaryTree
    {
    public:
    	BinaryTree() { T = NULL; }	//构造函数
    	BinaryTree(BinaryTreeNode*P) { T =P; }
    	~BinaryTree();	//析构函数
    	void readfile();   //专家读取“知识库”中的资料
    	void writefile();  //写入专家的“知识库”中
    	void queuetotree(BinaryTreeNode**);//将队列中的内容以前序遍历生成二叉树
    	void treetoqueue(BinaryTreeNode*); //将二叉树中的内容以前序遍历存入队列 
    void expert(BinaryTreeNode*); //专家提问和推测 玩家回答 
    protected:
    	BinaryTreeNode *T;
    };
    

    2、建立文本文件“知识库.txt”,将相关的动物特征和动物名称输入进入保存,
    在这里插入图片描述
    3、建立动物游戏专家,
    ① 专家猜出正确答案,动物游戏专家胜利
    ② 专家未能猜出正确答案,玩家胜利,专家开始学习功能(更新数据)

    void BinaryTree::expert(BinaryTreeNode *T)//专家提问和推测 玩家回答 
    {
    	string str1="是",str2="否",str3,str4,str5; 
    	while(1)
    	{
    		BinaryTreeNode *N;
    		N=T;
    		while(1)
    		{
    			cout<<"是否"<<N->Data<<"?"<<endl;
    			cin>>str3;
    			if(N->L==NULL&&N->R==NULL)
    			{	if(str3==str1)
    					{
    						cout<<"专家已猜出结果,是否再来一次?"<<endl;
    						cin>>str3;
    						break;
    					}
    				else if(str3==str2)   //没有猜到玩家的答案,专家学习系统自动更新功能
    					{
    						cout<<endl;
    						cout<<"专家没有猜出,快快告诉它动物名称特征" <<endl;
    						cout<<"动物名称"<<endl;
    						cin>>str4;	
    						cout<<"相关特征"<<endl;	
    						cin>>str5;
    						BinaryTreeNode *X,*Y;
    						X = new BinaryTreeNode;
    						Y = new BinaryTreeNode;
    						X->L=X->R=Y->L=Y->R=NULL;
    						N->L=X;
    						N->R=Y;
    						Y->Data=N->Data;
    						N->Data=str5;
    						X->Data=str4;
    						cout<<"上一次失误,要再来一次嘛?"<<endl;
    						cin>>str3;
    						break;						 
    					}
    					else
    					{
    						cout<<"别输入“奇怪字符”专家会下线,请重新输入。"<<endl;
    					}
    			}
    			else
    			{
    				if(str3==str1)  //如果回答“是”则选择左孩子指针
    				{
    						N=N->L;
    				}
    				else if(str3==str2)	 //如果回答“否”则选择左孩子指针
    				{
    						N=N->R;
    				}
    				else 
    				{
    					cout<<"别输入“奇怪字符”专家会下线,请重新输入。"<<endl;
    //输入不正确的字符,
    				}	
    			}				
    		}	
    		if(str3==str2) break; //如果输入“否”游戏结束,程序结束
    	}
    }	
    

    五、测试与结论

    1、调试程序,检测程序是否能够正常运行
    如下图所示:
    在这里插入图片描述

    程序运行正常,动物学习专家系统正常,经过调试:1号关键字选择“是”,2号关键字选择“是”,专家猜出答案“蝙蝠”,专家胜利、玩家失败

    2、测试程序二叉树结构,检查“LL、LR、RL、RR”二叉树的叶子结点是否能够正确查找
    ① LL“是是”(左孩子的左孩子结点):哺乳动物且会飞
    在这里插入图片描述

    程序运行正常,专家知识库中哺乳动物会飞的动物为蝙蝠,
    ② LR“是否”(左孩子的右孩子结点):哺乳动物且不会飞
    在这里插入图片描述
    程序查找过程正确,专家知识库中的哺乳动物不会飞动物为“猪”
    ③ RL“否是”(右孩子的左孩子结点):不是哺乳动物且会飞
    程序查找过程正确,专家知识库中的不是哺乳动物会飞动物为“鸟”
    在这里插入图片描述
    ④ RR“否否”(右孩子的右孩子结点):不是哺乳动物且不会飞
    在这里插入图片描述
    程序查找过程正确,专家知识库中的不是哺乳动物不会飞动物为“蛇”
    3.检测动物游戏专家的更新功能,即专家未能猜出正确答案,玩家胜利,专家开始学习功能(更新数据)
    测试数据:哺乳动物且会飞,但不是蝙蝠为飞猪
    在测试中为哺乳动物会飞但非蝙蝠,修改动物特征:
    在这里插入图片描述
    在测试中为哺乳动物会飞但非蝙蝠,修改动物特征:哺乳动物且会飞,为“飞猪”
    修改后测试,哺乳动物会飞的不再是蝙蝠而是“飞猪”
    结论:动物游戏专家完成数据更新功能,并能根据玩家想法学习,

    六、实验总结

    借助二叉树结构来查找动物,并通过文本文件编辑的功能借助文本文件来存储专家系统的知识,读取添加文本文件实现动物游戏专家知识的学习更新,综合性的考察了数据结构的灵活使用,对数据结构与算法的综合性认识加深,不同数据结构的使用使得信息的储存、编辑、查找更高效;
    不足之处:仅采用了二叉树,设置两个关键字:”是否为哺乳动物,是否会飞”来区分四种动物,数据结构较为简单,在实现三叉树及多叉树的分类中,对相关知识的掌握程度不熟悉,未能实现更多动物种类的区分。

    附原程序:

    #include <iostream>
    #include <queue>    //队列类 
    #include <sstream>
    #include <fstream>
    #include <string>
    using namespace std;
    queue<string>q1,q2;
    
    class BinaryTree;//树类 
    class BinaryTreeNode;//树节点类 
    
    class BinaryTreeNode
    {
    	friend class BinaryTree;
    public:
    	BinaryTreeNode() { L = NULL; R = NULL; }//构造函数,构造根结点
    	BinaryTreeNode(string &an, BinaryTreeNode *l = NULL, BinaryTreeNode *r = NULL);  
    	//分支结点构造函数,主要使用这个
    	void GetAn(string & data)const { data=Data; }
        void release();
    protected:
    	string Data;	//所有数据 
    	BinaryTreeNode * L;	//左孩子指针
    	BinaryTreeNode * R;    //右孩子指针 
    };
    
    void BinaryTreeNode::release()
    {
    	if (L != NULL)
    	{
    		L->release();
    		delete L;
    		L = NULL;
    	}
    	if (R != NULL)
    	{
    		R->release();
    		delete R;
    		R = NULL;
    	}
    }
    
    class BinaryTree
    {
    public:
    	BinaryTree() { T = NULL; }	//构造函数
    	BinaryTree(BinaryTreeNode*P) { T =P; }
    	~BinaryTree();	//析构函数
    	void readfile();
    	void queuetotree(BinaryTreeNode**);
    	void expert(BinaryTreeNode*); 
    	void treetoqueue(BinaryTreeNode*);
    	void writefile();  
    protected:
    	BinaryTreeNode *T;
    };
    
    BinaryTree::~BinaryTree()
    {
    	if (T != NULL)
    	{
    		T->release();
    		delete T;
    		T = NULL;
    
    	}
    }
    void BinaryTree::treetoqueue(BinaryTreeNode*T)//将二叉树中的内容以前序遍历存入队列 
    {
        string str="#";
        if (T == NULL)
    	{
    		q2.push(str);
    
    		return;
    	}
        q2.push(T->Data);
    	treetoqueue(T->L);
       	treetoqueue(T->R);
    }
    
    void BinaryTree::queuetotree(BinaryTreeNode**T)//将队列中的内容以前序遍历生成二叉树 
    {
        string str1,str2="#";
        str1=q1.front();
        q1.pop();
        if (str1 == str2)
            *T = NULL;
        else
        {
            *T = new BinaryTreeNode;
            (*T)->Data = str1;
            queuetotree(&(*T)->L);
            queuetotree(&(*T)->R);   
        }
    }
    
    void BinaryTree::expert(BinaryTreeNode *T)//专家提问和推测 玩家回答 
    {
    	string str1="是",str2="否",str3,str4,str5; 
    	while(1)
    	{
    		BinaryTreeNode *N;
    		N=T;
    		while(1)
    		{
    			cout<<"是否"<<N->Data<<"?"<<endl;
    			cin>>str3;
    			if(N->L==NULL&&N->R==NULL)
    			{	if(str3==str1)
    					{
    						cout<<"专家猜出结果,玩家失败,是否再来一次?"<<endl;
    						cin>>str3;
    						break;
    					}
    				else if(str3==str2)//,未能猜出正确答案,专家学习系统自动学习功能
    					{
    						cout<<endl;
    						N->release();
    						cout<<"专家没有猜出,快快告诉它动物名称和相关特征" <<endl;
    						cout<<"动物名称"<<endl;
    						cin>>str4;	
    						cout<<"相关特征"<<endl;	
    						cin>>str5;
    						BinaryTreeNode *X,*Y;
    						X = new BinaryTreeNode;
    						Y = new BinaryTreeNode;
    						X->L=X->R=Y->L=Y->R=NULL;
    						N->L=X;
    						N->R=Y;
    						Y->Data=N->Data;
    						N->Data=str5;
    						X->Data=str4;
    						cout<<"上一次失误,要再来一次嘛?"<<endl;
    						cin>>str3;
    						break;						 
    					}
    					else
    					{
    						cout<<"别输入“奇怪字符”专家会下线,请重新输入。"<<endl;
    					}
    			}
    			else
    			{
    				if(str3==str1)
    				{
    						N=N->L;
    				}
    				else if(str3==str2)
    				{
    						N=N->R;
    				}
    				else 
    				{
    					cout<<"别输入“奇怪字符”专家会下线,请重新输入。"<<endl;
    				}	
    			}				
    		}	
    		if(str3==str2) break;
    	}
    }	
    
    
    void BinaryTree::readfile()//读取文件中的内容存入队列 
    {
    	std::ifstream fin("知识库.txt", std::ios::in);
    	char line[1024] = { 0 };
    	std::string x = "";
    	while (fin.getline(line, sizeof(line)))
    	{
    		std::stringstream word(line);
    		word >> x;
    		q1.push(x);
    	}
    	fin.clear();
    	fin.close();
    	cout<<"专家已上线,准备开始游戏"<<endl<<endl;
    }
    
    void BinaryTree::writefile()//将队列的内容存入文件中 
    {
    	int a;
    	a=q2.size();
    	ofstream   f("知识库.txt ",ios::trunc);
    	f.close(); 
    	ofstream   ofresult( "知识库.txt ",ios::app);	
    	for(int i=0;i<a;i++)
    	{
    		ofresult<<q2.front()<<endl;
    		q2.pop();
    	} 
    	//cout<<"录入成功"<<endl;
    }
    
    void main()
    {
    	cout<<"动物学习专家系统"<<endl;
    	BinaryTreeNode* P=NULL;
    	BinaryTree tree(P);
        tree.readfile();//专家读取“知识库”中的资料
    	tree.queuetotree(&P);//将队列中的内容以前序遍历生成二叉树
    	tree.expert(P); //专家提问和推测 玩家回答 
    	tree.treetoqueue(P);//将二叉树中的内容以前序遍历存入队列
    	tree.writefile(); //写入专家的“知识库”中 
    }
    
    

    嘿!被我逮到你了吧。
    给小编点个赞呗!

    展开全文
  • 自己脑海里想动物,然后根据计算机的提示输入yes/no,让计算机它你脑海动物,如果它不对就将自己的动物输入到计算机,让它记住能保证下次它能出来,而且可以使用文件构造二叉树并储存。
  • 《数据结构与算法(C++版)实验和课程设计(第二版)》里面有个项目,叫动物游戏,规则是玩家想动物,电脑问玩家一些问题,玩家想的动物,如果没对,就将玩家想的动物添加到数据库里。书里没有给出二叉树...
  • 进来人工AI界有项轰动性的研究突破被众所周知,那就是谷歌研究人员开发了款可以学习和模拟动物的动作的AI系统,它能以予机器人更大的灵活性。他们的方法可以促进机器人的发展,从而让机器人能够完成生活一些对...
  • 文章目录肠道微生物介导了降雨变化对布氏田鼠种群的上行效应摘要引言结果野外条件下人工降雨处理对鼠类种群的上行效应**野外不同降雨组的食谱对室内田鼠的影响**植物叶片关键的营养成分对田鼠的影响不同果糖添加量...
  • 夏天就像个顽皮的小娃娃,谁也不出她的下个表情是什么。今天给大家分享一下有关于夏天的作文,让我们起来欣赏一下吧! 夏天的作文 春姑娘无声无息地走了,炎热的夏天开始隆重登场了。你瞧,夏天的威力可...
  • 这是我看过,最好懂的神经网络

    千次阅读 2019-04-16 12:32:00
    猜一猜,下图是什么动物?图1 看图猜动物尽管图动物胖得出奇,你也应该能够猜到它是一只长颈鹿。人类的大脑拥有强大的辨识能力,它是一个由差不多800亿个神经元组成的...
  •  我是条幸福的蚯蚓作文 我是……好吧,先给你们出个谜语:我是只虫子,只环节动物,整天在地里钻,却没有人嫌我脏。你出来了吗?没错,我就是蚯蚓。 我每天在土壤里钻来钻去,可惜没有眼睛什么也都看...
  • 7.2 图的定义 213 现实,人与人之间关系就非常复杂,比如我的认识的朋友,可能他们之间也互相认识,这就不是简单的对多的关系了,那就是我们今天要研究的主题--图。 7.2.1 各种图定义 214 7.2.2 图的...
  • [笑]体验零重力,参加全美橄榄球联盟,给世界图书百科全书出篇文章 -我你可以看出我很早就是书呆子了。[笑]当柯克船长,在这里有谁有这个童年梦想吗?不会在卡耐基 -梅隆大学,没有。我想我能成为个在游乐园...
  • ** 上次是虚幻的龙,这次真菌,盲次应该是种现实动物 (手动滑稽)**
  • 幼儿园中班活动方案幼儿益智活动方案大全 幼儿园中班的教学过程... 2、个人表演卡片上的动物,另个人根据表演的肢体动作,表演的人可以给对方提示,但不可以把动物的名字说出来。 3、两个人要站在面对面的方...
  •  写麻雀的高中作文篇1 有只小动物,它很常见,会飞,特别小,而且是害鸟哦!你们猜猜它是谁? 答对了!它就是小麻雀。 小麻雀穿身棕褐色和灰白色相间的衬衫,有个像小扫把的尾巴,有一张乌黑发亮的小嘴巴,...
  • 通常有抬腿藏腿法,假设代数...先动物都是鸡: 再,这回9只鸡1只兔子: 接着: 哈,根本不用把腿藏起来嘛,不过个四五次就出来了。 其实小朋友们还有更聪明的方法。有个小朋友说,打...
  • 落地要从头开始,看那队在最短的时间内将行程走完 游戏道具:皮球 游戏名称:心有灵犀成语 游戏内容: 以两人为组。个用肢体动作或语言(但不能说出成语的任何个字)向同伴提示! 游戏道具:纸片成语...
  • 利用大量动物视频数据,对神经网络进行训练,在复杂、动态环境下的动物行为观察,实现更好的动物与背景分割效果,从而更好地进行动物追踪。 鸟为什么有时候会啄蛋?松鼠摆尾是想表达什么?喵星人弓起腰来是害怕...
  • 选择是我们日常生活最常见的,比如今天周一了,我是赖床还是准点上班……我们几乎...选择最开始的问题想象一下这个场景:起来玩个游戏,现在你在脑海里想到动物,我需要到你想的是什么动物。我每次会问你...
  • 幼儿园小班音乐教学方案实用大全 幼儿园小班音乐教学方案1 活动目的: 1.感受歌曲优美、流畅的情绪,...教师:小朋友,开动脑筋猜一猜什么动物白肚皮,黑衣裳,尾巴像把小剪刀,爱吃害虫保庄稼,我们大家都爱他? ...
  • 注意:迷你游戏会从以下gem实施代码: : 但是有个过时的要求,这使我无法使用该gem。 在lib / AnimalCrossingVillagerFinder / ascii.rb找到的代码来自该gem! 安装 将此行添加到您的应用程序的Gemfile: ...
  • 学习计划!!!!!

    千次阅读 2016-12-20 14:53:03
    好吧,到头来,我们还是孑身人,形单影只的的敲着代码,每天对我们最“热情”的人还是自己的PM,也许我们依然没有女友,但是就像恋爱中猜不透女友心思一样,我们依然猜不透客户或者PM的需求;
  • 白鲸说明文_精选.doc

    2020-12-08 16:08:44
    白鲸说明文 下面给大家介绍关于,方便大家学习。白鲸说明文 我有洁白无瑕的身体,可爱的小眼睛时刻微笑着。接下来在这里给大家带来白鲸说明文,希望对你有所...我们鲸是地球上现存的最大动物了,没有动物比得....
  • 家长开放日邀请函.doc

    2020-12-27 09:43:24
     下周三上午(20XX年1月12日)是我们四班的家长开放日活动,特别邀请每个家庭有位或多位家长参加。活动安排大致如下: 、8:30——10:00在三楼大礼堂进行舞蹈汇报演出(女孩统一白毛衣、白舞蹈袜、白舞蹈鞋...

空空如也

空空如也

1 2 3
收藏数 50
精华内容 20
关键字:

中猜一动物