#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <Windows.h>
#include "unistd.h"
#define Max_Size 20 //最大允许的地图大小
#define TimeInterval 25 //预定的等待时间间隔,可更改
#define ChangeColor_Purple printf("\033[35m")//将颜色换成紫色
#define ChangeColor_Green_ printf("\033[32m")//将颜色换成绿色
#define ChangeColor_Red___ printf("\033[31m")//将颜色换成红色
#define ChangeColor_Yellow printf("\033[33m")//将颜色换成黄色
#define ChangeColor_Whilt_ printf("\033[0m") //将颜色换成白色
_Bool Mode = 0;//用户选择的模拟模式,A为0,B为1
int X_In = 0, Y_In = 0;//入口的坐标
int X_Out = 0, Y_Out = 0;//出口的坐标
///注意,目前仅限于模拟出入口在地图边界且唯一的情况,且仅限于一只无智力随机游走的蚂蚁
///注意,程序并不会自动判断地图是否含有通路
void Start();
void InputTheMap(char M[Max_Size][Max_Size], int width, int height, int lineNeedClean);
void CleanTheScreen();
void Imitate(char M[Max_Size][Max_Size], int width, int height);
void Output(char M[Max_Size][Max_Size], int width, int height);
int main()
{
Start();
if (Mode)//选择了自行输入
{
int LineUsed = 0;
WrongInputSize:{//如果输入的大小超出所允许的范围,则跳回这里
int Width = 0, Height = 0;
char Map[Max_Size][Max_Size] = { " " };
//以下内容提示用户输入所需地图的长宽
ChangeColor_Purple; printf(">");
ChangeColor_Green_; printf("Please input the size of the map:\n");
ChangeColor_Purple; printf("*");
ChangeColor_Green_; printf("Width=");
ChangeColor_Whilt_; scanf("%d", &Width);//读取宽度
ChangeColor_Purple; printf("*");
ChangeColor_Green_; printf("Height=");
ChangeColor_Whilt_; scanf("%d", &Height);//读取高度
LineUsed += 3;
if (Width > 2 && Width <= Max_Size && Height > 2 && Height <= Max_Size)
{
InputTheMap(Map, Width, Height, LineUsed);//输入完整地图
//接下来开始进行模拟
}
else {
ChangeColor_Purple; printf(">");
ChangeColor_Red___; printf("You should input between 3 to %d.Please try again.\n", Max_Size);
LineUsed++;
ChangeColor_Whilt_; goto WrongInputSize;//提示用户输入的数据不符合实际要求
}
}
}
else {//选择使用内置的10*10地图
char Map[Max_Size][Max_Size] = { {'#','*','#','#','#','#','#','#','#','#'},
{'#',' ',' ',' ','#',' ',' ',' ',' ','#'},
{'#',' ','#',' ','#',' ','#','#',' ','#'},
{'#',' ','#',' ',' ',' ','#',' ',' ','#'},
{'#',' ',' ',' ',' ',' ','#',' ','#','#'},
{'#','#',' ','#',' ',' ',' ',' ','#','#'},
{'#','#',' ','#','#',' ','#',' ',' ','#'},
{'#',' ',' ',' ','#',' ','#','#',' ','#'},
{'#','#',' ',' ',' ',' ',' ','#',' ','#'},
{'#','#','#','#','#','#','#','#','!','#'}};//自带地图
X_In = 1;
Y_In = 0;
X_Out = 8;
Y_Out = 9;
CleanTheScreen();//清空屏幕
Imitate(Map, 10, 10);
}
return 0;
}
void Start()
{
char ChooseTheMode = ' ';
ChangeColor_Purple; printf(">");
ChangeColor_Green_; printf("Please input the mode you want(A/B):\n");
ChangeColor_Purple; printf("A.");
ChangeColor_Green_; printf("Using built-in maps\n");
ChangeColor_Purple; printf("B.");
ChangeColor_Green_; printf("Enter the map and its scale on your own\n");
ChangeColor_Whilt_; printf("\033[%d;%dH", 1, 38);//移动光标
do { ChooseTheMode = getchar(); } while (ChooseTheMode != 'A'&&ChooseTheMode != 'B');//持续读取直到读取到A或B
Mode = (_Bool)((int)ChooseTheMode - 65);//利用ASCII码把A和B转为0和1
printf("\033[H");
for (int i = 1; i <= 3; i++)
{
for (int j = 1; j <= 50; j++)
printf(" ");
printf("\n");
}
printf("\033[H");//以上代码清空屏幕
return;
}
void InputTheMap(char M[Max_Size][Max_Size], int width, int height, int lineNeedClean)
{///M是储存地图的二维数组,width与height分别表示地图实际需要的大小,lineNeedClean为需要清理的行数
TheMapInputWrong://如果用户反馈地图并非所需要的,则跳回重新开始
ChangeColor_Whilt_; printf("\033[H");
for (int i = 1; i <= lineNeedClean; i++)
{
for (int j = 1; j <= 50; j++)
printf(" ");
printf("\n");
}
printf("\033[H");
//清空屏幕
TheMapExamedWrong://被检测出有问题就跳到这里
//接下来提示用户应该如何输入地图
ChangeColor_Purple; printf(">");
ChangeColor_Green_; printf("Please read the follows carefully!\n");
ChangeColor_Purple; printf("'*'");
ChangeColor_Green_; printf(" :the enterence\n");
ChangeColor_Purple; printf("'!'");
ChangeColor_Green_; printf(" :the export\n");
ChangeColor_Purple; printf("'#'");
ChangeColor_Green_; printf(" :the wall\n");
ChangeColor_Purple; printf("' '");
ChangeColor_Green_; printf(" :the road\n");
ChangeColor_Purple; printf(">");
ChangeColor_Green_; printf("The size you input is (Width:%d,Height:%d).\n",width,height);
//提示到此为止
//接下来提示用户输入地图并对其进行读取
ChangeColor_Purple; printf("\n>");
ChangeColor_Green_; printf("You should enter as follows' format:\n");
ChangeColor_Yellow;
for (int i = 1; i <= height; i++)
{
for (int j = 1; j <= width; j++)
printf("*");
printf("\n");
}
ChangeColor_Purple; printf(">");
ChangeColor_Green_; printf("Now please input your map:\n");
ChangeColor_Whilt_;
for (int i = 0; i < width*height; i++)
{
scanf("%c", &M[i / width][i%width]);
if (M[i / width][i%width] == '\n') i--;
}//到此读取完了地图
//再次清除屏幕
ChangeColor_Whilt_; printf("\033[H");
for (int i = 1; i <= 75; i++)
{
for (int j = 1; j <= 50; j++)
printf(" ");
printf("\n");
}
printf("\033[H");
//输出确认是否为用户需要的地图
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
printf("%c", M[i][j]);
printf("\n");
}
ChangeColor_Purple; printf(">");
ChangeColor_Green_; printf("Is this the map you need?(Y/N)");
ChangeColor_Whilt_;
char TureOrFalse = ' ';
do { TureOrFalse = getchar(); } while (TureOrFalse != 'Y'&&TureOrFalse != 'N');
if (TureOrFalse == 'N')
{//再次清除屏幕
CleanTheScreen();
goto TheMapInputWrong;
}
//到这里用户已经确认完了地图
//进行地图的“初步审核”(是否符合只有一个入口和出口等)
_Bool TheMapIsAllowed = 1;//如果不符合要求就变为0且让用户重新输入
int Num_Enterence = 0, Num_Export = 0, Num_Space = 0;//记录最外层已标记的出口、入口以及空格、墙体的个数
for (int i=0;i<height;i+=height-1)//只循环第一行和最后一行
for (int j = 0; j < width; j++)
{
if (M[i][j] == '*') Num_Enterence++;
if (M[i][j] == '!') Num_Export++;
if (M[i][j] == ' ') Num_Space++;
}
for (int i=1;i<height-1;i++)//循环中间的height-2行了
for (int j = 0; j < width; j += width - 1)//只循环最两边的列
{
if (M[i][j] == '*') Num_Enterence++;
if (M[i][j] == '!') Num_Export++;
if (M[i][j] == ' ') Num_Space++;
}
if (Num_Space != 0 || Num_Enterence != 1 || Num_Export != 1)
{
TheMapIsAllowed = 0;
goto TheMapWrong;//跳过后续判断操作
}
//到此已经完成了最外层的判断
//接下来看所有符号是否符合要求
int Num_Wall = 0;
Num_Enterence = Num_Export = Num_Space = Num_Wall;//先全部归零
for (int i=0;i<height;i++)
for (int j = 0; j < width; j++)
{
if (M[i][j] == '*')
{
Num_Enterence++;
X_In = j;
Y_In = i;//记录入口的位置
}
if (M[i][j] == '!')
{
Num_Export++;
X_Out = j;
Y_Out = i;//记录出口的位置
}
if (M[i][j] == ' ') Num_Space+
C语言:随机游走-蚂蚁走迷宫
需积分: 0 77 浏览量
更新于2023-11-30
收藏 27.38MB ZIP 举报
基于个人兴趣设计的小程序。
背景:
1.一只蚂蚁被放置于一个迷宫盒子内。
2.盒子很薄以至于蚂蚁只能在二维平面内爬行。
3.蚂蚁无法从入口离开迷宫。
4.蚂蚁没有智力与记忆。
规则:
1.蚂蚁每次移动1格。
2.蚂蚁不能破坏迷宫。
3.出入口均在地图的最外围。
4.最外围除了出入口不会再有其他洞口。
包括但不限于以上所有内容。
目前可以选择程序自带10*10地图或自行输入最大20*20地图两种模式,程序会根据地图进行模拟、输出并统计总共消耗了多少步。但用户自行输入的的迷宫地图不符合规则要求时,将会提示用户输入错误并要求用户重新输入。
地图输入样式:
'*':入口
'!':出口
'#':墙面
' ':道路
青が絶える(青绝悲)
- 粉丝: 622
- 资源: 16
最新资源
- 基于matlab车牌识别,bp和模板匹配法的比较,这一套模板匹配法我给调好了都可以随便添加图片,目前有四十多张,这个是我自己做的,所以可讲解,程序不重要,重要的是讲解不是嘛 bp也就七八张,这个需要
- Java毕设项目:基于spring+mybatis+maven+mysql实现的汽车站车辆运管管理系统【含源码+数据库+毕业论文】
- 基于Matlab simulink的电力电子基础仿真 1.单相半波可控整流电路电阻负载 2. 单相半波可控整流电阻电感负载 3. 单相半波可控整流电路电阻电感负载带续流二极管4. 单相桥式全控整流电路
- 车牌识别matlab 操作简单到手直接用 可识别50多张图片 程序有注释 灰度化二值化定位分割识别等等 包含一份文档 需要的直接拿 保证可以运行 基于matlab的车牌识别,这是先读入图片,在裁剪
- matlab simulink 风电调频,双馈风机,四机两区系统,对风机附加惯性控制,下垂控制,风电渗透率为10%,故障设置为200MW负荷扰动,童叟无欺 用phasor模型,仿真只需要20秒 仿真速
- matlab 智能优化算法 基于自私羊群优化算法求解单目标优化问题
- Java毕设项目:基于spring+mybatis+maven+mysql实现的社区管理系统【含源码+数据库+毕业论文】
- 欧姆龙CP1H-XA40DT-D功能完好,可学习模拟量.通讯.脉冲等,开发机配台达通讯程序
- 电力系统机组调度 考虑了源荷不确定性 求解:matlab+yalmip+gurobi作为求解器) 内容:考虑源荷两侧不确定性的含风电的低碳调度,引入模糊机会约束,程序包括储能、风光、火电机组及水电机组
- Java毕设项目:基于spring+mybatis+maven+mysql实现的体育馆管理系统【含源码+数据库+毕业论文】
- Java毕设项目:基于spring+mybatis+maven+mysql实现的传统文化网站管理系统【含源码+数据库+毕业论文】
- 预弯成型切断机(sw18可编辑+工程图)全套设计资料100%好用.zip
- Java毕设项目:基于spring+mybatis+maven+mysql实现的台球厅管理系统台球管理系统【含源码+数据库+毕业论文】
- Java毕设项目:基于spring+mybatis+maven+mysql实现的培训学校教学管理系统【含源码+数据库+毕业论文】
- LabVIEW基于欧姆龙PLC串口通讯教学,
- 风电场可靠性评估序贯蒙特卡洛 标价即卖价,不议价,不,程序是可以运行的 (非完全复现) 仿真平台:MATLAB 拿后前可以看运行结果,参考文档见图,出不 不 出不 不 联系留邮箱,留邮箱