// canvasFrame.cpp : implementation file
//
#include "stdafx.h"
#include "canvasr.h"
#include "canvasFrame.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
struct list //链表结构用来记录小球走过的路径
{
int m;
int n;
struct list *next;
struct list *back;
};
typedef struct list node;
typedef node *pointer;
/////////////////////////////////////////////////////////////////////////////
// canvasFrame
IMPLEMENT_DYNCREATE(canvasFrame, CFrameWnd)
int maze[8][8] = {1,1,1,1,1,1,1,1,2,0,0,1,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,1,1,0,1,0,1,0,0,1,1,3,1,1,1,1,1,1};
BOOL pass[8][8]; //记录是否走过
int i,j,m,n,lastm,lastn;
BOOL start= true,search= true,go;
pointer ptr,preptr,first;
char str[10];
canvasFrame::canvasFrame()
{
RECT rect;
Create(NULL,"绘图视窗",WS_OVERLAPPEDWINDOW,CRect(0,0,330,380));
CClientDC dc(this);
int width = dc.GetDeviceCaps(HORZRES);
int height = dc.GetDeviceCaps(VERTRES);
GetWindowRect( &rect );
width = ( width - ( rect.right - rect.left ))/2 ;
height = (height - (rect.bottom - rect.top ))/2 ;
MoveWindow( width , height , (rect.right - rect.left ) , (rect.bottom - rect.top ) ,true);
mdc = new CDC;
mdc->CreateCompatibleDC(&dc);
tile = new CBitmap;
ball = new CBitmap;
tile->m_hObject = (HBITMAP)::LoadImage(NULL,"tile.bmp",IMAGE_BITMAP,40,40,LR_LOADFROMFILE);
ball->m_hObject = (HBITMAP)::LoadImage(NULL,"ball.bmp",IMAGE_BITMAP,40,40,LR_LOADFROMFILE);
for(i=0;i<7;i++) //查找入口
{
for(j=0;j<7;j++)
if(maze[i][j]==2)
break;
if(maze[i][j]==2)
break;
}
m = i;
n = j;
ptr = (pointer)malloc(sizeof(node));//建立第一个节点
ptr->m = m;
ptr->n = n;
ptr->next = NULL;
ptr->back = NULL;
first = ptr; //记录第一个节点位置
}
canvasFrame::~canvasFrame()
{
delete tile;
delete ball;
delete mdc;
ptr = first;
while(ptr->next)
{
ptr = ptr->next;
free(ptr->back);
}
free(ptr);
}
BEGIN_MESSAGE_MAP(canvasFrame, CFrameWnd)
//{{AFX_MSG_MAP(canvasFrame)
ON_WM_TIMER()
ON_WM_CREATE()
ON_WM_KEYDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// canvasFrame message handlers
void canvasFrame::OnTimer(UINT nIDEvent)
{
if(start)
Start();
else
{
if(search)
Search();
if(go)
Go();
}
CFrameWnd::OnTimer(nIDEvent);
}
void canvasFrame::Start()
{
CClientDC dc(this);
mdc->SelectObject(tile);
for(i=0;i<=7;i++) //双重循环贴上迷宫的墙,这里墙和小球的大小匀为40*40
for(j=0;j<=7;j++)
if(maze[i][j] == 1)
dc.BitBlt(j*40,i*40,40,40,mdc,0,0,SRCCOPY);
mdc->SelectObject(ball);
dc.BitBlt(ptr->n*40,ptr->m*40,40,40,mdc,0,0,SRCCOPY); //小球在入口处
start = false;
lastn = ptr->n; //记录m,n,以便在下次执行OnTimer函数时可以覆盖前一次贴图
lastm = ptr->m;
}
void canvasFrame::Go()
{
CClientDC dc(this);
m = ptr->m;
n = ptr->n;
mdc->SelectObject(tile);
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
if(maze[i][j] == 1)
dc.BitBlt(j*40,i*40,40,40,mdc,0,0,SRCCOPY);
mdc->SelectObject(ball);
dc.BitBlt(n*40,m*40,40,40,mdc,0,0,SRCCOPY);
if(maze[m][n] == 3)
{
dc.TextOut(120,320,"最短路径");
go = false;
}
else
ptr = ptr->next;
}
void canvasFrame::Search()
{
CClientDC dc(this);
mdc->SelectObject(tile);
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
if(maze[i][j] == 1)
dc.BitBlt(j*40,i*40,40,40,mdc,0,0,SRCCOPY);
mdc->SelectObject(ball);
lastn = ptr->n;
lastm = ptr->m;
if(maze[m+1][n]==1) //下一格是墙
if(maze[m][n+1] == 1)
if(maze[m][n-1] ==1)
if(maze[m-1][n] == 1)
{
if(ptr->back != NULL)
{
ptr = ptr->back;
free(ptr->next);
ptr->next = NULL;
}
m = ptr->m;
n = ptr->n;
}
else
if(pass[m-1][n])
{
if(ptr->back != NULL)
{
ptr = ptr->back;
free(ptr->next);
ptr->next = NULL;
}
m = ptr->m;
n = ptr->n;
}
else
{
m-=1;
ptr->next = (pointer)malloc(sizeof(node));
ptr->next->m = m;
ptr->next->n = n;
preptr = ptr;
ptr->next->next = NULL;
pass[m][n] = true;
ptr = ptr->next;
ptr->back = preptr;
}
else
if(pass[m][n-1]) //下一格走过
if(maze[m-1][n] == 1)
{
if(ptr->back != NULL)
{
ptr = ptr->back;
free(ptr->next);
ptr->next = NULL;
}
m = ptr->m;
n = ptr->n;
}
else
if(pass[m-1][n])
{
if(ptr->back != NULL)
{
ptr = ptr->back;
free(ptr->next);
ptr->next = NULL;
}
m = ptr->m;
n = ptr->n;
}
else
{
m-=1;
ptr->next = (pointer)malloc(sizeof(node));
ptr->next->m = m;
ptr->next->n = n;
preptr = ptr;
ptr->next->next = NULL;
pass[m][n] = true;
ptr = ptr->next;
ptr->back = preptr;
}
else
{
n-=1;
ptr->next = (pointer)malloc(sizeof(node));
ptr->next->m = m;
ptr->next->n = n;
preptr = ptr;
ptr->next->next = NULL;
pass[m][n] = true;
ptr = ptr->next;
ptr->back = preptr;
}
else
if(pass[m][n+1])
if(maze[m][n-1] ==1)
if(maze[m-1][n] == 1)
{
if(ptr->back != NULL)
{
ptr = ptr->back;
free(ptr->next);
ptr->next = NULL;
}
m = ptr->m;
n = ptr->n;
}
else
if(pass[m-1][n])
{
if(ptr->back != NULL)
{
ptr = ptr->back;
free(ptr->next);
ptr->next = NULL;
}
m = ptr->m;
n = ptr->n;
}
else
{
m-=1;
ptr->next = (pointer)malloc(sizeof(node));
ptr->next->m = m;
ptr->next->n = n;
preptr = ptr;
ptr->next->next = NULL;
pass[m][n] = true;
ptr = ptr->next;
ptr->back = preptr;
}
else
if(pass[m][n-1])
if(maze[m-1][n] == 1)
{
if(ptr->back != NULL)
{
ptr = ptr->back;
free(ptr->next);
ptr->next = NULL;
}
m = ptr->m;
n = ptr->n;
}
else
if(pass[m-1][n])
{
if(ptr->back != NULL)
{
ptr = ptr->back;
free(ptr->next);
ptr->next = NULL;
}
m = ptr->m;
n = ptr->n;
}
else
{
m-=1;
ptr->next = (pointer)malloc(sizeof(node));
ptr->next->m = m;
ptr->next->n = n;
preptr = ptr;
ptr->next->next = NULL;
pass[m][n] = true;
ptr = ptr->next;
ptr->back = preptr;
}
else
{
n-=1;
ptr->next = (pointer)malloc(sizeof(node));
ptr->next->m = m;
ptr->next->n = n;
preptr = ptr;
ptr->next->next = NULL;
pass[m][n] = true;
ptr = ptr->next;
ptr->back = preptr;
}
else
{
n+=1;
ptr->next = (pointer)malloc(sizeof(node));
ptr->next->m = m;
ptr->next->n = n;
preptr = ptr;
ptr->next->next = NULL;
pass[m][n] = true;
ptr = ptr->next;
ptr->back = preptr;
}
else
if(pass[m+1][n])
if(maze[m][n+1] == 1)
if(maze[m][n-1] ==1)
if(maze[m-1][n] == 1)
{
if(ptr->back != NULL)
{
ptr = ptr->back;
free(ptr->next);
ptr->next = NULL;
}
m = ptr->m;
n = ptr->n;
}
else
if(pass[m-1][n])
{
if(ptr->back != NULL)
{
ptr = ptr->back;
free(ptr->next);
ptr->next = NULL;
}
m = ptr->m;