SkipOut游戏实现代码
来源:互联网 发布:w8系统优化软件 编辑:程序博客网 时间:2024/05/19 08:04
头文件:GameSet.hLose.hNumSkipDoc.hNumSkipView.hSkipOut.hWin.h源文件:GameSet.cppLose.cppNumSkipDoc.cppNumSkipView.cppSkipOut.cppWin.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_HANDLERSvirtual void InitializeSearchContent();virtual void OnDrawThumbnail(CDC& dc, LPRECT lprcBounds);#endif // SHARED_HANDLERS// 实现public:virtual ~CNumSkipDoc();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected:// 生成的消息映射函数protected:DECLARE_MESSAGE_MAP()#ifdef SHARED_HANDLERS// 用于为搜索处理程序设置搜索内容的 Helper 函数void SetSearchContent(const CString& value);#endif // SHARED_HANDLERSpublic: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// CNumSkipDocIMPLEMENT_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; //上一位置横坐标,刚开始为0PrePositionY=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 _DEBUGvoid 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 _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected:// 生成的消息映射函数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// CNumSkipViewIMPLEMENT_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_HANDLERSAFXPrintPreview(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_HANDLERStheApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);#endif}// CNumSkipView 诊断#ifdef _DEBUGvoid 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(); } elsePostQuitMessage(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); }}elsePostQuitMessage(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();} elsePostQuitMessage(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); }}elsePostQuitMessage(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();} elsePostQuitMessage(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); }}elsePostQuitMessage(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();} elsePostQuitMessage(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); }}elsePostQuitMessage(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){//1case 1: //代表上 while(1) //循环用以选出合适的数字{//2 n3=1+rand()%9; //矩阵中的元素最大值为9if(count_bool==n2-1) //当为路径中最后一点时{//3if(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;}}//3else if(temx-n3>=0||temx==0){//4int 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++;elsecount_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}//5else //如果当前位置上方所有的点都访问过了则转向{break;}}//4else{continue;} }//2break;case 2: //代表右 while(1){ n3=1+rand()%9; //当行数大于等于10时,矩阵中的元素最大值为9if(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时,矩阵中的元素最大值为9if(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){//1front=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++){//2for(int jj=0;jj!=column;jj++){//3int temcount;temcount=0;front=1;rear=0;for(int iii=0;iii!=row;iii++) {//4for(int jjj=0;jjj!=column;jjj++){//5matrix[iii][jjj]->tag=true;//将矩阵matrix中的元素状态还原}//5}//4matrix[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}//6else{ //如果当前点不能做终点的话继续用下一点continue;}}//3}//2}//1void 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<<"] "<<'\t'; //输出所有路径}*/ 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();}
0 0
- SkipOut游戏实现代码
- C 迷宫游戏代码实现
- 应用:《迷宫》游戏代码实现
- 俄罗斯方块游戏60行代码实现
- html5实现的盲打高手游戏代码
- 265行代码实现第一人称游戏引擎
- 265行代码实现第一人称游戏引擎
- Windows Phone 8 本地代码实现游戏
- html5实现的盲打高手游戏代码
- java代码实现猜数字游戏
- JavaScript jQuery实现Tetris(俄罗斯方块)游戏代码
- 吊死鬼游戏Hangman游戏的C语言实现代码
- 游戏碰撞之OBB算法实现(java代码实现)
- 88行代码实现俄罗斯方块游戏(含讲解)
- 百行 HTML5 代码实现四种双人对弈游戏
- 63行代码完美实现html5 贪吃蛇游戏
- 编程实现贪吃蛇游戏界面的主要代码
- 连连看游戏核心代码(C++实现)
- 输出长方体的体积和表面积
- CakePHP的Auth组件
- hadoop集群安装
- AES 加密 应该对大家有用
- 使用 Google AutoValue 自动生成代码
- SkipOut游戏实现代码
- C#:一个增强的TcpListener(*)服务器演示程序及源代码下载
- poj 2081 Recaman's Sequence
- 那些年的IOS系统以及经典改革
- Linux 进程控制
- 设计模式总结之工厂模式
- PAT乙级—1031. 查验身份证(15)-native
- Java的重载与重写
- Java中的匿名对象