zoukankan      html  css  js  c++  java
  • SkipOut游戏实现代码

    头文件:
    GameSet.h
    Lose.h
    NumSkipDoc.h
    NumSkipView.h
    SkipOut.h
    Win.h
    源文件:
    GameSet.cpp
    Lose.cpp
    NumSkipDoc.cpp
    NumSkipView.cpp
    SkipOut.cpp
    Win.cpp
    代码:
    GameSet.h
    #pragma once
    
    
    // GameSet 对话框
    
    class GameSet : public CDialog
    {
    	DECLARE_DYNAMIC(GameSet)
    
    public:
    	GameSet(CWnd* pParent = NULL);   // 标准构造函数
    	virtual ~GameSet();
    
    // 对话框数据
    	enum { IDD = IDD_GAMESET };
    
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
    
    	DECLARE_MESSAGE_MAP()
    public:
    	afx_msg void OnBnClickedLeveal1();       //声明各单选按钮消息函数
    	afx_msg void OnBnClickedLeveal2();
    	afx_msg void OnBnClickedLeveal3();
    	afx_msg void OnBnClickedLeveal4();
    	afx_msg void OnBnClickedLeveal5();
    	afx_msg void OnBnClickedLeveal6();
    	afx_msg void OnBnClickedLeveal7();
    	afx_msg void OnBnClickedModel1();
    	afx_msg void OnBnClickedModel2();
    	int m_radio_leveal;
    	int m_radio_modol;
    	afx_msg void OnBnClickedOk();
    	afx_msg void OnBnClickedCancel();
    	afx_msg void OnBnClickedShowPath();
    	afx_msg void OnBnClickedHidePath();
    	BOOL m_Show;
    	afx_msg void OnBnClickedYellow();
    	afx_msg void OnBnClickedGreen();
    	
    };
    //**********************
    GameSet.cpp
    // GameSet.cpp : 实现文件
    //
    
    #include "stdafx.h"
    #include "NumSkip.h"
    #include "GameSet.h"
    #include "afxdialogex.h"
    
    
    // GameSet 对话框
    
    IMPLEMENT_DYNAMIC(GameSet, CDialog)
    
    GameSet::GameSet(CWnd* pParent /*=NULL*/)
    	: CDialog(GameSet::IDD, pParent)
    {
    	m_Show=FALSE;
    	m_radio_leveal = 0;
    	m_radio_modol = 0;
    	
    }
    
    GameSet::~GameSet()
    {
    }
    
    void GameSet::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//  DDX_Control(pDX, IDC_LEVEAL1, m_radio_leveal);      //将成员变量与ID对应
    	//  DDX_Control(pDX, IDC_MODEL1, m_radio_modol);
    	DDX_Radio(pDX, IDC_LEVEAL1, m_radio_leveal);
    	DDV_MinMaxInt(pDX, m_radio_leveal, 0, 6);
    	DDX_Radio(pDX, IDC_MODEL1, m_radio_modol);
    	DDV_MinMaxInt(pDX, m_radio_modol, 0, 1);
    	DDX_Radio(pDX, IDC_SHOW_PATH, m_Show);
    	
    }
    
    
    BEGIN_MESSAGE_MAP(GameSet, CDialog)                     //各消息函数与各ID相映射
    	ON_BN_CLICKED(IDC_LEVEAL1, &GameSet::OnBnClickedLeveal1)
    	ON_BN_CLICKED(IDC_LEVEAL2, &GameSet::OnBnClickedLeveal2)
    	ON_BN_CLICKED(IDC_LEVEAL3, &GameSet::OnBnClickedLeveal3)
    	ON_BN_CLICKED(IDC_LEVEAL4, &GameSet::OnBnClickedLeveal4)
    	ON_BN_CLICKED(IDC_LEVEAL5, &GameSet::OnBnClickedLeveal5)
    	ON_BN_CLICKED(IDC_LEVEAL6, &GameSet::OnBnClickedLeveal6)
    	ON_BN_CLICKED(IDC_LEVEAL7, &GameSet::OnBnClickedLeveal7)
    	ON_BN_CLICKED(IDC_MODEL1, &GameSet::OnBnClickedModel1)
    	ON_BN_CLICKED(IDC_MODEL2, &GameSet::OnBnClickedModel2)
    	ON_BN_CLICKED(IDC_SHOW_PATH, &GameSet::OnBnClickedShowPath)
    	ON_BN_CLICKED(IDC_HIDE_PATH, &GameSet::OnBnClickedHidePath)
    	ON_BN_CLICKED(IDC_YELLOW, &GameSet::OnBnClickedYellow)
    	ON_BN_CLICKED(IDC_GREEN, &GameSet::OnBnClickedGreen)
    	
    END_MESSAGE_MAP()
    // GameSet 消息处理程序
    void GameSet::OnBnClickedLeveal1()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	m_radio_leveal=0;
    }
    void GameSet::OnBnClickedLeveal2()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	m_radio_leveal=1;
    }
    void GameSet::OnBnClickedLeveal3()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	m_radio_leveal=2;
    }
    void GameSet::OnBnClickedLeveal4()
    {
    	// TODO: 在此添加控件通知处理程序代码
        m_radio_leveal=3;
    }
    void GameSet::OnBnClickedLeveal5()
    {
    	// TODO: 在此添加控件通知处理程序代码
        m_radio_leveal=4;
    }
    void GameSet::OnBnClickedLeveal6()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	m_radio_leveal=5;
    }
    void GameSet::OnBnClickedLeveal7()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	m_radio_leveal=6;
    }
    void GameSet::OnBnClickedModel1()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	m_radio_modol=0;
    }
    void GameSet::OnBnClickedModel2()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	m_radio_modol=1;
    }
    
    
    
    void GameSet::OnBnClickedShowPath()
    {
    	// TODO: 在此添加控件通知处理程序代码
    }
    
    
    void GameSet::OnBnClickedHidePath()
    {
    	// TODO: 在此添加控件通知处理程序代码
    }
    
    
    void GameSet::OnBnClickedYellow()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	
    }
    
    
    void GameSet::OnBnClickedGreen()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	
    }
    //*******************
    Lose.h
    #pragma once
    
    
    // Lose 对话框
    
    class Lose : public CDialog
    {
    	DECLARE_DYNAMIC(Lose)
    
    public:
    	Lose(CWnd* pParent = NULL);   // 标准构造函数
    	virtual ~Lose();
    
    // 对话框数据
    	enum { IDD = IDD_LOSE };
    
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
    
    	DECLARE_MESSAGE_MAP()
    public:
    	afx_msg void OnBnClickedAgain();
    	afx_msg void OnBnClickedBack1();
    };
    //*******************
    Lose.cpp
    // Lose.cpp : 实现文件
    //
    
    #include "stdafx.h"
    #include "NumSkip.h"
    #include "Lose.h"
    #include "afxdialogex.h"
    
    
    // Lose 对话框
    
    IMPLEMENT_DYNAMIC(Lose, CDialog)
    
    Lose::Lose(CWnd* pParent /*=NULL*/)
    	: CDialog(Lose::IDD, pParent)
    {
    
    }
    
    Lose::~Lose()
    {
    }
    
    void Lose::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
    
    
    BEGIN_MESSAGE_MAP(Lose, CDialog)
    	ON_BN_CLICKED(IDC_AGAIN, &Lose::OnBnClickedAgain)
    	ON_BN_CLICKED(IDC_BACK1, &Lose::OnBnClickedBack1)
    END_MESSAGE_MAP()
    
    
    // Lose 消息处理程序
    
    
    void Lose::OnBnClickedAgain()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	EndDialog(IDC_AGAIN);
    }
    
    
    void Lose::OnBnClickedBack1()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	EndDialog(IDC_BACK1);
    }
    //*****************
    NumSkipDoc.h
    
    // NumSkipDoc.h : CNumSkipDoc 类的接口
    //
    
    
    #pragma once
    #include"GameSet.h"
    #include"SkipOut.h"
    #include"Win.h"
    #include"Lose.h"
    class CNumSkipDoc : public CDocument
    {
    protected: // 仅从序列化创建
    	CNumSkipDoc();
    	DECLARE_DYNCREATE(CNumSkipDoc)
    
    // 特性
    public:
    
    // 操作
    public:
    	int xx;        //屏幕宽度
    	int yy;         //屏幕高度
    	int segment;     //每个方格的长度
    	int OverTag;    //结束标志
    	int order;
    	int CurrentPositionX; //当前位置的横坐标
    	int CurrentPositionY;//当前位置的纵坐标
    	int PrePositionX;    //上一位置的横坐标
    	int PrePositionY;    //上一位置的纵坐标
    	int Path_Long;       //规定矩阵路径长度
    	GameSet GS;         //定义对菜单话框
    	Win  W;            //定义赢对话框
    	Lose L;           //定义输对话框
    	SkipOut So;       //矩阵对象
     // 重写
    public:
    	virtual BOOL OnNewDocument();
    	virtual void Serialize(CArchive& ar);
    #ifdef SHARED_HANDLERS
    	virtual void InitializeSearchContent();
    	virtual void OnDrawThumbnail(CDC& dc, LPRECT lprcBounds);
    #endif // SHARED_HANDLERS
    
    // 实现
    public:
    	virtual ~CNumSkipDoc();
    #ifdef _DEBUG
    	virtual void AssertValid() const;
    	virtual void Dump(CDumpContext& dc) const;
    #endif
    
    protected:
    
    // 生成的消息映射函数
    protected:
    	DECLARE_MESSAGE_MAP()
    
    #ifdef SHARED_HANDLERS
    	// 用于为搜索处理程序设置搜索内容的 Helper 函数
    	void SetSearchContent(const CString& value);
    #endif // SHARED_HANDLERS
    public:
    	virtual void SetTitle(LPCTSTR lpszTitle);
    };
    //******************
    NumSkipDoc.cpp
    
    // NumSkipDoc.cpp : CNumSkipDoc 类的实现
    //
    
    #include "stdafx.h"
    // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
    // ATL 项目中进行定义,并允许与该项目共享文档代码。
    #ifndef SHARED_HANDLERS
    #include "NumSkip.h"
    #endif
    #include"GameSet.h"
    #include "NumSkipDoc.h"
    #include"SkipOut.h"
    #include <propkey.h>
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    // CNumSkipDoc
    
    IMPLEMENT_DYNCREATE(CNumSkipDoc, CDocument)
    
    BEGIN_MESSAGE_MAP(CNumSkipDoc, CDocument)
    END_MESSAGE_MAP()
    
    
    // CNumSkipDoc 构造/析构
    
    CNumSkipDoc::CNumSkipDoc()
    {
    	// TODO: 在此添加一次性构造代码
        order=7;
    	OverTag=0;          //未结束
    	xx=GetSystemMetrics(SM_CXSCREEN);
    	yy=GetSystemMetrics(SM_CYSCREEN);
    	Path_Long=order-3;    //矩阵的路径长度
    	So.row=order-2;        //矩阵的行数
    	So.column=order-2;    //矩阵的列数
    	while(1)                         //随机选出矩阵中数字不超过9的矩阵
    	{
            So.Input(Path_Long);
    		for(int i=0;i!=order-2;i++)
    		{
    		    for(int j=0;j!=order-2;j++)
    		    {
    			   if(So.matrix[i][j]->elem>9)
    			   {
    					continue;
    			   }
    			}
    		}
    		if(GS.m_radio_modol==1)     //单路径模式
    		{
    			int ShortPath;    //矩阵中最短的路径
    			int CenterX;     //矩阵起点横坐标
    			int CenterY;    //矩阵起点纵坐标
    			CenterX=So.row/2;
    			CenterY=So.column/2;
    			So.Check(CenterX,CenterY,ShortPath);
    			So.SinglePath(Path_Long);    //
    		}
    		break;
    	}
    	CurrentPositionX=order/2;//起点位置,刚开始为中心
    	CurrentPositionY=order/2;   
    	PrePositionX=0;       //上一位置横坐标,刚开始为0
    	PrePositionY=0;        //上一位置纵坐标
    	segment=(yy-95)/order;
    }
    
    CNumSkipDoc::~CNumSkipDoc()
    {
    }
    
    BOOL CNumSkipDoc::OnNewDocument()
    {
    	if (!CDocument::OnNewDocument())
    		return FALSE;
    
    	// TODO: 在此添加重新初始化代码
    	// (SDI 文档将重用该文档)
    
    	return TRUE;
    }
    
    
    
    
    // CNumSkipDoc 序列化
    
    void CNumSkipDoc::Serialize(CArchive& ar)
    {
    	if (ar.IsStoring())
    	{
    		// TODO: 在此添加存储代码
    	}
    	else
    	{
    		// TODO: 在此添加加载代码
    	}
    }
    
    #ifdef SHARED_HANDLERS
    
    // 缩略图的支持
    void CNumSkipDoc::OnDrawThumbnail(CDC& dc, LPRECT lprcBounds)
    {
    	// 修改此代码以绘制文档数据
    	dc.FillSolidRect(lprcBounds, RGB(255, 255, 255));
    
    	CString strText = _T("TODO: implement thumbnail drawing here");
    	LOGFONT lf;
    
    	CFont* pDefaultGUIFont = CFont::FromHandle((HFONT) GetStockObject(DEFAULT_GUI_FONT));
    	pDefaultGUIFont->GetLogFont(&lf);
    	lf.lfHeight = 36;
    
    	CFont fontDraw;
    	fontDraw.CreateFontIndirect(&lf);
    
    	CFont* pOldFont = dc.SelectObject(&fontDraw);
    	dc.DrawText(strText, lprcBounds, DT_CENTER | DT_WORDBREAK);
    	dc.SelectObject(pOldFont);
    }
    
    // 搜索处理程序的支持
    void CNumSkipDoc::InitializeSearchContent()
    {
    	CString strSearchContent;
    	// 从文档数据设置搜索内容。
    	// 内容部分应由“;”分隔
    
    	// 例如:  strSearchContent = _T("point;rectangle;circle;ole object;");
    	SetSearchContent(strSearchContent);
    }
    
    void CNumSkipDoc::SetSearchContent(const CString& value)
    {
    	if (value.IsEmpty())
    	{
    		RemoveChunk(PKEY_Search_Contents.fmtid, PKEY_Search_Contents.pid);
    	}
    	else
    	{
    		CMFCFilterChunkValueImpl *pChunk = NULL;
    		ATLTRY(pChunk = new CMFCFilterChunkValueImpl);
    		if (pChunk != NULL)
    		{
    			pChunk->SetTextValue(PKEY_Search_Contents, value, CHUNK_TEXT);
    			SetChunkValue(pChunk);
    		}
    	}
    }
    
    #endif // SHARED_HANDLERS
    
    // CNumSkipDoc 诊断
    
    #ifdef _DEBUG
    void CNumSkipDoc::AssertValid() const
    {
    	CDocument::AssertValid();
    }
    
    void CNumSkipDoc::Dump(CDumpContext& dc) const
    {
    	CDocument::Dump(dc);
    }
    #endif //_DEBUG
    
    
    // CNumSkipDoc 命令
    
    
    void CNumSkipDoc::SetTitle(LPCTSTR lpszTitle)
    {
    	// TODO: 在此添加专用代码和/或调用基类
    
    	CDocument::SetTitle(_T("跳格子"));
    }
    //***********************
    NumSkipView.h
    // NumSkipView.h : CNumSkipView 类的接口
    //
    
    #pragma once
    #include"vector"
    typedef struct Position{
    int x;        //位置横坐标
    int y;        //位置纵坐标
    int elem;     //位置元素
    };
    class CNumSkipView : public CView
    {
    protected: // 仅从序列化创建
    	CNumSkipView();
    	DECLARE_DYNCREATE(CNumSkipView)
    
    // 特性
    public:
    	CNumSkipDoc* GetDocument() const;
    
    // 操作
    public:
    	int Green;       //绿色
    	int White;        //白色
    	int Yellow;        //黄色
    	int Red;         //红色
    	int Black;        //黑色
    	int NowColor;     //当前点的颜色
    	int BackroundColor; //背景颜色
    	vector<Position> p;
    	vector<node2> pp; //标记
    	
    // 重写
    public:
    	virtual void OnDraw(CDC* pDC);  // 重写以绘制该视图
    	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    protected:
    	virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
    	virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
    	virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
    
    // 实现
    public:
    	virtual ~CNumSkipView();
    #ifdef _DEBUG
    	virtual void AssertValid() const;
    	virtual void Dump(CDumpContext& dc) const;
    #endif
    
    protected:
    
    // 生成的消息映射函数
    protected:
    	afx_msg void OnFilePrintPreview();
    	afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
    	afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
    	DECLARE_MESSAGE_MAP()
    public:
    	afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
    	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    	afx_msg void OnNewGame();
    	afx_msg void OnChoose();
    	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    	afx_msg void OnExit();
    	afx_msg void OnBack();
    	afx_msg void OnRepeat();
    	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    	afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
    };
    
    #ifndef _DEBUG  // NumSkipView.cpp 中的调试版本
    inline CNumSkipDoc* CNumSkipView::GetDocument() const
       { return reinterpret_cast<CNumSkipDoc*>(m_pDocument); }
    #endif
    //********************
    NumSkipView.cpp
    
    // NumSkipView.cpp : CNumSkipView 类的实现
    //
    
    #include "stdafx.h"
    // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
    // ATL 项目中进行定义,并允许与该项目共享文档代码。
    #ifndef SHARED_HANDLERS
    #include "NumSkip.h"
    #endif
    
    #include "NumSkipDoc.h"
    #include "NumSkipView.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    
    // CNumSkipView
    
    IMPLEMENT_DYNCREATE(CNumSkipView, CView)
    
    BEGIN_MESSAGE_MAP(CNumSkipView, CView)
    	// 标准打印命令
    	ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
    	ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
    	ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CNumSkipView::OnFilePrintPreview)
    	ON_COMMAND(ID_GAME_NEW, &CNumSkipView::OnNewGame)
    	ON_COMMAND(ID_CHOOSE,&CNumSkipView::OnChoose)
    	
    	ON_WM_CONTEXTMENU()
    	ON_WM_RBUTTONUP()
    	ON_WM_KEYDOWN()
    	ON_WM_CREATE()
    	ON_WM_SYSCOMMAND()
    	ON_COMMAND(ID_EXIT, &CNumSkipView::OnExit)
    	ON_COMMAND(IDC_BACK, &CNumSkipView::OnBack)
    	ON_COMMAND(IDC_REPEAT, &CNumSkipView::OnRepeat)
    	ON_WM_LBUTTONDOWN()
    	ON_WM_RBUTTONDOWN()
    END_MESSAGE_MAP()
    
    // CNumSkipView 构造/析构
    
    CNumSkipView::CNumSkipView()
    {
    	// TODO: 在此处添加构造代码
    	BackroundColor=RGB(176,224,230);
    	White=RGB(176,224,230);
    	Red=RGB(255,0,0);
    	Green=RGB(127,255,0);
    	Black=RGB(0,0,0);
    	 Yellow=RGB(50,205,50);
    }
    
    CNumSkipView::~CNumSkipView()
    {
    	
    }
    
    BOOL CNumSkipView::PreCreateWindow(CREATESTRUCT& cs)
    {
    	// TODO: 在此处通过修改
    	//  CREATESTRUCT cs 来修改窗口类或样式
    	return CView::PreCreateWindow(cs);
    }
    
    // CNumSkipView 绘制
    
    void CNumSkipView::OnDraw(CDC* pDC)
    {
    	CNumSkipDoc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    	if (!pDoc)
    		return;
    	
    	CBrush BackColor(BackroundColor);
    	CBrush *OldBack=pDC->SelectObject(&BackColor);
    	CRect FullRect;
    	GetClientRect(&FullRect);  //获得客户区
    	pDC->FillRect(FullRect,&BackColor);
    	pDC->SelectObject(OldBack);
        switch(pDoc->GS.m_radio_leveal)          //选中不同的单选按钮
    	{
    	 case 0:
              pDoc->order=7;
    	      break;
    	 case 1:
    		  pDoc->order=11;
    		  break;
    	 case 2:
    		  pDoc->order=15;
    		  break;
    	 case 3:
    		  pDoc->order=19;
    		  break;
    	 case 4:
    		  pDoc->order=23;
    		  break;
    	 case 5:
    		   pDoc->order=27;
    		   break;
    	 case 6:
    		   pDoc->order=31;
    	 }
    	 pDoc->Path_Long=pDoc->order/3;    //矩阵的路径长度
    	 pDoc->So.row=pDoc->order-2;        //矩阵的行数
    	 pDoc->So.column=pDoc->order-2;    //矩阵的列数
    	 if(pDoc->OverTag==1)
    	 {
    		 while(1)                         //随机选出矩阵中数字不超过9的矩阵
    	    {
              pDoc->So.Input(pDoc->order-3);
    		  for(int i=0;i!=pDoc->order-2;i++)
    		  {
    		    for(int j=0;j!=pDoc->order-2;j++)
    		    {
    			   if(pDoc->So.matrix[i][j]->elem>9)
    			   {
    					continue;
    			   }
    			}
    		  }
    		  if(pDoc->GS.m_radio_modol==1)     //单路径模式
    		  {
    			int ShortPath;    //矩阵中最短的路径
    			int CenterX;     //矩阵起点横坐标
    			int CenterY;    //矩阵起点纵坐标
    			CenterX=pDoc->So.row/2;
    			CenterY=pDoc->So.column/2;
    			pDoc->So.Check(CenterX,CenterY,ShortPath);
    			pDoc->So.SinglePath(pDoc->Path_Long);    //
    		  }
    		  break;
    	    }
    	    pDoc->CurrentPositionX=pDoc->order/2;//起点位置,刚开始为中心
    	    pDoc->CurrentPositionY=pDoc->order/2;   
    		 pDoc->PrePositionX=0;       //上一位置横坐标,刚开始为0
    	     pDoc->PrePositionY=0;        //上一位置纵坐标
    		pDoc->segment=(pDoc->yy-95)/pDoc->order;
    		pDoc->OverTag=0;
    	 }
    	for(int i=0,x=0;i!=pDoc->order*pDoc->segment;i+=pDoc->segment,x++)
    	{
    		for(int j=20,y=0;j!=pDoc->order*pDoc->segment+20;j+=pDoc->segment,y++)
    		{
    			if((x==0&&y==0)||(x==pDoc->order-1&&y==pDoc->order-1)||(x==0&&y==pDoc->order-1)||(x==pDoc->order-1&&y==0))
    			{         //四个角为空
    			}
    			else if(x==0||y==0||x==pDoc->order-1||y==pDoc->order-1)
    			{         //将边上的位置全部换成边界终止图
    				pDC->Rectangle(i,j,i+pDoc->segment,j+pDoc->segment);//保持黑边框
    				CBrush newcb(Black);
    				CBrush *oldcb=pDC->SelectObject(&newcb);
    				//画圆
    				pDC->Ellipse((i+i+pDoc->segment)/2-pDoc->segment/3,(j+j+pDoc->segment)/2-pDoc->segment/3,(i+i+pDoc->segment)/2+pDoc->segment/3,(j+j+pDoc->segment)/2+pDoc->segment/3);
    				pDC->SelectObject(oldcb);
    			}
    			else if((x+y)%2!=0)
    			{
    				CString s;
    			    s.Format(TEXT("%d"),pDoc->So.matrix[x-1][y-1]->elem);//将整数转换为字符串
    			    CBrush newBrush(Yellow);
    			    CBrush *oldBrush=pDC->SelectObject(&newBrush);
    			    pDC->Rectangle(i,j,i+pDoc->segment,j+pDoc->segment);
    				pDC->SelectObject(oldBrush);
    				pDC->SetBkColor(Yellow);  //设置字体背景颜色
    				CFont newcf;
    				newcf.CreateFontW(pDoc->segment/2,pDoc->segment/4,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);//设置字体大小
    				CFont *oldcf=pDC->SelectObject(&newcf);
    				pDC->SetTextAlign(TA_CENTER);//字体居中
    				pDC->TextOutW((i+i+pDoc->segment)/2,(j+j+pDoc->segment)/2-(pDoc->segment/4),s);//输出字符串
    				pDC->SelectObject(oldcf);
    			}
    			else if(x==pDoc->order/2&&y==pDoc->order/2)
    			{    //起点位置图案不同
    				//Position First;        //可要可不要
    				//First.elem=pDoc->So.matrix[x-1][y-1]->elem;
    				CString s;
    			    s.Format(TEXT("%d"),pDoc->So.matrix[x-1][y-1]->elem);//将整数转换为字符串
    				CBrush newBrush1(Yellow);
    			    CBrush *oldBrush1=pDC->SelectObject(&newBrush1);
    			    pDC->Rectangle(i,j,i+pDoc->segment,j+pDoc->segment);
    				
    				pDC->SelectObject(oldBrush1);
    				//画圆
    			    CBrush newBrush(Red);   //起点为红色
    			    CBrush *oldBrush=pDC->SelectObject(&newBrush);
    			   // pDC->Rectangle(i,j,i+pDoc->segment,j+pDoc->segment);
    				pDC->Ellipse((i+i+pDoc->segment)/2-pDoc->segment/3,(j+j+pDoc->segment)/2-pDoc->segment/3,(i+i+pDoc->segment)/2+pDoc->segment/3,(j+j+pDoc->segment)/2+pDoc->segment/3);
    				//First.x=(i+i+pDoc->segment)/2;
    				//First.y=(j+j+pDoc->segment)/2;
    				//p.push_back(First);
    				pDC->SelectObject(oldBrush);
    				//填字
    				pDC->SetBkColor(White);  //设置字体背景颜色为白色
    				CFont newcf;
    				newcf.CreateFontW(pDoc->segment/2,pDoc->segment/4,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);//设置字体大小
    				CFont *oldcf=pDC->SelectObject(&newcf);
    				pDC->SetTextAlign(TA_CENTER);//字体居中
    				pDC->TextOutW((i+i+pDoc->segment)/2,(j+j+pDoc->segment)/2-(pDoc->segment/4),s);//输出字符串
    				pDC->SelectObject(oldcf);
    			}
    			else
    			{
    				CString s;
    			    s.Format(TEXT("%d"),pDoc->So.matrix[x-1][y-1]->elem);//将整数转换为字符串
    			    CBrush newBrush(White);    //矩形为白色
    			    CBrush *oldBrush=pDC->SelectObject(&newBrush);
    			    pDC->Rectangle(i,j,i+pDoc->segment,j+pDoc->segment);
    				pDC->SelectObject(oldBrush);
    				pDC->SetBkColor(White);  //设置字体背景颜色为白色
    				CFont newcf;
    				newcf.CreateFontW(pDoc->segment/2,pDoc->segment/4,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);//设置字体大小
    				CFont *oldcf=pDC->SelectObject(&newcf);
    				pDC->SetTextAlign(TA_CENTER);//字体居中
    				pDC->TextOutW((i+i+pDoc->segment)/2,(j+j+pDoc->segment)/2-(pDoc->segment/4),s);//输出字符串
    				pDC->SelectObject(oldcf);
    				
    			}
    		}	
         }
    	  if(pDoc->GS.m_Show!=TRUE)
    	  {
    		  if(p.size()>0)
    		  {
                  for(int i=0;i<=p.size()-1;i++)        //恢复路径
    	          {
    				  if(i==0)   //只挪动了一下,便最小化了
    				  {
    					   CBrush Again(Red);
    			          CBrush *AgainOldB=pDC->SelectObject(&Again);
    					  pDC->Ellipse(p[i].x-pDoc->segment/3,p[i].y-pDoc->segment/3,p[i].x+pDoc->segment/3,p[i].y+pDoc->segment/3);
    					  int centx;//圆心x
    					  int centy;//圆心y
    					  centx=(pDoc->order/2)*pDoc->segment+(pDoc->segment/2);
    					  centy=(pDoc->order/2)*pDoc->segment+(pDoc->segment/2)+20;
    					  //pDC->Ellipse(centx-pDoc->segment/3,centy-pDoc->segment/3,centx+pDoc->segment/3,centy+pDoc->segment/3); 
    				      pDC->SelectObject(AgainOldB);
    					  CPen AgainL(PS_SOLID,pDoc->segment/16,Red);//从一点到另一点所使用的线
    	                  CPen *AgainOldP=pDC->SelectObject(&AgainL);
    					  pDC->MoveTo(centx,centy);
    					  pDC->LineTo(p[i].x,p[i].y);
    					  pDC->SelectObject(AgainOldP);
    					   CString ss;
    			            CFont AgainFont;
    	                   AgainFont.CreateFontW(pDoc->segment/2,pDoc->segment/4,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
    	                   CFont *AgainOldF=pDC->SelectObject(&AgainFont);
    	                   pDC->SetTextAlign(TA_CENTER);//字体居中
    					   pDC->SetBkColor(Green);
                           ss.Format(TEXT("%d"),p[i].elem);
    			           pDC->TextOutW(p[i].x,p[i].y-(pDoc->segment/4),ss);
    	                   pDC->SelectObject(AgainOldF);
    				  }
    				  else
    				  {
    					   CBrush Again(Red);
    			           CBrush *AgainOldB=pDC->SelectObject(&Again);
    			           pDC->Ellipse(p[i-1].x-pDoc->segment/3,p[i-1].y-pDoc->segment/3,p[i-1].x+pDoc->segment/3,p[i-1].y+pDoc->segment/3);
    			           pDC->Ellipse(p[i].x-pDoc->segment/3,p[i].y-pDoc->segment/3,p[i].x+pDoc->segment/3,p[i].y+pDoc->segment/3);
    				       pDC->SelectObject(AgainOldB);
    			           CPen AgainL(PS_SOLID,pDoc->segment/16,Red);//从一点到另一点所使用的线
    	                   CPen *AgainOldP=pDC->SelectObject(&AgainL);
    			           pDC->MoveTo(p[i-1].x,p[i-1].y);
    			           pDC->LineTo(p[i].x,p[i].y);
    			           pDC->SelectObject(AgainOldP);
    					    CString ss;
    			            CFont AgainFont;
    	                   AgainFont.CreateFontW(pDoc->segment/2,pDoc->segment/4,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
    	                   CFont *AgainOldF=pDC->SelectObject(&AgainFont);
    	                   pDC->SetTextAlign(TA_CENTER);//字体居中
    	                   ss.Format(TEXT("%d"),p[i-1].elem);
    			           pDC->TextOutW(p[i-1].x,p[i-1].y-(pDoc->segment/4),ss);//输出字符串
    				       if(i==p.size()-1)
    				       {
    					      pDC->SetBkColor(Green);
    				        }
                           ss.Format(TEXT("%d"),p[i].elem);
    			           pDC->TextOutW(p[i].x,p[i].y-(pDoc->segment/4),ss);
    	                   pDC->SelectObject(AgainOldF);
    				  }
    			    
    	          }
    			  if(pDoc->OverTag==1)
    			  {
    				    p.clear();    //清空p
    			  }
    		    
    		  }
    	  }
    	  else
    	  {
              if(p.size()>0)
    		  {
    				 CBrush Again(Red);
    			     CBrush *AgainOldB=pDC->SelectObject(&Again);
    				 pDC->Ellipse(p[p.size()-1].x-pDoc->segment/3,p[p.size()-1].y-pDoc->segment/3,p[p.size()-1].x+pDoc->segment/3,p[p.size()-1].y+pDoc->segment/3);
    			     pDC->SelectObject(AgainOldB);
    			     CString ss;
    			     pDC->SetBkColor(Green);
    			     CFont AgainFont;
    	             AgainFont.CreateFontW(pDoc->segment/2,pDoc->segment/4,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
    	             CFont *AgainOldF=pDC->SelectObject(&AgainFont);
    	             pDC->SetTextAlign(TA_CENTER);//字体居中
                     ss.Format(TEXT("%d"),p[p.size()-1].elem);
    			     pDC->TextOutW(p[p.size()-1].x,p[p.size()-1].y-(pDoc->segment/4),ss);
    	             pDC->SelectObject(AgainOldF);
    			  if(pDoc->OverTag==1)         //如果连续多次最小化,则不清空,否则只有新游戏时才刷新
    			  {
    				    p.clear();    //清空p
    			  }
    		    
    		  }
    	  }
    	  
    	// TODO: 在此处为本机数据添加绘制代码
    }
    
    
    // CNumSkipView 打印
    
    
    void CNumSkipView::OnFilePrintPreview()
    {
    #ifndef SHARED_HANDLERS
    	AFXPrintPreview(this);
    #endif
    }
    
    BOOL CNumSkipView::OnPreparePrinting(CPrintInfo* pInfo)
    {
    	// 默认准备
    	return DoPreparePrinting(pInfo);
    }
    
    void CNumSkipView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    	// TODO: 添加额外的打印前进行的初始化过程
    }
    
    void CNumSkipView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    	// TODO: 添加打印后进行的清理过程
    }
    
    void CNumSkipView::OnRButtonUp(UINT /* nFlags */, CPoint point)
    {
    	//ClientToScreen(&point);
    	//OnContextMenu(this, point);
    }
    
    void CNumSkipView::OnContextMenu(CWnd* /* pWnd */, CPoint point)
    {
    #ifndef SHARED_HANDLERS
    	theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);
    #endif
    }
    
    
    // CNumSkipView 诊断
    
    #ifdef _DEBUG
    void CNumSkipView::AssertValid() const
    {
    	CView::AssertValid();
    }
    
    void CNumSkipView::Dump(CDumpContext& dc) const
    {
    	CView::Dump(dc);
    }
    
    CNumSkipDoc* CNumSkipView::GetDocument() const // 非调试版本是内联的
    {
    	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CNumSkipDoc)));
    	return (CNumSkipDoc*)m_pDocument;
    }
    #endif //_DEBUG
    
    
    // CNumSkipView 消息处理程序
    void CNumSkipView::OnNewGame()        //点击菜单新游戏
    {
    	CNumSkipDoc* pDoc = GetDocument();
    	pDoc->OverTag=1;
    	p.clear();
    	InvalidateRect(NULL,FALSE);       //刷新界面
       
    }
    void CNumSkipView::OnChoose()         //点击菜单游戏选项
    {
    	CNumSkipDoc* pDoc = GetDocument();
    	int result=pDoc->GS.DoModal();
    	if(result==IDOK)                  //读取对话框中的信息并刷新
    	{
    		UpdateData(TRUE);
    		pDoc->OverTag=1;
    		p.clear();
    		Invalidate();
    		
    	}
    	else
    	{
    		UpdateData(FALSE);
    	}
    }
    void CNumSkipView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    	// TODO: 在此添加消息处理程序代码和/或调用默认值
    	CNumSkipDoc* pDoc = GetDocument();
    	int TemElem;     //存储当前位置中的元素
    	int x;           //当前位置横坐标
    	int y;          //当前位置纵坐标
    	x=pDoc->CurrentPositionX;
    	y=pDoc->CurrentPositionY;
    	TemElem=pDoc->So.matrix[pDoc->CurrentPositionX-1][pDoc->CurrentPositionY-1]->elem;
    	int i;          //当前图案的像素横坐标
    	int j;           //当前图案的像素纵坐标
        i=pDoc->CurrentPositionX*pDoc->segment;
    	j=pDoc->CurrentPositionY*pDoc->segment+20;
    	CClientDC Dc(this);
    	CString ss;        //当前位置元素
    	CString s;         //将要跳到的元素
    	ss.Format(TEXT("%d"),pDoc->So.matrix[x-1][y-1]->elem);//将整数转换为字符串
    	if(pDoc->GS.m_Show!=TRUE)       //显示路径
    	{
    		Dc.SetBkColor(White);
    	}
    	else                 //隐藏路径
    	{
    		if((x+y)%2!=0)
    		{
    			Dc.SetBkColor(Yellow);
    		}
    		else
    		{
    			Dc.SetBkColor(White);
    		}
    		CRect CR(i,j,i+pDoc->segment,j+pDoc->segment);
    		InvalidateRect(CR,FALSE);
    	}
    	//当按下方向键时,将当前元素状态变为已走过状态
    	//Dc.SetBkColor(White);  //设置字体背景颜色
    	CFont PreFont;
    	PreFont.CreateFontW(pDoc->segment/2,pDoc->segment/4,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
    	CFont *Preoldcf=Dc.SelectObject(&PreFont);
    	Dc.SetTextAlign(TA_CENTER);//字体居中
    	Dc.TextOutW((i+i+pDoc->segment)/2,(2*j+pDoc->segment)/2-(pDoc->segment/4),ss);//输出字符串
    	Dc.SelectObject(Preoldcf);
    	CBrush NextBackround(Red);//将要跳到的元素所使用的背景色
    	CBrush *oldBrush=Dc.SelectObject(&NextBackround);
    	CPen Line(PS_SOLID,pDoc->segment/16,Red);//从一点到另一点所使用的线
    	CPen *OldPen=Dc.SelectObject(&Line);
        Dc.SetBkColor(Green);  //设置字体背景颜色
    	Dc.SetTextAlign(TA_CENTER);//字体居中
    	CFont NextFont;
    	NextFont.CreateFontW(pDoc->segment/2,pDoc->segment/4,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);//设置字体大小
    	CFont *oldcf=Dc.SelectObject(&NextFont);
    	switch(nChar)
    	{
    	case VK_DOWN:          //向下
    		if(y-1+TemElem<pDoc->order-2)       //未跳出矩阵
    		{
    			Position First;        //可要可不要
    	        
    			First.elem=pDoc->So.matrix[x-1][y-1+TemElem]->elem;//保存经过的元素值
    			s.Format(TEXT("%d"),pDoc->So.matrix[x-1][y-1+TemElem]->elem);//将整数转换为字符串
    			//画圆
    		    Dc.Ellipse((2*i+pDoc->segment)/2-pDoc->segment/3,(2*(j+TemElem*pDoc->segment)+pDoc->segment)/2-pDoc->segment/3,(i+i+pDoc->segment)/2+pDoc->segment/3,(2*(j+TemElem*pDoc->segment)+pDoc->segment)/2+pDoc->segment/3);
    			First.x=(2*i+pDoc->segment)/2;       //圆心x坐标
    			First.y=(2*(j+TemElem*pDoc->segment)+pDoc->segment)/2;//圆心y坐标
    			p.push_back(First);//进容器
    			Dc.SelectObject(oldBrush);
    			//划线
    			if(pDoc->GS.m_Show!=TRUE)
    			{
    				Dc.MoveTo((i+i+pDoc->segment)/2,(2*j+pDoc->segment)/2+pDoc->segment/16*5);
    			    Dc.LineTo((i+i+pDoc->segment)/2,(2*(j+TemElem*pDoc->segment)+pDoc->segment)/2-(pDoc->segment/4));
    			    Dc.SelectObject(OldPen);
    			}
    			//填字
    			Dc.TextOutW((i+i+pDoc->segment)/2,(2*(j+TemElem*pDoc->segment)+pDoc->segment)/2-(pDoc->segment/4),s);//输出字符串
    			Dc.SelectObject(oldcf);
    			pDoc->CurrentPositionY+=TemElem;
    			if(pDoc->So.matrix[x-1][y-1+TemElem]->elem==0||(x-1-pDoc->So.matrix[x-1][y-1+TemElem]->elem<-1&&x-1+pDoc->So.matrix[x-1][y-1+TemElem]->elem>pDoc->order-2&&y-1+TemElem-pDoc->So.matrix[x-1][y-1+TemElem]->elem<-1&&y-1+TemElem+pDoc->So.matrix[x-1][y-1+TemElem]->elem>pDoc->order-2))
    			{
    				int r=pDoc->L.DoModal();
    			    if(r==IDC_AGAIN)             //再来一局
    			    {
    				   pDoc->OverTag=1;
    				   p.clear();
    				   Invalidate();
    			    }
    			    else if(r==IDOK)            //新游戏
    			   {
    				   CNumSkipDoc* pDoc = GetDocument();
    	               int result=pDoc->GS.DoModal();
    	               if(result==IDOK)                  //读取对话框中的信息并刷新
    	               {
    		              UpdateData(TRUE);
    		              pDoc->OverTag=1;
    					  p.clear();
    		              Invalidate();
    	               }
    	               else
    	               {
    		             UpdateData(FALSE);     
    	               }
    			   }
    			   else if(r==IDC_BACK1)
    			  {
    				  p.pop_back();
    				  pDoc->CurrentPositionY-=TemElem;
    				  Invalidate();
    			  }
    			  else
    				PostQuitMessage(0);    
    			}
    		}
    		else if(y-1+TemElem==pDoc->order-2)//刚好跳出矩阵
    		{
    			if(pDoc->GS.m_Show!=TRUE)
    			{
                    Dc.MoveTo((i+i+pDoc->segment)/2,(2*j+pDoc->segment)/2+pDoc->segment/16*5);
    			    Dc.LineTo((i+i+pDoc->segment)/2,(2*(j+TemElem*pDoc->segment)+pDoc->segment)/2-(pDoc->segment/4));
    			    Dc.SelectObject(OldPen);
    			}
    			//画圆
    			Dc.Ellipse((i+i+pDoc->segment)/2-pDoc->segment/3,(2*(j+TemElem*pDoc->segment)+pDoc->segment)/2-pDoc->segment/3,(i+i+pDoc->segment)/2+pDoc->segment/3,(2*(j+TemElem*pDoc->segment)+pDoc->segment)/2+pDoc->segment/3);
    			Dc.SelectObject(oldBrush);
    			pDoc->CurrentPositionX=pDoc->order/2;       //回到起点
    			pDoc->CurrentPositionY=pDoc->order/2;
    			int r=pDoc->W.DoModal();
    			if(r==IDC_AGAIN)             //再来一局
    			{
    				pDoc->OverTag=1;
    				p.clear();
    				Invalidate();
    			}
    			else if(r==IDOK)            //新游戏
    			{
    				CNumSkipDoc* pDoc = GetDocument();
    	            int result=pDoc->GS.DoModal();
    	            if(result==IDOK)                  //读取对话框中的信息并刷新
    	            {
    		           UpdateData(TRUE);
    		           pDoc->OverTag=1;
    				   p.clear();
    		           Invalidate();
    	           }
    	           else
    	          {
    		         UpdateData(FALSE);     
    	          }
    			}
    			else
    				PostQuitMessage(0);    //新游戏
    		}
    		else                                            //超出矩阵
    		{
    			Dc.TextOutW((i+i+pDoc->segment)/2,(2*j+pDoc->segment)/2-(pDoc->segment/4),ss);//输出字符串
    			Dc.SelectObject(oldcf);
    			MessageBox(_T("下方已无路可走"));
    		}
    		break;
    	case VK_LEFT:         //向左
    		if(x-1-TemElem>=0)       //未跳出矩阵
    		{
    			Position First;        //可要可不要
    			
    			First.elem=pDoc->So.matrix[x-1-TemElem][y-1]->elem;
    			s.Format(TEXT("%d"),pDoc->So.matrix[x-1-TemElem][y-1]->elem);//将整数转换为字符串
    			//画圆
    		    Dc.Ellipse((2*(i-TemElem*pDoc->segment)+pDoc->segment)/2-pDoc->segment/3,(2*j+pDoc->segment)/2-pDoc->segment/3,(2*(i-TemElem*pDoc->segment)+pDoc->segment)/2+pDoc->segment/3,(2*j+pDoc->segment)/2+pDoc->segment/3);
    			First.x=(2*(i-TemElem*pDoc->segment)+pDoc->segment)/2;
    			First.y=(2*j+pDoc->segment)/2;
    			p.push_back(First);
    			Dc.SelectObject(oldBrush);
    			//划线
    			if(pDoc->GS.m_Show!=TRUE)
    			{
                    Dc.MoveTo((i+i+pDoc->segment)/2-pDoc->segment/4,(2*j+pDoc->segment)/2);
    			    Dc.LineTo((2*(i-TemElem*pDoc->segment)+pDoc->segment)/2+pDoc->segment/8,(2*j+pDoc->segment)/2);
    			    Dc.SelectObject(OldPen);
    			}
    			//填字
    			Dc.TextOutW((2*(i-TemElem*pDoc->segment)+pDoc->segment)/2,(2*j+pDoc->segment)/2-(pDoc->segment/4),s);//输出字符串
    			Dc.SelectObject(oldcf);
    			pDoc->CurrentPositionX-=TemElem;
    			if(pDoc->So.matrix[x-1-TemElem][y-1]->elem==0||(x-1-TemElem-pDoc->So.matrix[x-1-TemElem][y-1]->elem<-1&&x-1-TemElem+pDoc->So.matrix[x-1-TemElem][y-1]->elem>pDoc->order-2&&y-1-pDoc->So.matrix[x-1-TemElem][y-1]->elem<-1&&y-1+pDoc->So.matrix[x-1-TemElem][y-1]->elem>pDoc->order-2))
    			{
    				int r=pDoc->L.DoModal();
    			    if(r==IDC_AGAIN)             //再来一局
    			    {
    				   pDoc->OverTag=1;
    				   p.clear();
    				   Invalidate();
    			    }
    			    else if(r==IDOK)            //新游戏
    			   {
    				   CNumSkipDoc* pDoc = GetDocument();
    	               int result=pDoc->GS.DoModal();
    	               if(result==IDOK)                  //读取对话框中的信息并刷新
    	               {
    		              UpdateData(TRUE);
    		              pDoc->OverTag=1;
    					  p.clear();
    		              Invalidate();
    	               }
    	               else
    	               {
    		             UpdateData(FALSE);     
    	               }
    			  }
    				else if(r==IDC_BACK1)
    				{
    					p.pop_back();
    					pDoc->CurrentPositionX+=TemElem;
    					Invalidate();
    				}
    			  else
    				PostQuitMessage(0);    
    			}
    		}
    		else if(x-1-TemElem==-1)//刚好跳出矩阵
    		{
    			if(pDoc->GS.m_Show!=TRUE)
    			{
    				Dc.MoveTo((i+i+pDoc->segment)/2-pDoc->segment/4,(2*j+pDoc->segment)/2);
    			    Dc.LineTo((2*(i-TemElem*pDoc->segment)+pDoc->segment)/2+pDoc->segment/8,(2*j+pDoc->segment)/2);
    			    Dc.SelectObject(OldPen);
    			}
    			//画圆
    			Dc.Ellipse((2*(i-TemElem*pDoc->segment)+pDoc->segment)/2-pDoc->segment/3,(2*j+pDoc->segment)/2-pDoc->segment/3,(2*(i-TemElem*pDoc->segment)+pDoc->segment)/2+pDoc->segment/3,(2*j+pDoc->segment)/2+pDoc->segment/3);
    			Dc.SelectObject(oldBrush);
    			pDoc->CurrentPositionX=pDoc->order/2;       //回到起点
    			pDoc->CurrentPositionY=pDoc->order/2;
    			int r=pDoc->W.DoModal();
    			if(r==IDC_AGAIN)             //再来一局
    			{
    				pDoc->OverTag=1;
    				p.clear();
    				Invalidate();
    			}
    			else if(r==IDOK)            //新游戏
    			{
    				CNumSkipDoc* pDoc = GetDocument();
    	            int result=pDoc->GS.DoModal();
    	            if(result==IDOK)                  //读取对话框中的信息并刷新
    	            {
    		           UpdateData(TRUE);
    		           pDoc->OverTag=1;
    				   p.clear();
    		           Invalidate();
    	           }
    	           else
    	          {
    		         UpdateData(FALSE);     
    	          }
    			}
    			else
    				PostQuitMessage(0);    //新游戏
    		}
    		else                                            //超出矩阵
    		{
    			Dc.TextOutW((i+i+pDoc->segment)/2,(2*j+pDoc->segment)/2-(pDoc->segment/4),ss);//输出字符串
    			Dc.SelectObject(oldcf);
    			MessageBox(_T("左方已无路可走"));
    		}
    		break;
    	case VK_RIGHT:        //向右
    		if(x-1+TemElem<pDoc->order-2)       //未跳出矩阵
    		{   
                Position First;        //可要可不要
    			
    			First.elem=pDoc->So.matrix[x-1+TemElem][y-1]->elem;
    			s.Format(TEXT("%d"),pDoc->So.matrix[x-1+TemElem][y-1]->elem);//将整数转换为字符串   
    			//画圆
    		    Dc.Ellipse((2*(i+TemElem*pDoc->segment)+pDoc->segment)/2-pDoc->segment/3,(2*j+pDoc->segment)/2-pDoc->segment/3,(2*(i+TemElem*pDoc->segment)+pDoc->segment)/2+pDoc->segment/3,(2*j+pDoc->segment)/2+pDoc->segment/3);
    			First.x=(2*(i+TemElem*pDoc->segment)+pDoc->segment)/2;
    			First.y=(2*j+pDoc->segment)/2;
    			p.push_back(First);
    			Dc.SelectObject(oldBrush);
    			//划线
    			if(pDoc->GS.m_Show!=TRUE)
    			{
    				Dc.MoveTo((i+i+pDoc->segment)/2+pDoc->segment/4,(2*j+pDoc->segment)/2);
    			    Dc.LineTo((2*(i+TemElem*pDoc->segment)+pDoc->segment)/2-pDoc->segment/4,(2*j+pDoc->segment)/2);
    			    Dc.SelectObject(OldPen);
    			}
    			//填字
    			Dc.TextOutW((2*(i+TemElem*pDoc->segment)+pDoc->segment)/2,(2*j+pDoc->segment)/2-(pDoc->segment/4),s);//输出字符串
    			Dc.SelectObject(oldcf);
    			pDoc->CurrentPositionX+=TemElem;
    			if(pDoc->So.matrix[x-1+TemElem][y-1]->elem==0||(x-1+TemElem-pDoc->So.matrix[x-1+TemElem][y-1]->elem<-1&&x-1+TemElem+pDoc->So.matrix[x-1+TemElem][y-1]->elem>pDoc->order-2&&y-1-pDoc->So.matrix[x-1+TemElem][y-1]->elem<-1&&y-1+pDoc->So.matrix[x-1+TemElem][y-1]->elem>pDoc->order-2))
    			{
    				int r=pDoc->L.DoModal();
    			    if(r==IDC_AGAIN)             //再来一局
    			    {
    				   pDoc->OverTag=1;
    				   p.clear();
    				   Invalidate();
    			    }
    			    else if(r==IDOK)            //新游戏
    			   {
    				   CNumSkipDoc* pDoc = GetDocument();
    	               int result=pDoc->GS.DoModal();
    	               if(result==IDOK)                  //读取对话框中的信息并刷新
    	               {
    		              UpdateData(TRUE);
    		              pDoc->OverTag=1;
    					  p.clear();
    		              Invalidate();
    	               }
    	               else
    	               {
    		             UpdateData(FALSE);     
    	               }
    			  }
    				else if(r==IDC_BACK1)
    				{
    					p.pop_back();
                        pDoc->CurrentPositionX-=TemElem;
    					Invalidate();
    				}
    			  else
    				PostQuitMessage(0);    
    			}
    		}
    		else if(x-1+TemElem==pDoc->order-2)//刚好跳出矩阵
    		{
    			if(pDoc->GS.m_Show!=TRUE)
    			{
                   Dc.MoveTo((i+i+pDoc->segment)/2+pDoc->segment/4,(2*j+pDoc->segment)/2);
    			   Dc.LineTo((2*(i+TemElem*pDoc->segment)+pDoc->segment)/2-pDoc->segment/4,(2*j+pDoc->segment)/2);
    			   Dc.SelectObject(OldPen);
    			}
    			//画圆
    			Dc.Ellipse((2*(i+TemElem*pDoc->segment)+pDoc->segment)/2-pDoc->segment/3,(2*j+pDoc->segment)/2-pDoc->segment/3,(2*(i+TemElem*pDoc->segment)+pDoc->segment)/2+pDoc->segment/3,(2*j+pDoc->segment)/2+pDoc->segment/3);
    			Dc.SelectObject(oldBrush);
    			pDoc->CurrentPositionX=pDoc->order/2;       //回到起点
    			pDoc->CurrentPositionY=pDoc->order/2;
    			int r=pDoc->W.DoModal();
    			if(r==IDC_AGAIN)           //再来一局
    			{
    				pDoc->OverTag=1;
    				p.clear();
    				Invalidate();
    			}
    			else if(r==IDOK)         //新游戏
    			{
    				CNumSkipDoc* pDoc = GetDocument();
    	            int result=pDoc->GS.DoModal();
    	            if(result==IDOK)                  //读取对话框中的信息并刷新
    	            {
    		           UpdateData(TRUE);
    		           pDoc->OverTag=1;
    				   p.clear();
    		           Invalidate();
    	           }
    	           else
    	          {
    		         UpdateData(FALSE);
    	          }
    			}
    			else
    				PostQuitMessage(0);     //退出游戏
    		}
    		else                                            //超出矩阵
    		{
    			Dc.TextOutW((i+i+pDoc->segment)/2,(2*j+pDoc->segment)/2-(pDoc->segment/4),ss);//输出字符串
    			Dc.SelectObject(oldcf);
    			MessageBox(_T("右方已无路可走"));
    		}
    		break;
    	case VK_UP:           //向上
    		if(y-1-TemElem>=0)       //未跳出矩阵
    		{
    			Position First;        //可要可不要
    			
    			First.elem=pDoc->So.matrix[x-1][y-1-TemElem]->elem;
    			s.Format(TEXT("%d"),pDoc->So.matrix[x-1][y-1-TemElem]->elem);//将整数转换为字符串
    			//画圆
    		    Dc.Ellipse((2*i+pDoc->segment)/2-pDoc->segment/3,(2*(j-TemElem*pDoc->segment)+pDoc->segment)/2-pDoc->segment/3,(i+i+pDoc->segment)/2+pDoc->segment/3,(2*(j-TemElem*pDoc->segment)+pDoc->segment)/2+pDoc->segment/3);
    			First.x=(2*i+pDoc->segment)/2;
    			First.y=(2*(j-TemElem*pDoc->segment)+pDoc->segment)/2;
    			p.push_back(First);
    			Dc.SelectObject(oldBrush);
    			//划线
    			if(pDoc->GS.m_Show!=TRUE)
    			{
                    Dc.MoveTo((i+i+pDoc->segment)/2,(2*j+pDoc->segment)/2-pDoc->segment/16*5);
    			    Dc.LineTo((i+i+pDoc->segment)/2,(2*(j-TemElem*pDoc->segment)+pDoc->segment)/2+(pDoc->segment/4));
    			   Dc.SelectObject(OldPen);
    			}
    			//填字
    			Dc.TextOutW((i+i+pDoc->segment)/2,(2*(j-TemElem*pDoc->segment)+pDoc->segment)/2-(pDoc->segment/4),s);//输出字符串
    			Dc.SelectObject(oldcf);
    			pDoc->CurrentPositionY-=TemElem;
    			if(pDoc->So.matrix[x-1][y-1-TemElem]->elem==0||(x-1-pDoc->So.matrix[x-1][y-1-TemElem]->elem<-1&&x-1+pDoc->So.matrix[x-1][y-1-TemElem]->elem>pDoc->order-2&&y-1-TemElem-pDoc->So.matrix[x-1][y-1-TemElem]->elem<-1&&y-1-TemElem+pDoc->So.matrix[x-1][y-1-TemElem]->elem>pDoc->order-2))
    			{
    				int r=pDoc->L.DoModal();
    			    if(r==IDC_AGAIN)             //再来一局
    			    {
    				   pDoc->OverTag=1;
    				   p.clear();
    				   Invalidate();
    			    }
    			    else if(r==IDOK)            //新游戏
    			   {
    				   CNumSkipDoc* pDoc = GetDocument();
    	               int result=pDoc->GS.DoModal();
    	               if(result==IDOK)                  //读取对话框中的信息并刷新
    	               {
    		              UpdateData(TRUE);
    		              pDoc->OverTag=1;
    					  p.clear();
    		              Invalidate();
    	               }
    	               else
    	               {
    		             UpdateData(FALSE);     
    	               }
    			  }
    				else if(r==IDC_BACK1)
    				{
    					p.pop_back();
    					pDoc->CurrentPositionY+=TemElem;
    					Invalidate();
    				}
    			  else
    				PostQuitMessage(0);    
    			}
    		}
    		else if(y-1-TemElem==-1)//刚好跳出矩阵
    		{
    			if(pDoc->GS.m_Show!=TRUE)
    			{
                   Dc.MoveTo((i+i+pDoc->segment)/2,(2*j+pDoc->segment)/2-pDoc->segment/16*5);
    			   Dc.LineTo((i+i+pDoc->segment)/2,(2*(j-TemElem*pDoc->segment)+pDoc->segment)/2+(pDoc->segment/4));
    			   Dc.SelectObject(OldPen);
    			}
    			//画圆
    			Dc.Ellipse((i+i+pDoc->segment)/2-pDoc->segment/3,(2*(j-TemElem*pDoc->segment)+pDoc->segment)/2-pDoc->segment/3,(i+i+pDoc->segment)/2+pDoc->segment/3,(2*(j-TemElem*pDoc->segment)+pDoc->segment)/2+pDoc->segment/3);
    			Dc.SelectObject(oldBrush);
    			pDoc->CurrentPositionX=pDoc->order/2;       //回到起点
    			pDoc->CurrentPositionY=pDoc->order/2;
    			int r=pDoc->W.DoModal();
    			if(r==IDC_AGAIN)           //再来一局
    			{
    				pDoc->OverTag=1;
    				p.clear();
    				Invalidate();
    			}
    			else if(r==IDOK)        //新游戏
    			{
    				CNumSkipDoc* pDoc = GetDocument();
    	            int result=pDoc->GS.DoModal();
    	            if(result==IDOK)                  //读取对话框中的信息并刷新
    	            {
    		           UpdateData(TRUE);
    		           pDoc->OverTag=1;
    				   p.clear();
    		           Invalidate();
    	           }
    	           else
    	          {
    		         UpdateData(FALSE);
    	          }
    			}
    			else
    				PostQuitMessage(0);     //退出游戏
    		}
    		else                                            //超出矩阵
    		{
    			Dc.TextOutW((i+i+pDoc->segment)/2,(2*j+pDoc->segment)/2-(pDoc->segment/4),ss);//输出字符串
    			Dc.SelectObject(oldcf);
    			MessageBox(_T("上方已无路可走"));
    		}
    	}
    	CView::OnKeyDown(nChar, nRepCnt, nFlags);
    }
    
    
    int CNumSkipView::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    	if (CView::OnCreate(lpCreateStruct) == -1)
    		return -1;
    
    	// TODO:  在此添加您专用的创建代码
    	
    	return 0;
    }
    
    
    void CNumSkipView::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	// TODO: 在此添加消息处理程序代码和/或调用默认值
    	/*if(nID==SC_MINIMIZE)
    	{
    		CRect r(0,0,1,1);
    	     InvalidateRect(r,FALSE);	
    	}
    	else if(nID==SC_MAXIMIZE)
    	{
    		CRect r(0,0,1,1);
    	     InvalidateRect(r,FALSE);	
    	}*/
    	CView::OnSysCommand(nID, lParam);
    }
    
    
    void CNumSkipView::OnExit()
    {
    	// TODO: 在此添加命令处理程序代码
    	PostQuitMessage(0);     //退出游戏
    }
    
    
    void CNumSkipView::OnBack()
    {
    	// TODO: 在此添加命令处理程序代码
    	 CNumSkipDoc* pDoc = GetDocument();
    	if(p.size()>1)
    	{
    		p.pop_back();               
    	    pDoc->CurrentPositionX=(p[p.size()-1].x-pDoc->segment/2)/pDoc->segment;//将当前位置更改
    	    pDoc->CurrentPositionY=(p[p.size()-1].y-pDoc->segment/2-20)/pDoc->segment;
    	}
    	else
    	{
    		p.pop_back();
            pDoc->CurrentPositionX=pDoc->order/2;//起点位置,刚开始为中心
    	    pDoc->CurrentPositionY=pDoc->order/2;   
    	}
    	Invalidate();
    }
    
    
    void CNumSkipView::OnRepeat()
    {
    	// TODO: 在此添加命令处理程序代码
    	CNumSkipDoc* pDoc = GetDocument();
    	p.clear();
        pDoc->CurrentPositionX=pDoc->order/2;//起点位置,刚开始为中心
    	pDoc->CurrentPositionY=pDoc->order/2; 
    	Invalidate();
    }
    
    
    void CNumSkipView::OnLButtonDown(UINT nFlags, CPoint point)
    {
    	// TODO: 在此添加消息处理程序代码和/或调用默认值
    	CNumSkipDoc* pDoc = GetDocument();
    	if((point.x<pDoc->segment&&point.y<pDoc->segment+20)||(point.x>(pDoc->order-1)*pDoc->segment&&point.x<pDoc->order*pDoc->segment&&point.y<pDoc->segment+20&&point.y>20))//排除上面两个角
    	{}
    	else if((point.x<pDoc->segment&&point.y<(pDoc->order*pDoc->segment)+20&&point.y>(pDoc->order-1)*pDoc->segment+20)||(point.x>(pDoc->order-1)*pDoc->segment&&point.x<pDoc->order*pDoc->segment&&point.y<pDoc->order*pDoc->segment+20&&point.y>20+(pDoc->order-1)*pDoc->segment))
    	{}    //排除下面两个角
    	else if(point.x<=pDoc->order*pDoc->segment&&point.y<=pDoc->order*pDoc->segment+20&&point.y>20)//鼠标点击了游戏区域,将此区域用黑圆代替
    	{
    		node2 Area;
    		Area.i1=(2*((point.x/pDoc->segment)*pDoc->segment)+pDoc->segment)/2;
    		Area.j1=(2*(((point.y-15)/pDoc->segment)*pDoc->segment)+pDoc->segment)/2+20;
    		pp.push_back(Area);
    		CClientDC DC(this);
    		CBrush cb(Black);
    		CBrush *oldcb=DC.SelectObject(&cb);
    		DC.Ellipse(Area.i1-pDoc->segment/3,Area.j1-pDoc->segment/3,Area.i1+pDoc->segment/3,Area.j1+pDoc->segment/3);
            DC.SelectObject(oldcb);
    	}
    	CView::OnLButtonDown(nFlags, point);
    }
    
    
    void CNumSkipView::OnRButtonDown(UINT nFlags, CPoint point)
    {
    	// TODO: 在此添加消息处理程序代码和/或调用默认值
    	CNumSkipDoc* pDoc = GetDocument();
    	if((point.x<pDoc->segment&&point.y<pDoc->segment+20)||(point.x>(pDoc->order-1)*pDoc->segment&&point.x<pDoc->order*pDoc->segment&&point.y<pDoc->segment+20&&point.y>20))//排除上面两个角
    	{}
    	else if((point.x<pDoc->segment&&point.y<(pDoc->order*pDoc->segment)+20&&point.y>(pDoc->order-1)*pDoc->segment+20)||(point.x>(pDoc->order-1)*pDoc->segment&&point.x<pDoc->order*pDoc->segment&&point.y<pDoc->order*pDoc->segment+20&&point.y>20+(pDoc->order-1)*pDoc->segment))
    	{}    //排除下面两个角
    	else if(point.x<=pDoc->order*pDoc->segment&&point.y<=pDoc->order*pDoc->segment+20&&point.y>20)//鼠标点击了游戏区域,将此区域用黑圆代替
    	{
    		node2 Area;
    		Area.i1=(2*(((point.x)/pDoc->segment)*pDoc->segment)+pDoc->segment)/2;
    		Area.j1=(2*((((point.y-15))/pDoc->segment)*pDoc->segment)+pDoc->segment)/2+20;
    		pp.push_back(Area);
    		CClientDC DC(this);
    		CBrush cb(Red);
    		CBrush *oldcb=DC.SelectObject(&cb);
    		DC.Ellipse(Area.i1-pDoc->segment/3,Area.j1-pDoc->segment/3,Area.i1+pDoc->segment/3,Area.j1+pDoc->segment/3);
    		DC.SelectObject(oldcb);
    	}
    	CView::OnRButtonDown(nFlags, point);
    }
    //*******************
    SkipOut.h
    #pragma once
    #include<stdlib.h>
    #include<time.h>
    #include<vector>
    using namespace std;
    typedef struct node
    {
    	int i,j;
    	int pre;
    }*ptrn;
    typedef struct node1      //矩阵中每个元素的结构
    {
    	int elem;
    	bool tag;
    }*ptrnelse;
    struct node2
    {
    	int i1;    //横坐标
    	int j1;    //纵坐标
    };
    class SkipOut
    {
    private:
    	vector<ptrn> temlist;
    	//vector<int> array;
    	vector<node2> path;        //将随机生成的路径存入
    	ptrn *quelist;           //元素入栈
    public:
    	ptrnelse **matrix;       //矩阵
    	int count_bool;
    	int count;
    	int rear;                 //代表所走过的点数
    	int front;               //栈顶同时其值代表着栈中元素个数
    	int row;               //矩阵之行数
    	int column;  //矩阵之列数
    	SkipOut(void);
    	void Input(int n2) ;                                 //生成路径长度为n2的矩阵
    	void Check(int &nnrow,int mmcolumn,int &num);
    	void SinglePath(int &num);              //将矩阵中长度不是num的路径封死只留一条长度为num的路径
    	~SkipOut(void);
    };
    //**************************
    SkipOut.cpp
    #include "StdAfx.h"
    #include "SkipOut.h"
    
    
    SkipOut::SkipOut(void)
    {
    }
    void SkipOut::Input(int n2)                                //生成路径长度为n2的矩阵
    	{
    	    count_bool=0;	
    		matrix=(ptrnelse **)new ptrnelse*[row];        //动态分配矩阵的行数
    		for(int i=0;i!=row;i++)              //定义矩阵的列数
    	    {
    		   matrix[i]=new ptrnelse[column];
    	    }
    	    srand((int)time(0));         //初始随机函数
    	    for(int i=0;i!=row;i++)
    	    {
    		   for(int j=0;j!=column;j++)
    		   {
    			  matrix[i][j]=new node1;
    			  matrix[i][j]->elem=-2;         //用以区分其值有没有已经被分配
    			  matrix[i][j]->tag=true;          //矩阵中每个元素的初始状态为true
    		   }
    	    }
    		int temx;                //当前位置的x值
    		int temy;                //当前位置的y值
    		temx=row/2;
    		temy=column/2;
    		while(count_bool<n2)
    		{
    			int n3;         //随机产生一个元素值
    			int n4;        //方向
    			n4=1+rand()%4;         //随机产生一个方向
    			switch(n4)
    			{//1
    			case 1:               //代表上
                    while(1)          //循环用以选出合适的数字
    				{//2 
    				    n3=1+rand()%9;      //矩阵中的元素最大值为9
    					if(count_bool==n2-1)           //当为路径中最后一点时
    					{//3
    						if(temx-n3==-1)     //如果向上正好走出边界
    						{
    							 matrix[temx][temy]->elem=n3;
    							 node2 point;           //将此点的位置信息存入容器
    							 point.i1=temx;
    							 point.j1=temy;
    							 path.push_back(point);
    							 count_bool++;
    							 break;         //跳出循环
    						}
    						else if(temx>8)  //如果不论n3为何值都不可能跳出矩阵
    						{
    							matrix[temx][temy]->elem=temx+1;
    							 node2 point;           //将此点的位置信息存入容器
    							 point.i1=temx;
    							 point.j1=temy;
    							 path.push_back(point);
    							count_bool++;
    							break;
    						}
    						else               //如果可以跳出矩阵则继续循环直至选出符合条件的值
    					    {
    							continue;
    						}
    					}//3
    					else if(temx-n3>=0||temx==0)
    					{//4
    						int count_true;          //可走的点数
    						int count_false;        //不可走的点数
    						count_true=0;
    						count_false=0;
    						for(int k=0;k!=temx;k++)
    						{
    							if(matrix[k][temy]->tag==true)
    								count_true++;
    							else
    								count_false++;
    						}
    						if(count_true>0&&count_false<9)        //如果当前位置上方9个点有未访问过的点则正常执行
    						{ //5                     //防止上面有超过9个位置且与其上方连续9个都被访问过*****************
    							while(1)
    							{ //6  
                                   if(matrix[temx-n3][temy]->tag==true)
    							   {
    								  matrix[temx][temy]->elem=n3;
    								   node2 point;           //将此点的位置信息存入容器
    							       point.i1=temx;
    							       point.j1=temy;
    							       path.push_back(point);
    						          matrix[temx][temy]->tag=false;
    						          temx=temx-n3;
    								  count_bool++;
    						          break; 
    							   }
    							   else
    							   {
    								  while(1)
    								   {    
    									    n3=1+rand()%9;
    									   if(temx-n3>=0)
    									   { 
    										   break;
    									   }
    									   else
    									   {
    										   continue;
    									   }
    								   }
    							   }
    							}//6
    						}//5
    						else             //如果当前位置上方所有的点都访问过了则转向
    						{
    							break;
    						}
    					}//4
    					else
    					{
    						continue;
    					}
    			    }//2
    				break;
    			case 2:                //代表右
    				 while(1)
    				{                            
    				    n3=1+rand()%9;       //当行数大于等于10时,矩阵中的元素最大值为9
    					if(count_bool==n2-1)
    					{
    						if(temy+n3==column)
    						{
    							 matrix[temx][temy]->elem=n3;
    							  node2 point;           //将此点的位置信息存入容器
    							 point.i1=temx;
    							 point.j1=temy;
    							 path.push_back(point);
    							 count_bool++;
    							 break;
    						}
    						else if(temy+9<column)
    						{
    							matrix[temx][temy]->elem=column-temy;
    							 node2 point;           //将此点的位置信息存入容器
    							 point.i1=temx;
    							 point.j1=temy;
    							 path.push_back(point);
    							count_bool++;
    							break;
    						}
    						else
    					    {
    							continue;
    						}
    					}
    					else if(temy+n3<column||temy==column-1)
    					{
    						int count_true;          //可走的点数
    						int count_false;        //不可走的点数
    						count_true=0;
    						count_false=0;
    						for(int k=temy+1;k!=column;k++)
    						{
    							if(matrix[temx][k]->tag==true)
    							{
    							    count_true++;
    							}
    							else
    							{
    							    count_false++;
    							}
    						}
    						if(count_true>0&&count_false<9)        //如果当前位置上方9个点有未访问过的点则正常执行
    						{                      //防止上面有超过9个位置且与其上方连续9个都被访问过*****************
    							while(1)
    							{       
                                   if(matrix[temx][temy+n3]->tag==true)
    							   {
    								  matrix[temx][temy]->elem=n3;
    								   node2 point;           //将此点的位置信息存入容器
    							       point.i1=temx;
    							       point.j1=temy;
    							       path.push_back(point);
    						          matrix[temx][temy]->tag=false;
    						          temy=temy+n3;
    								  count_bool++;
    						          break; 
    							   }
    							   else
    							   {
    								   while(1)
    								   {      
    									    n3=1+rand()%9;
    									   if(temy+n3<column)
    									   {
    										  break;
    									   }
    									   else
    									   { 
    										  continue;
    									   }
    								   }
    							   }
    							}
    						}
    						else             //如果当前位置上方所有的点都访问过了则转向
    						{
    							break;
    						}
    					}
    					else
    					{
    						continue;          //继续循环直至找出符合条件的数字
    					}
    			    }
    				break;
    			case 3:               //代表下
    				while(1)
    				{                   
    				    n3=1+rand()%9;       //当行数大于等于10时,矩阵中的元素最大值为9 
                        if(count_bool==n2-1)
    					{
    						if(temx+n3==row)
    						{
    							 matrix[temx][temy]->elem=n3;
    							  node2 point;           //将此点的位置信息存入容器
    							 point.i1=temx;
    							 point.j1=temy;
    							 path.push_back(point);
    							 count_bool++;
    							 break;
    						}
    						else if(temx+9<row)
    					    {
    							matrix[temx][temy]->elem=row-temx;
    							 node2 point;           //将此点的位置信息存入容器
    							 point.i1=temx;
    							 point.j1=temy;
    							 path.push_back(point);
    							count_bool++;
    							break;
    						}
    						else
    						{
    						   continue;
    						}
    					}
    					else if(temx+n3<=row-1||temx==row-1)
    					{
    						int count_true;          //可走的点数
    						int count_false;        //不可走的点数
    						count_true=0;
    						count_false=0;
    						for(int k=temx+1;k!=row;k++)
    						{
    							if(matrix[k][temy]->tag==true)
    							{
    								count_true++;
    							}
    							else
    							{
    								count_false++;
    							}
    						}
    						if(count_true>0&&count_false<9)        //如果当前位置上方9个点有未访问过的点则正常执行
    						{                      //防止上面有超过9个位置且与其上方连续9个都被访问过*****************
    							while(1)
    							{        
                                   if(matrix[temx+n3][temy]->tag==true)
    							   {
    								  matrix[temx][temy]->elem=n3;
    								   node2 point;           //将此点的位置信息存入容器
    							       point.i1=temx;
    							       point.j1=temy;
    							      path.push_back(point);
    						          matrix[temx][temy]->tag=false;
    						          temx=temx+n3;
    								  count_bool++;
    						          break; 
    							   }
    							   else
    							   {
    								   while(1)
    								   {      
    									    n3=1+rand()%9;
    									   if(temx+n3<row)
    									   {
    										   break;
    									   }
    									   else
    									   {
    										   continue;
    									   }
    								   }
    							   }
    							}
    						}
    						else             //如果当前位置上方所有的点都访问过了则转向
    						{
    							break;
    						}
    					 }
    					else
    				    {
    						continue;          //继续循环直至找出符合条件的数字
    					}
    			     }
    				break;
    			case 4:                        //代表左
    				while(1)
    				{                  
    				    n3=1+rand()%9;       //当行数大于等于10时,矩阵中的元素最大值为9 
                        if(count_bool==n2-1)
    					{
    						if(temy-n3==-1)
    						{
    							 matrix[temx][temy]->elem=n3;
    							  node2 point;           //将此点的位置信息存入容器
    							 point.i1=temx;
    							 point.j1=temy;
    							 path.push_back(point);
    							 count_bool++;
    							 break;
    						}
    						else if(temy-9>=0)
    					    {
    							matrix[temx][temy]->elem=temy+1;
    							 node2 point;           //将此点的位置信息存入容器
    							 point.i1=temx;
    							 point.j1=temy;
    							 path.push_back(point);
    							count_bool++;
    							break;
    						}
    						else
    						{
    						   continue;
    						}
    					}
    					else if(temy-n3>=0||temy==0)
    					{
    						int count_true;          //可走的点数
    						int count_false;        //不可走的点数
    						count_true=0;
    						count_false=0;
    						for(int k=0;k!=temy;k++)
    						{
    							if(matrix[temx][k]->tag==true)
    							{
    								count_true++;
    							}
    							else
    							{
    								count_false++;
    							}
    						}
    						if(count_true>0&&count_false<9)        //如果当前位置上方9个点有未访问过的点则正常执行
    						{                      //防止上面有超过9个位置且与其上方连续9个都被访问过*****************
    							while(1)
    							{           
                                   if(matrix[temx][temy-n3]->tag==true)
    							   {
    								  matrix[temx][temy]->elem=n3;
    								   node2 point;           //将此点的位置信息存入容器
    							       point.i1=temx;
    							       point.j1=temy;
    							      path.push_back(point);
    						          matrix[temx][temy]->tag=false;
    						          temy=temy-n3;
    								  count_bool++;
    						          break; 
    							   }
    							   else
    							   {
    								   while(1)
    								   {       
    									    n3=1+rand()%9;
    									   if(temy-n3>=0)
    									   {
    										   break;
    									   }
    									   else
    									   {
    										   continue;
    									   }
    								   }
    							   }
    							}
    						}
    						else             //如果当前位置上方所有的点都访问过了则转向
    						{
    							break;
    						}
    					 }
    					else
    				    {
    						continue;          //继续循环直至找出符合条件的数字
    					}
    			     }
    			}
    		}
    		for(int i=0;i!=row;i++)
    		{
    			for(int j=0;j!=column;j++)
    			{
    				int n5;
    				n5=1+rand()%9;       //当行数大于等于10时,矩阵中的元素最大值为9
    				if(matrix[i][j]->elem==-2)
    				{
    					matrix[i][j]->elem=n5;     //为那些没有被分配元素的位置分配元素
    				}
    				else
    				{
    					matrix[i][j]->tag=true;
    				}
    			}
    		}
    		
    	}
    void SkipOut::Check(int &nnrow,int mmcolumn,int &num)
    	{//1
    		front=0;                    //初始值
    		count=row*column;
    		quelist=new ptrn[row*column];             //分配存储空间
    		quelist[front]=new node;
    		quelist[front]->i=nnrow;                //起点入栈
    		quelist[front]->j=mmcolumn;
    		quelist[front]->pre=-2;
    		for(int ii=0;ii!=row;ii++)
    		{//2
    			for(int jj=0;jj!=column;jj++)
    			{//3
    				int temcount;
    				temcount=0;
    				front=1;
    				rear=0;
    				for(int iii=0;iii!=row;iii++)            
    				{//4
    					for(int jjj=0;jjj!=column;jjj++)
    					{//5
    						matrix[iii][jjj]->tag=true;//将矩阵matrix中的元素状态还原
    					}//5
    				}//4
    				matrix[nnrow][mmcolumn]->tag=false;//将起点的状态设置成已访问
    				if(ii-matrix[ii][jj]->elem==-1||jj+matrix[ii][jj]->elem==column||ii+matrix[ii][jj]->elem==row||jj-matrix[ii][jj]->elem==-1)
    				{//6     若当前点可以作为终点的话
    					while(1)
    					{//7     从起点开始搜索路径
    						  int nelem;                     //当前位置的元素值
                              nelem=matrix[quelist[rear]->i][quelist[rear]->j]->elem;
    						  if(quelist[rear]->i-nelem<-1&&quelist[rear]->j+nelem>column&&quelist[rear]->i+nelem>row&&quelist[rear]->j-nelem<-1)
    						  {//如果当前位置的周围均不可走
    							  if(rear==0)
    							  {//如果第一步就不可走
    								  break;
    							  }
    							  else
    							  {
    								  if(front!=rear+1)
    									  rear++;
    							  }
    						  }
    						  else
    						  {//8 如果当前位置周围有可走路径
    							   if(rear==0)
    							   {
    								   if(quelist[rear]->i-nelem==-1||quelist[rear]->j+nelem==column||quelist[rear]->i+nelem==row||quelist[rear]->j-nelem==-1)
    									   break;
    							   }
    							   if(quelist[rear]->i!=ii||quelist[rear]->j!=jj)
    						      {//如果没有到达终点则继续扫描
    							       if(quelist[rear]->i-nelem>=0)
    							        //当前位置的上部位置可走
    			                       {
    									 int ni=quelist[rear]->i;
    									 int nj=quelist[rear]->j;
    				                     if(matrix[ni-nelem][nj]->tag==true)
    					                 { //当前位置上方的路径可走
    										 matrix[ni-nelem][nj]->tag=false;
    				                         quelist[front]=new node;
    				                         quelist[front]->i=ni-nelem;
    				                         quelist[front]->j=nj;
    				                         quelist[front]->pre=rear;
    				                         front++;
    									 }
    			                       }
    			                       if(quelist[rear]->j+nelem<column)
    								    //当前位置的右边可走
    			                       { 
    									 int ni=quelist[rear]->i;
    									 int nj=quelist[rear]->j;
    									 if(matrix[ni][nj+nelem]->tag==true)//********************
    									 {
                                               matrix[ni][nj+nelem]->tag=false;
    			                               quelist[front]=new node;
    				                           quelist[front]->i=ni;
    				                           quelist[front]->j=nj+nelem;
    				                           quelist[front]->pre=rear;
    				                           front++;
    									 }
    					               
    		                           }
    			                       if(quelist[rear]->i+nelem<row)
    								   //当前位置的下方可走
    			                       {
    									 if(matrix[quelist[rear]->i+nelem][quelist[rear]->j]->tag==true)
    									 {
    										 int ni=quelist[rear]->i;
    									     int nj=quelist[rear]->j;
    										  matrix[ni+nelem][nj]->tag=false;
    				                          quelist[front]=new node;
    				                          quelist[front]->i=ni+nelem;
    				                          quelist[front]->j=nj;
    				                          quelist[front]->pre=rear;
    				                          front++;
    									 }
    					                 
    			                       }
    		                           if(quelist[rear]->j-nelem>=0)
    		                           {
    				                  //当前位置的左方可走
    									  if(matrix[quelist[rear]->i][quelist[rear]->j-nelem]->tag==true)
    									  {
    										   int ni=quelist[rear]->i;
    									       int nj=quelist[rear]->j;
    										    matrix[ni][nj-nelem]->tag=false;
    				                            quelist[front]=new node;
    				                            quelist[front]->i=ni;
    				                            quelist[front]->j=nj-nelem;
    											quelist[front]->pre=rear;
    				                            front++;
    									   }
    					               
    		                            }
    								    rear++;
    								  
    						      }
    						       else
    						      {//如果到达终点
    								  while(1)
    					             {//对路径计长
    					             	if(quelist[rear]->pre==-2)
    					              	{
    										temlist.push_back(quelist[rear]);
    						            	temcount++;
    						            	break;
    						            }
    						            else
    						            {
    										temlist.push_back(quelist[rear]);
    						            	temcount++;
    					               	}
    						            rear=quelist[rear]->pre;
    					             }
    					             if(temcount<count)
    					             {    //如果此路径较短 交换
    					            	count=temcount;
    									num=count;
    				                 }
    						 	     break;//跳出while
    						      }
    						  }//8
    						  if(front==rear+1)
    						  {//无路径
    							  break;
    						  }
    					}//7
    					
    				}//6
    				else
    				{  //如果当前点不能做终点的话继续用下一点
    					continue;
    				}
    			}//3
    		}//2
    	}//1
    void SkipOut::SinglePath(int &num)
    {                      //temlist中存放的数据形式为[3,2,1,6,3,5,2,1,8,6,4,5,1]
    	int cc;            //倒序着看其中1为起点,两个1之间是经过的路径,上述temlist存放了3条路径
    	    int size;      //temlist中元素个数
    		size=temlist.size();
    	    cc=1;            // 当前路径起始长度为0
    	    int k;         //temlist元素的下标
    	    k=size-2;        //下标范围
    	    bool AlreadyFind; //找出标志,如果已找出指定路径长度则为true否则为false;
    	    AlreadyFind=false;
    		/*for(int i=size-1;i!=-1;i--)
    		{
    			cout<<"["<<temlist[i]->i<<","<<temlist[i]->j<<"]  "<<'	';  //输出所有路径
    		}*/
    	    while(1)
    	    {               //每循环一次下标k减一
    		   if(temlist[size-1]->i==temlist[k]->i&&temlist[size-1]->j==temlist[k]->j&&k!=0)
    		   {      //当所访问的点与起点相同时,则说明这两个位置之间存有一条路径
    			   if(cc==num) //判断此路径与所要求的路径长度是否相同
    			   {           //如果相同,则不做操作
    				   AlreadyFind=true;
    				   cc=1;
    			   }
    			   else if(cc!=1)    //如果不同,则封死此路径,即将此路径最后一点置为零
    			   {
    				   int co;        //计数
                       co=0;
    				   for(int n5=0;n5!=path.size()-1;n5++)      //防止封死的那个点在随机产生的那条路径上
    				   {
    					   if(temlist[k+1]->i==path[n5].i1&&temlist[k+1]->j==path[n5].j1)
    					  {
    						  co++;
    					  }
    				   }
    				  if(co==0)
    				  {
    					   matrix[temlist[k+1]->i][temlist[k+1]->j]->elem=0;
    				  }
    				  // matrix[temlist[k+1]->i][temlist[k+1]->j]->elem=0;
    				   cc=1; //并将路径长度置为1,从新计算路径长度
    			   }
    		   }
    		   else if(k==0)//访问到第一个点时
    		   {
    			   if(AlreadyFind==true)//表示在前方搜索时已找出所指定路径
    			   {
    				   //matrix[temlist[k]->i][temlist[k]->j]->elem=0;//将此路径封死
    				   int co;        //计数
                       co=0;
    				   for(int n5=0;n5!=path.size()-1;n5++)      //防止封死的那个点在随机产生的那条路径上
    				   {
    					   if(temlist[k]->i==path[n5].i1&&temlist[k]->j==path[n5].j1)
    					  {
    						  co++;
    					  }
    				   }
    				  if(co==0)
    				  {
    					   matrix[temlist[k]->i][temlist[k]->j]->elem=0;
    				  }
    			   }
    			   //否则不问 ,说明最后一个路径长度即为指定路径
    			   break;   //跳出while循环
    		   }
    		   else
    		   {
    			   cc++;   //路径长度增加
    		   }
    		   k--;         //下标前移
    	   }
    }
    SkipOut::~SkipOut(void)
    {
    	/*delete []matrix;
    	delete []quelist;*/
    }
    //************************
    Win.h
    #pragma once
    
    
    // Win 对话框
    
    class Win : public CDialog
    {
    	DECLARE_DYNAMIC(Win)
    
    public:
    	Win(CWnd* pParent = NULL);   // 标准构造函数
    	virtual ~Win();
    
    // 对话框数据
    	enum { IDD = IDD_WIN };
    
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
    
    	DECLARE_MESSAGE_MAP()
    public:
    	afx_msg void OnBnClickedAgain();
    	afx_msg void OnBnClickedOk();
    	afx_msg void OnBnClickedCancel();
    };
    //*********************
    Win.cpp
    // Win.cpp : 实现文件
    //
    
    #include "stdafx.h"
    #include "NumSkip.h"
    #include "Win.h"
    #include "afxdialogex.h"
    #include"GameSet.h"
    
    // Win 对话框
    
    IMPLEMENT_DYNAMIC(Win, CDialog)
    
    Win::Win(CWnd* pParent /*=NULL*/)
    	: CDialog(Win::IDD, pParent)
    {
    
    }
    
    Win::~Win()
    {
    }
    
    void Win::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
    
    
    BEGIN_MESSAGE_MAP(Win, CDialog)
    	ON_BN_CLICKED(IDC_AGAIN, &Win::OnBnClickedAgain)
    	ON_BN_CLICKED(IDOK, &Win::OnBnClickedOk)
    	ON_BN_CLICKED(IDCANCEL, &Win::OnBnClickedCancel)
    END_MESSAGE_MAP()
    
    
    // Win 消息处理程序
    
    
    void Win::OnBnClickedAgain()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	
    	EndDialog(IDC_AGAIN);
    }
    
    
    void Win::OnBnClickedOk()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	
    	CDialog::OnOK();
    }
    
    
    void Win::OnBnClickedCancel()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	CDialog::OnCancel();
    }

  • 相关阅读:
    shell脚本:Kill掉MySQL中所有sleep的client线程
    为什么事务要提交或者回滚?
    MySQL 性能优化
    解决:Reading table information for completion of table and column names
    mysql distinct 用法详解及优化
    MySQL Profiling 的使用
    手把手教你用Strace诊断问题[转]
    mysql,命令导入导出表结构或数据
    八种架构设计模式及其优缺点概述(下)
    mysql多实例配置下,用脚本启动mysql时,出现Please read "Security" section of the manual to find out how to run mysqld as root!
  • 原文地址:https://www.cnblogs.com/zztong/p/6695276.html
Copyright © 2011-2022 走看看