失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > C#编写简单的人工智能课程的实验-猴子摘香蕉

C#编写简单的人工智能课程的实验-猴子摘香蕉

时间:2022-04-29 20:46:12

相关推荐

C#编写简单的人工智能课程的实验-猴子摘香蕉

1.实验内容

用C#,编写完成了使用者分别输入猴子、香蕉、箱子所在的位置,输出完整的猴子摘香蕉的过程。

2.大致逻辑

首先由使用者输入猴子、箱子和香蕉所在的位置,首先判断猴子和箱子是否在同一位置,若不在同一位置,则让猴子移动到箱子所在的位置,改变状态结构体中猴子位置的值。

在第一步实现的情况下,判断猴子、箱子和香蕉是否在同一位置上,若是,则猴子爬箱子摘香蕉,若不是,则让猴子将箱子推到香蕉的位置,此时改变状态结构中猴子和箱子位置的值。

当猴子、箱子和香蕉在同一位置后,判断猴子是否在箱子上,若在箱子上,直接摘香蕉,若猴子没在箱子上,先让猴子爬上箱子,再摘香蕉,此时改变状态结构中关于猴子是否在箱子上的值,最后将步骤输出在控制台中。

3.代码实现

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Monkey{class Program{struct State{public int Monkey; //猴子位置public int Banana; //香蕉位置public int Box; //盒子位置public bool MonB; //猴子是否在盒子上,True为在,False为不在}//新建结构体数组和对应步骤static State[] states = new State[200];Dictionary<int, string> stepSave = new Dictionary<int, string>();public static void Main(string[] args){Program pg = new Program();Console.Write("输入猴子位置(-1,0,1):");SetRange(ref states[0].Monkey, int.Parse(Console.ReadLine()));Console.Write("输入香蕉位置(-1,0,1):");SetRange(ref states[0].Banana, int.Parse(Console.ReadLine()));Console.Write("输入箱子位置(-1,0,1):");SetRange(ref states[0].Box, int.Parse(Console.ReadLine()));if (states[0].Box == states[0].Monkey){states[0].MonB = true;if (states[0].Monkey == states[0].Banana){Console.Write("猴子躺在箱子上伸手就摸到了香蕉");Console.ReadKey();Environment.Exit(0);}}else states[0].MonB = false;pg.nextStep(0);}/// <summary>/// 限定三个点范围/// </summary>/// <param name="result"></param>/// <param name="a"></param>static void SetRange(ref int result, int a){if (a < -1){result = -1;}else if (a > 1){result = 1;}elseresult = a;}//猴子的移动void MonkeyGoTo(int a, int i){if (a == -1){stepSave[i] = "猴子到了A点";states[i + 1] = states[i];states[i + 1].Monkey = -1;}else if (a == 0){stepSave[i] = "猴子到了B点";states[i + 1] = states[i];states[i + 1].Monkey = 0;}else if (a == 1){stepSave[i] = "猴子到了C点";states[i + 1] = states[i];states[i + 1].Monkey = 1;}}//推箱子的移动void MoveBox(int a, int i){if (a == -1){stepSave[i] = "猴子将箱子推到了A点";states[i + 1] = states[i];states[i + 1].Monkey = -1;states[i + 1].Box = -1;}else if (a == 0){stepSave[i] = "猴子将箱子推到了B点";states[i + 1] = states[i];states[i + 1].Monkey = 0;states[i + 1].Box = 0;}else if (a == 1){stepSave[i] = "猴子将箱子推到了C点";states[i + 1] = states[i];states[i + 1].Monkey = 1;states[i + 1].Box = 1;}}//爬箱子void ClimbOn(int i){stepSave[i] = "猴子爬上了箱子";states[i + 1] = states[i];states[i + 1].MonB = true;}//下箱子:用于初始猴子和箱子位置一样的时候void ClimbDown(int i){stepSave[i] = "猴子爬下了箱子";states[i + 1] = states[i];states[i + 1].MonB = false;}//拿到香蕉void Reach(int i){stepSave[i] = "猴子摘到了香蕉";}//在控制台上打印步骤void ShowSolution(int i){int j;Console.Write("问题结果:\n");for (j = 0; j < i + 1; j++){Console.Write($"Step{j + 1}: {stepSave[j]} \n");}Console.Write("\n");}void nextStep(int i){int c;int k;//步数超过一定界限认为失败if (i >= 200){Console.Write("%s \n", "猴子不会摘香蕉了!");return;}//先判断是否跟之前的状态相同,若是则返回防止程序死循环for (c = 0; c < i; c++){if (states[c].Monkey == states[i].Monkey && states[c].Box == states[i].Box && states[c].Banana == states[i].Banana && states[c].MonB == states[i].MonB)return;}//拿到香蕉if (states[i].MonB == true && states[i].Monkey == states[i].Banana && states[i].Monkey == states[i].Box){ShowSolution(i);Console.ReadKey();Environment.Exit(0);}k = i + 1;//进行数据更新,用来标记当前是第几个状态if (states[i].Monkey == states[i].Box)//猴子和箱子在一起{if (states[i].MonB)//猴子在箱子上{ClimbDown(i);nextStep(k);}else//猴子没在箱子上{if (states[i].Monkey != states[i].Banana)//三者不在同一位置{MoveBox(states[i].Banana, i);nextStep(k);}else //三者在同一位置{ClimbOn(i);Reach(i + 1);nextStep(k);}}}else //猴子和箱子不在一起{MonkeyGoTo(states[i].Box, i);nextStep(k);}}}}

如果觉得《C#编写简单的人工智能课程的实验-猴子摘香蕉》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。