/****************************************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()中暂存未走过支路坐标 */
static MAZECOOR GmcNear;
uint8 FirstDir = 0xFF; //定义第一次进入所设3X3区域时的方向
//static uint8 ChangeMethod =0x00; //定义是否改变根据第一次进入所设区
//域选择的搜寻方法
static uint8 SEARCHMETHOD = CENTRALMETHOD;
/*********************************************************************************************************
** Function name: Delay
** Descriptions: 延时函数
** input parameters: uiD :延时参数,值越大,延时越久
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void delay (uint32 uiD)
{
for (; uiD; uiD--);
}
void delay_test(uint8 m)
{for(;m;m--) delay(1000000);
}
/*********************************************************************************************************
** 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;
uint8 flag = 1;
uint8 tempucStep=ucStep; //存储暂定等高值
// ucStepleft=ucStep+2,
// ucStepright=ucStep+2;
uint8 TempDir= GucMouseDir;//存储当前方向
// uint8 comDir; ///相对方向
// uint8 tempcX=cX;
// tempcY=cY; // Tempdir= GucMouseDir; //存储上一个方向
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) {
// if( TempDir==Tempdir ){
GucMapStep[cX][cY ]= ucStep;
tempucStep=ucStep+2;
// } /* 填入等高值 */
// else GucMapStep[cX][cY] = ucStep+2;
/*
* 对当前坐标格里可前进的方向统计
*/
ucStat = 0;
if ((GucMapBlock[cX][cY] & 0x01) && /* 前方有路 */
(GucMapStep[cX][cY + 1] > (tempucStep))) { /* 前方等高值大于计划设定值 */
ucStat++; /* 可前进方向数加1 */
}
if ((GucMapBlock[cX][cY] & 0x02) && /* 右方有路 */
(GucMapStep[cX + 1][cY] > (tempucStep))) { /* 右方等高值大于计划设定值 */
ucStat++; /* 可前进方向数加1 */
}
if ((GucMapBlock[cX][cY] & 0x04) &&
(GucMapStep[cX][cY - 1] > (tempucStep))) {
ucStat++; /* 可前进方向数加1 */
}
if ((GucMapBlock[cX][cY] & 0x08) &&
(GucMapStep[cX - 1][cY] > (tempucStep))) {
ucStat++; /* 可前进方向数加1 */
}
/*
* 没有可前进的方向,则跳转到最近保存的分支点
* 否则任选一可前进方向前进
*/
if (ucStat == 0) {
n--;
cX = GmcStack[n].cX;
cY = GmcStack[n].cY;
ucStep = GucMapStep[cX][cY];
/* zlg7289Download(1,0,0,cX);
zlg7289Download(1,1,0,cY);
zlg7289Download(1,4,0,n);
delay_test(40);*/
} else {
if (ucStat > 1) { /* 有多个可前进方向,保存坐标 */
GmcStack[n].cX = cX; /* 横坐标X值入栈 */
GmcStack[n].cY = cY; /* 纵坐标Y值入栈 */
n++;
}
/*
* 任意选择一条