📄 34
字号:
/****************************************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 MAZECOOR 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: mapStepEdit
** Descriptions: 制作以目标点为起点的等高图
** input parameters: uiX: 目的地横坐标
** uiY: 目的地纵坐标
** output parameters: GucMapStep[][]: 各坐标上的等高值
** Returned value: 无
*********************************************************************************************************/
void mapStepEdit (int8 cX, int8 cY)
{
uint8 n = 0; /* GmcStack[]下标 */
uint8 ucStep = 1; /* 等高值 */
uint8 ucStat = 0; /* 统计可前进的方向数 */
uint8 i,j;
GmcStack[n].cX = cX; /* 起点X值入栈 */
GmcStack[n].cY = cY; /* 起点Y值入栈 */
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;
ucStep = GucMapStep[cX][cY];
} else {
if (ucStat > 1) { /* 有多个可前进方向,保存坐标 */
GmcStack[n].cX = cX; /* 横坐标X值入栈 */
GmcStack[n].cY = cY; /* 纵坐标Y值入栈 */
n++;
}
/*
* 任意选择一条可前进的方向前进
*/
if ((GucMapBlock[cX][cY] & 0x01) && /* 上方有路 */
(GucMapStep[cX][cY + 1] > (ucStep))) { /* 上方等高值大于计划设定值 */
cY++; /* 修改坐标 */
continue;
}
if ((GucMapBlock[cX][cY] & 0x02) && /* 右方有路 */
(GucMapStep[cX + 1][cY] > (ucStep))) { /* 右方等高值大于计划设定值 */
cX++; /* 修改坐标 */
continue;
}
if ((GucMapBlock[cX][cY] & 0x04) && /* 下方有路 */
(GucMapStep[cX][cY - 1] > (ucStep))) { /* 下方等高值大于计划设定值 */
cY--; /* 修改坐标 */
continue;
}
if ((GucMapBlock[cX][cY] & 0x08) && /* 左方有路 */
(GucMapStep[cX - 1][cY] > (ucStep))) { /* 左方等高值大于计划设定值 */
cX--; /* 修改坐标 */
continue;
}
}
}
}
/*********************************************************************************************************
** Function name: mouseSpurt
** Descriptions: 电脑鼠从起点以最短路径跑向终点
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void mouseSpurt (void)
{
uint8 ucTemp = 0xff;
int8 cXdst = 0,cYdst = 0;
/*
* 对终点的四个坐标分别制作等高图
* 取离起点最近的一个点作为目标点
*/
if (GucMapBlock[GucXGoal0][GucYGoal0] & 0x0c) { /* 判断该终点坐标是否有出口 */
mapStepEdit(GucXGoal0,GucYGoal0); /* 制作等高图 */
if (ucTemp > GucMapStep[GucXStart][GucYStart]) { /* 保存离起点最近的坐标 */
cXdst = GucXGoal0;
cYdst = GucYGoal0;
ucTemp = GucMapStep[GucXStart][GucYStart];
}
}
if (GucMapBlock[GucXGoal0][GucYGoal1] & 0x09) { /* 判断该终点坐标是否有出口 */
mapStepEdit(GucXGoal0,GucYGoal1); /* 制作等高图 */
if (ucTemp > GucMapStep[GucXStart][GucYStart]) { /* 保存离起点最近的坐标 */
cXdst = GucXGoal0;
cYdst = GucYGoal1;
ucTemp = GucMapStep[GucXStart][GucYStart];
}
}
if (GucMapBlock[GucXGoal1][GucYGoal0] & 0x06) { /* 判断该终点坐标是否有出口 */
mapStepEdit(GucXGoal1,GucYGoal0); /* 制作等高图 */
if (ucTemp > GucMapStep[GucXStart][GucYStart]) { /* 保存离起点最近的坐标 */
cXdst = GucXGoal1;
cYdst = GucYGoal0;
ucTemp = GucMapStep[GucXStart][GucYStart];
}
}
if (GucMapBlock[GucXGoal1][GucYGoal1] & 0x03) { /* 判断该终点坐标是否有出口 */
mapStepEdit(GucXGoal1,GucYGoal1); /* 制作等高图 */
if (ucTemp > GucMapStep[GucXStart][GucYStart]) { /* 保存离起点最近的坐标 */
cXdst = GucXGoal1;
cYdst = GucYGoal1;
ucTemp = GucMapStep[GucXStart][GucYStart];
}
}
objectGoTo(cXdst,cYdst); /* 运行到指定目标点 */
}
/*********************************************************************************************************
** Function name: objectGoTo
** Descriptions: 使电脑鼠运动到指定坐标
** input parameters: cXdst: 目的地的横坐标
** cYdst: 目的地的纵坐标
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void objectGoTo (int8 cXdst, int8 cYdst)
{
uint8 ucStep = 1;
int8 cNBlock = 0, cDirTemp;
int8 cX,cY;
cX = GmcMouse.cX;
cY = GmcMouse.cY;
mapStepEdit(cXdst,cYdst); /* 制作等高图 */
/*
* 根据等高值向目标点运动,直到达到目的地
*/
while ((cX != cXdst) || (cY != cYdst)) {
ucStep = GucMapStep[cX][cY];
/*
* 任选一个等高值比当前自身等高值小的方向前进
*/
if ((GucMapBlock[cX][cY] & 0x01) && /* 上方有路 */
(GucMapStep[cX][cY + 1] < ucStep)) { /* 上方等高值较小 */
cDirTemp = UP; /* 记录方向 */
if (cDirTemp == GucMouseDir) { /* 优先选择不需要转弯的方向 */
cNBlock++; /* 前进一个方格 */
cY++;
continue; /* 跳过本次循环 */
}
}
if ((GucMapBlock[cX][cY] & 0x02) && /* 右方有路 */
(GucMapStep[cX + 1][cY] < ucStep)) { /* 右方等高值较小 */
cDirTemp = RIGHT; /* 记录方向 */
if (cDirTemp == GucMouseDir) { /* 优先选择不需要转弯的方向 */
cNBlock++; /* 前进一个方格 */
cX++;
continue; /* 跳过本次循环 */
}
}
if ((GucMapBlock[cX][cY] & 0x04) && /* 下方有路 */
(GucMapStep[cX][cY - 1] < ucStep)) { /* 下方等高值较小 */
cDirTemp = DOWN; /* 记录方向 */
if (cDirTemp == GucMouseDir) { /* 优先选择不需要转弯的方向 */
cNBlock++; /* 前进一个方格 */
cY--;
continue; /* 跳过本次循环 */
}
}
if ((GucMapBlock[cX][cY] & 0x08) && /* 左方有路 */
(GucMapStep[cX - 1][cY] < ucStep)) { /* 左方等高值较小 */
cDirTemp = LEFT; /* 记录方向 */
if (cDirTemp == GucMouseDir) { /* 优先选择不需要转弯的方向 */
cNBlock++; /* 前进一个方格 */
cX--;
continue; /* 跳过本次循环 */
}
}
cDirTemp = (cDirTemp + 4 - GucMouseDir)%4; /* 计算方向偏移量 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -