📄 maze.c
字号:
/****************************************Copyright (c)****************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File Name: maze.c
** Last modified Date: 2007/09/24
** Last Version: V1.0
** Description: 根据底层程序取得的迷宫信息,经过该智能算法控制电脑鼠的下一状态,并送往底层驱动程
** 序执行。
**
**--------------------------------------------------------------------------------------------------------
** Created By: Liao Maogang
** Created date: 2007/09/08
** Version: V1.0
** Descriptions:
**
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
*********************************************************************************************************/
/*********************************************************************************************************
包含头文件
*********************************************************************************************************/
#include "Maze.h"
/*********************************************************************************************************
全局变量定义
*********************************************************************************************************/
static uint8 GucXStart = 0; /* 起点横坐标 */
static uint8 GucYStart = 0; /* 起点纵坐标 */
static uint8 GucXGoal0 = XDST0; /* 终点X坐标,有两个值 */
static uint8 GucXGoal1 = XDST1;
static uint8 GucYGoal0 = YDST0; /* 终点Y坐标,有两个值 */
static uint8 GucYGoal1 = YDST1;
static uint8 GucMouseTask = WAIT; /* 状态机,初始状态为等待 */
static uint8 GucMapStep[MAZETYPE][MAZETYPE] = {0xff}; /* 保存各坐标的等高值 */
static MAZECOOR1 GmcStack[MAZETYPE * MAZETYPE] = {0}; /* 在mapStepEdit()中作堆栈使用 */
static MAZECOOR GmcCrossway[MAZETYPE * MAZETYPE] = {0}; /* Main()中暂存未走过支路坐标 */
/*********************************************************************************************************
** Function name: Delay
** Descriptions: 延时函数
** input parameters: uiD :延时参数,值越大,延时越久
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void delay (uint32 uiD)
{
for (; uiD; uiD--);
}
/*********************************************************************************************************
** Function name: mapStepEdit1
** Descriptions: 制作以目标点为起点的等高图
** input parameters: uiX: 目的地横坐标
** uiY: 目的地纵坐标
** output parameters: GucMapStep[][]: 各坐标上的等高值
** Returned value: 无
*********************************************************************************************************/
void mapStepEdit1 (int8 cX, int8 cY, uint8 dir_open)
{
uint8 n = 0; /* GmcStack[]下标 */
uint8 ucStep = 1; /* 等高值 */
uint8 ucStat = 0; /* 统计可前进的方向数 */
static uint8 dir_his;
dir_his =dir_open;
uint8 i,j;
GmcStack[n].cX = cX; /* 起点X值入栈 */
GmcStack[n].cY = cY; /* 起点Y值入栈 */
GmcStack[n].dir = dir_his;
n++;
/*
* 初始化各坐标等高值
*/
for (i = 0; i < MAZETYPE; i++) {
for (j = 0; j < MAZETYPE; j++) {
GucMapStep[i][j] = 0xff;
}
}
/*
* 制作等高图,直到堆栈中所有数据处理完毕
*/
while (n) {
GucMapStep[cX][cY] = ucStep++; /* 填入等高值 */
/*
* 对当前坐标格里可前进的方向统计
*/
ucStat = 0;
if ((GucMapBlock[cX][cY] & 0x01) && /* 前方有路 */
(GucMapStep[cX][cY + 1] > (ucStep))) { /* 前方等高值大于计划设定值 */
ucStat++; /* 可前进方向数加1 */
}
if ((GucMapBlock[cX][cY] & 0x02) && /* 右方有路 */
(GucMapStep[cX + 1][cY] > (ucStep))) { /* 右方等高值大于计划设定值 */
ucStat++; /* 可前进方向数加1 */
}
if ((GucMapBlock[cX][cY] & 0x04) &&
(GucMapStep[cX][cY - 1] > (ucStep))) {
ucStat++; /* 可前进方向数加1 */
}
if ((GucMapBlock[cX][cY] & 0x08) &&
(GucMapStep[cX - 1][cY] > (ucStep))) {
ucStat++; /* 可前进方向数加1 */
}
/*
* 没有可前进的方向,则跳转到最近保存的分支点
* 否则任选一可前进方向前进
*/
if (ucStat == 0) {
n--;
cX = GmcStack[n].cX;
cY = GmcStack[n].cY;
dir_his=GmcStack[n].dir;
ucStep = GucMapStep[cX][cY];
} else {
if (ucStat > 1) { /* 有多个可前进方向,保存坐标 */
GmcStack[n].cX = cX; /* 横坐标X值入栈 */
GmcStack[n].cY = cY; /* 纵坐标Y值入栈 */
GmcStack[n].dir=dir_his;
n++;
}
/*
* 任意选择一条可前进的方向前进
*/
if ((GucMapBlock[cX][cY] & 0x01) && /* 上方有路 */
(GucMapStep[cX][cY + 1] > (ucStep))) { /* 上方等高值大于计划设定值 */
cY++; /* 修改坐标 */
if(dir_his!=0x01)
{dir_his=0x01;GucMapStep[cX][cY]+=2;}
else continue;
}
if ((GucMapBlock[cX][cY] & 0x02) && /* 右方有路 */
(GucMapStep[cX + 1][cY] > (ucStep))) { /* 右方等高值大于计划设定值 */
cX++; /* 修改坐标 */
if(dir_his!=0x02)
{dir_his=0x02;GucMapStep[cX][cY]+=2;}
else continue;
}
if ((GucMapBlock[cX][cY] & 0x04) && /* 下方有路 */
(GucMapStep[cX][cY - 1] > (ucStep))) { /* 下方等高值大于计划设定值 */
cY--; /* 修改坐标 */
if(dir_his!=0x04)
{dir_his=0x04;GucMapStep[cX][cY]+=2;}
else continue;
}
if ((GucMapBlock[cX][cY] & 0x08) && /* 左方有路 */
(GucMapStep[cX - 1][cY] > (ucStep))) { /* 左方等高值大于计划设定值 */
cX--; /* 修改坐标 */
if(dir_his!=0x08)
{dir_his=0x08;GucMapStep[cX][cY]+=2;}
else continue;
}
}
}
}
/*********************************************************************************************************
** Function name: mouseSpurt
** Descriptions: 电脑鼠从起点以最短路径跑向终点
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void mouseSpurt (void)
{
uint8 ucTemp = 0xff;
int8 cXdst = 0,cYdst = 0;
uint8 dir_open;
/*
* 对终点的四个坐标分别制作等高图
* 取离起点最近的一个点作为目标点
*/
if (GucMapBlock[GucXGoal0][GucYGoal0] & 0x0c) { /* 判断该终点坐标是否有出口 */
if(GucMapBlock[GucXGoal0][GucYGoal0]&0x04!=0)dir_open=0x04;
else dir_open=0x08;
mapStepEdit1(GucXGoal0,GucYGoal0,dir_open); /* 制作等高图 */
if (ucTemp > GucMapStep[GucXStart][GucYStart]) { /* 保存离起点最近的坐标 */
cXdst = GucXGoal0;
cYdst = GucYGoal0;
ucTemp = GucMapStep[GucXStart][GucYStart];
}
}
if (GucMapBlock[GucXGoal0][GucYGoal1] & 0x09) { /* 判断该终点坐标是否有出口 */
if(GucMapBlock[GucXGoal0][GucYGoal1]&0x01!=0)dir_open=0x01;
else dir_open=0x08;
mapStepEdit1(GucXGoal0,GucYGoal1,dir_open); /* 制作等高图 */
if (ucTemp > GucMapStep[GucXStart][GucYStart]) { /* 保存离起点最近的坐标 */
cXdst = GucXGoal0;
cYdst = GucYGoal1;
ucTemp = GucMapStep[GucXStart][GucYStart];
}
}
if (GucMapBlock[GucXGoal1][GucYGoal0] & 0x06) { /* 判断该终点坐标是否有出口 */
if(GucMapBlock[GucXGoal1][GucYGoal0]&0x04!=0)dir_open=0x04;
else dir_open=0x02;
mapStepEdit1(GucXGoal1,GucYGoal0,dir_open); /* 制作等高图 */
if (ucTemp > GucMapStep[GucXStart][GucYStart]) { /* 保存离起点最近的坐标 */
cXdst = GucXGoal1;
cYdst = GucYGoal0;
ucTemp = GucMapStep[GucXStart][GucYStart];
}
}
if (GucMapBlock[GucXGoal1][GucYGoal1] & 0x03) { /* 判断该终点坐标是否有出口 */
if(GucMapBlock[GucXGoal0][GucYGoal0]&0x01!=0)dir_open=0x01;
else dir_open=0x02;
mapStepEdit1(GucXGoal1,GucYGoal1,dir_open); /* 制作等高图 */
if (ucTemp > GucMapStep[GucXStart][GucYStart]) { /* 保存离起点最近的坐标 */
cXdst = GucXGoal1;
cYdst = GucYGoal1;
ucTemp = GucMapStep[GucXStart][GucYStart];
}
}
objectGoTo1(cXdst,cYdst,dir_open); /* 运行到指定目标点 */
}
/*********************************************************************************************************
** Function name: objectGoTo1
** Descriptions: 使电脑鼠运动到指定坐标
** input parameters: cXdst: 目的地的横坐标
** cYdst: 目的地的纵坐标
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void objectGoTo1 (int8 cXdst, int8 cYdst,uint8 dir_open)
{
uint8 ucStep = 1;
int8 cNBlock = 0, cDirTemp;
int8 cX,cY;
cX = GmcMouse.cX;
cY = GmcMouse.cY;
mapStepEdit1(cXdst,cYdst,dir_open); /* 制作等高图 */
/*
* 根据等高值向目标点运动,直到达到目的地
*/
while ((cX != cXdst) || (cY != cYdst)) {
ucStep = GucMapStep[cX][cY];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -