|
這是掃雷算法的后臺數據處理,前臺的模擬按鍵和讀棋盤信息由按鍵精靈完成
解決了一個大家寫com組件時不能以數組做參數或返回值的難題
至于怎么處理的方法全在源碼中就不解釋了

- /*********************************************************************
- 歡迎您為按鍵精靈制作插件!
- 這是按鍵精靈的插件模板 091026版
- 請編譯Release版的插件使用,Debug版的插件會導致按鍵精靈出現異常錯誤
- 如果有其他問題,歡迎通過以下方式和我們取得聯系
- Email: hi@vrbrothers.com
- 論壇: bbs.ajjl.cn
-
- 插件模板更新記錄:
- 091026
- 解決由于MFC的功能不完善導致所有的插件函數都在主線程中執行的問題。
- 這個問題會導致插件效率低下,而且可能互相阻塞,甚至阻塞主線程。
- *********************************************************************/
- #include "stdafx.h"
- #include "CQMPlugin.h"
- #include "QMLibraryStub.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- BEGIN_MESSAGE_MAP(CQMPlugin, CCmdTarget)
- //{{AFX_MSG_MAP(CQMPlugin)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- #ifdef _DEBUG
- #pragma comment(lib,"CommonLibD.lib")
- #else
- #pragma comment(lib,"CommonLib.lib")
- #endif
- BEGIN_DISPATCH_MAP(CQMPlugin, CCmdTarget)
- DISP_FUNCTION(CQMPlugin, "Get_Plugin_Description", GetPluginDescription, VT_BSTR, VTS_BSTR)
- DISP_FUNCTION(CQMPlugin, "Get_Plugin_Interpret_Template", GetPluginInterpretTemplate, VT_BSTR, VTS_BSTR)
- //{{AFX_DISPATCH_MAP(CQMPlugin)
- DISP_FUNCTION(CQMPlugin, "tishi", tishi, VT_EMPTY, VTS_BSTR)
- DISP_FUNCTION(CQMPlugin, "leigeset", leigeset, VT_EMPTY, VTS_I4 VTS_I4 VTS_I4)
- DISP_FUNCTION(CQMPlugin, "leigeget", leigeget, VT_I4, VTS_I4 VTS_I4)
- DISP_FUNCTION(CQMPlugin, "leizhengjs", leizhengjs, VT_EMPTY, VTS_NONE)
- //}}AFX_DISPATCH_MAP
- END_DISPATCH_MAP()
- IMPLEMENT_OLECREATE(CQMPlugin, "QMPlugin.saoleiDLL", 0x1117E497, 0x126E, 0x4FC8, 0xB4, 0x30, 0x1C, 0x61, 0x43, 0x48, 0x4A, 0xA9)
- BOOL g_bEnablePluginValidate = TRUE;
- /*********************************************************************
- 按鍵精靈的每個插件可以支持若干條命令。
- 如果您需要寫一條自己的命令,需要遵循以下步驟:
- 1. 打開文件CQMPlugin.cpp,就是您現在看到的這個文件
- 2. 在Visual C++ 6.0的菜單中選擇 View->ClassWizard
- 3. 在彈出的對話框中選擇Automation面板,按Add Method按鈕
- 4. 依次填寫您的插件函數的名字、返回類型和參數類型
- 需要注意的是,如果返回值是字符串類型,請選擇BSTR
- 如果參數是字符串類型,請選擇LPCTSTR
- 如果需要傳地址的參數(可用于返回多個值),參數類型請選擇VARIANT*,如下面的GetScreenResolution插件函數所示
- 5. 按OK按鈕,您會看到CQMPlugin.cpp有了一個空白的函數,您只需要填寫函數功能即可
- 6. 您也可以在Automation面板中選擇刪除某個已有的函數,并同時在下面的程序中刪除對應的函數體
- 7. 在下面的m_DescriptionList表格中填寫您的插件說明和函數說明
- 8. 編譯形成DLL文件,把DLL文件放在按鍵精靈的Plugin目錄下
- 9. 打開按鍵精靈,進入編輯腳本界面,打開“插件命令”面板,編寫腳本測試你的插件!
- *********************************************************************/
- /*********************************************************************
- * 名稱:m_DescriptionList
- * 你可以把它看成一個表格,表格中的每一行代表了一條插件命令。
- * 每行第一個字符串是插件命令的名字(如果為空,則代表整個插件);第二個字符串是這條插件命令的解釋;
- * 第三個字符串是插件命令的顯示模板信息,其中的$1 $2 ... 等內容在顯示時將用第一個參數、第二個參數、... 代替
- * 當你需要新增一條插件命令的時候,就需要在表格里面加一行。
- *********************************************************************/
- CQMPlugin::DESCRIPTION_LIST CQMPlugin::m_DescriptionList[] =
- {
- {"","掃雷算法",""},
- {"tishi","彈窗提示","提示內容"},
- {"leigeset","設置雷格狀態","雷格Y坐標雷格X坐標雷格狀態值"},
- {"leigeget","返回雷格狀態","雷格Y坐標雷格X坐標"},
- {"leizhengjs","計算雷陣信息返回能翻開的雷格坐標",""},
- };
- //這行您不需要修改
- const int CQMPlugin::m_iDescriptionListSize = sizeof(CQMPlugin::m_DescriptionList) / sizeof(CQMPlugin::DESCRIPTION_LIST);
- /*********************************************************************
- * 下面是各個插件命令的處理函數,函數名和插件名是對應的。
- * 如果要增加一個插件命令,通常Visual C++會幫您寫一個空的處理函數
- * 如果要刪除一個插件命令,別忘了把對應的處理函數也一起刪掉。
- *********************************************************************/
- /*********************************************************************
- * 下面是公共處理函數。
- * OnLoad 函數會在插件被加載時調用,返回值通常為TRUE。如果返回FALSE,表示插件拒絕被加載
- * OnLoad 函數的第一個參數表示加載動態鏈接庫的Instance Handle,第二個參數暫時保留
- * OnExit 函數會在插件被卸載是調用,沒有返回值
- *********************************************************************/
- BOOL OnLoad(HMODULE hModule, int iReserved)
- {
- return TRUE;
- }
- void OnExit()
- {
- return;
- }
- //////////////////////////////////////////////////////////////////////
- // 掃雷算法插件
- // BY:DEBUG 2014/9/12
- //////////////////////////////////////////////////////////////////////
- void CQMPlugin::tishi(LPCTSTR str)
- {
- //提供一個彈窗口提示方法
- AfxMessageBox(str);
- }
- //////////////////////////////////////////////////////////////////////
- long leizheng[16][30]; //保存雷陣輸入信息的全局變量
- long leizhengout[16][30];//保存計算后雷陣的輸出信息
- /////////////////////////////////////////////////////////////////////
- void CQMPlugin::leigeset(long Y, long X, long zhi)
- {
- // 提供設置雷格信息的方法
- leizheng[Y][X]=zhi;
- }
- //////////////////////////////////////////////////////////////////////
- long CQMPlugin::leigeget(long Y, long X)
- {
- // 提供返回計算后的雷格信息的方法 88表示能翻開 44表示確定為雷格提示標記 0不做任何操作
- // 必須先調用計算雷陣方法后再掉用這個方法
- return leizhengout[Y][X];
- }
- //////////////////////////////////////////////////////////////////////
- void CQMPlugin::leizhengjs()
- {
- // 提供一個雷陣信息計算的方法,在對象獲取玩所有雷格信息后才能調用此方法
- long i;
- long j;
- for(i=0;i<16;i++)
- for(j=0;j<30;j++)
- {
- //清零輸出數組
- leizhengout[i][j]=0;
- }
- //開始判定翻開與否
- for(i=0;i<16;i++)
- for(j=0;j<30;j++)
- {
- if(i>=1&&j>=1&&i<=14&&j<=28)
- {
- //不是邊界上的4行
- long leibiao=0;//周邊已經確定的地雷個數
- //統計九宮格內地雷的個數
- if(leizheng[i-1][j-1]==9) leibiao++;//左上
- if(leizheng[i-1][j]==9) leibiao++;//上
- if(leizheng[i-1][j+1]==9) leibiao++;//右上
- if(leizheng[i][j-1]==9) leibiao++;//左
- if(leizheng[i][j+1]==9) leibiao++;//右
- if(leizheng[i+1][j-1]==9) leibiao++;//左下
- if(leizheng[i+1][j]==9) leibiao++;//下
- if(leizheng[i+1][j+1]==9) leibiao++;//左下
- long hei=0;//周邊未翻開的雷格數
- //統計九宮格內未翻開的雷格數
- if(leizheng[i-1][j-1]==10) hei++;//左上
- if(leizheng[i-1][j]==10) hei++;//上
- if(leizheng[i-1][j+1]==10) hei++;//右上
- if(leizheng[i][j-1]==10) hei++;//左
- if(leizheng[i][j+1]==10) hei++;//右
- if(leizheng[i+1][j-1]==10) hei++;//左下
- if(leizheng[i+1][j]==10) hei++;//下
- if(leizheng[i+1][j+1]==10) hei++;//左下
- ////////////////////////////////////////////////
- if(leizheng[i][j]==1&&hei==1)
- {
- //周圍只有一個雷且周圍只剩一個未翻開的雷格確定一個地雷并在輸出數組中做標記
- if(leizheng[i-1][j-1]==10) leizhengout[i-1][j-1]=44;//左上
- if(leizheng[i-1][j]==10) leizhengout[i-1][j]=44;//上
- if(leizheng[i-1][j+1]==10) leizhengout[i-1][j+1]=44;//右上
- if(leizheng[i][j-1]==10) leizhengout[i][j-1]=44;//左
- if(leizheng[i][j+1]==10) leizhengout[i][j+1]=44;//右
- if(leizheng[i+1][j-1]==10) leizhengout[i+1][j-1]=44;//左下
- if(leizheng[i+1][j]==10) leizhengout[i+1][j]=44;//下
- if(leizheng[i+1][j+1]==10) leizhengout[i+1][j+1]=44;//左下
- }
- if(leizheng[i][j]==1&&leibiao==1)
- {
- //周圍只有一個雷且周圍已經標記了一個地雷就把周圍其它未翻開的雷格翻開
- if(leizheng[i-1][j-1]==10) leizhengout[i-1][j-1]=88;//左上
- if(leizheng[i-1][j]==10) leizhengout[i-1][j]=88;//上
- if(leizheng[i-1][j+1]==10) leizhengout[i-1][j+1]=88;//右上
- if(leizheng[i][j-1]==10) leizhengout[i][j-1]=88;//左
- if(leizheng[i][j+1]==10) leizhengout[i][j+1]=88;//右
- if(leizheng[i+1][j-1]==10) leizhengout[i+1][j-1]=88;//左下
- if(leizheng[i+1][j]==10) leizhengout[i+1][j]=88;//下
- if(leizheng[i+1][j+1]==10) leizhengout[i+1][j+1]=88;//左下
- }
- ////////////////////////////////////////////////////////////////
- if((leizheng[i][j]==2&&hei==2&&leibiao==0)||(leizheng[i][j]==(leibiao+hei)))
- {
- //周圍只有2個雷且周圍只剩2個未翻開的雷格,或者周圍未翻開和已經標記為地雷的和等于雷格狀態值則確定一組地雷并在輸出數組中做標記
- if(leizheng[i-1][j-1]==10) leizhengout[i-1][j-1]=44;//左上
- if(leizheng[i-1][j]==10) leizhengout[i-1][j]=44;//上
- if(leizheng[i-1][j+1]==10) leizhengout[i-1][j+1]=44;//右上
- if(leizheng[i][j-1]==10) leizhengout[i][j-1]=44;//左
- if(leizheng[i][j+1]==10) leizhengout[i][j+1]=44;//右
- if(leizheng[i+1][j-1]==10) leizhengout[i+1][j-1]=44;//左下
- if(leizheng[i+1][j]==10) leizhengout[i+1][j]=44;//下
- if(leizheng[i+1][j+1]==10) leizhengout[i+1][j+1]=44;//左下
- }
- if(leizheng[i][j]==2&&leibiao==2)
- {
- //周圍只有2個雷且周圍已經標記了2個地雷就把周圍其它未翻開的雷格翻開
- if(leizheng[i-1][j-1]==10) leizhengout[i-1][j-1]=88;//左上
- if(leizheng[i-1][j]==10) leizhengout[i-1][j]=88;//上
- if(leizheng[i-1][j+1]==10) leizhengout[i-1][j+1]=88;//右上
- if(leizheng[i][j-1]==10) leizhengout[i][j-1]=88;//左
- if(leizheng[i][j+1]==10) leizhengout[i][j+1]=88;//右
- if(leizheng[i+1][j-1]==10) leizhengout[i+1][j-1]=88;//左下
- if(leizheng[i+1][j]==10) leizhengout[i+1][j]=88;//下
- if(leizheng[i+1][j+1]==10) leizhengout[i+1][j+1]=88;//左下
- }
- ////////////////////////////////////////////////////////////////////
- if((leizheng[i][j]==3&&hei==3&&leibiao==0)||(leizheng[i][j]==(leibiao+hei)))
- {
- //周圍只有3個雷且周圍只剩3個未翻開的雷格,或者周圍未翻開和已經標記為地雷的和等于雷格狀態值則確定一組地雷并在輸出數組中做標記
- if(leizheng[i-1][j-1]==10) leizhengout[i-1][j-1]=44;//左上
- if(leizheng[i-1][j]==10) leizhengout[i-1][j]=44;//上
- if(leizheng[i-1][j+1]==10) leizhengout[i-1][j+1]=44;//右上
- if(leizheng[i][j-1]==10) leizhengout[i][j-1]=44;//左
- if(leizheng[i][j+1]==10) leizhengout[i][j+1]=44;//右
- if(leizheng[i+1][j-1]==10) leizhengout[i+1][j-1]=44;//左下
- if(leizheng[i+1][j]==10) leizhengout[i+1][j]=44;//下
- if(leizheng[i+1][j+1]==10) leizhengout[i+1][j+1]=44;//左下
- }
- if(leizheng[i][j]==3&&leibiao==3)
- {
- //周圍只有3個雷且周圍已經標記了3個地雷就把周圍其它未翻開的雷格翻開
- if(leizheng[i-1][j-1]==10) leizhengout[i-1][j-1]=88;//左上
- if(leizheng[i-1][j]==10) leizhengout[i-1][j]=88;//上
- if(leizheng[i-1][j+1]==10) leizhengout[i-1][j+1]=88;//右上
- if(leizheng[i][j-1]==10) leizhengout[i][j-1]=88;//左
- if(leizheng[i][j+1]==10) leizhengout[i][j+1]=88;//右
- if(leizheng[i+1][j-1]==10) leizhengout[i+1][j-1]=88;//左下
- if(leizheng[i+1][j]==10) leizhengout[i+1][j]=88;//下
- if(leizheng[i+1][j+1]==10) leizhengout[i+1][j+1]=88;//左下
- }
- ////////////////////////////////////////////////////////////////////
- if((leizheng[i][j]==4&&hei==4&&leibiao==0)||(leizheng[i][j]==(leibiao+hei)))
- {
- //周圍只有4個雷且周圍只剩4個未翻開的雷格,或者周圍未翻開和已經標記為地雷的和等于雷格狀態值則確定一組地雷并在輸出數組中做標記
- if(leizheng[i-1][j-1]==10) leizhengout[i-1][j-1]=44;//左上
- if(leizheng[i-1][j]==10) leizhengout[i-1][j]=44;//上
- if(leizheng[i-1][j+1]==10) leizhengout[i-1][j+1]=44;//右上
- if(leizheng[i][j-1]==10) leizhengout[i][j-1]=44;//左
- if(leizheng[i][j+1]==10) leizhengout[i][j+1]=44;//右
- if(leizheng[i+1][j-1]==10) leizhengout[i+1][j-1]=44;//左下
- if(leizheng[i+1][j]==10) leizhengout[i+1][j]=44;//下
- if(leizheng[i+1][j+1]==10) leizhengout[i+1][j+1]=44;//左下
- }
- if(leizheng[i][j]==4&&leibiao==4)
- {
- //周圍只有4個雷且周圍已經標記了4個地雷就把周圍其它未翻開的雷格翻開
- if(leizheng[i-1][j-1]==10) leizhengout[i-1][j-1]=88;//左上
- if(leizheng[i-1][j]==10) leizhengout[i-1][j]=88;//上
- if(leizheng[i-1][j+1]==10) leizhengout[i-1][j+1]=88;//右上
- if(leizheng[i][j-1]==10) leizhengout[i][j-1]=88;//左
- if(leizheng[i][j+1]==10) leizhengout[i][j+1]=88;//右
- if(leizheng[i+1][j-1]==10) leizhengout[i+1][j-1]=88;//左下
- if(leizheng[i+1][j]==10) leizhengout[i+1][j]=88;//下
- if(leizheng[i+1][j+1]==10) leizhengout[i+1][j+1]=88;//左下
- }
- ////////////////////////////////////////////////////////////////////
- if((leizheng[i][j]==5&&hei==5&&leibiao==0)||(leizheng[i][j]==(leibiao+hei)))
- {
- //周圍只有5個雷且周圍只剩5個未翻開的雷格,或者周圍未翻開和已經標記為地雷的和等于雷格狀態值則確定一組地雷并在輸出數組中做標記
- if(leizheng[i-1][j-1]==10) leizhengout[i-1][j-1]=44;//左上
- if(leizheng[i-1][j]==10) leizhengout[i-1][j]=44;//上
- if(leizheng[i-1][j+1]==10) leizhengout[i-1][j+1]=44;//右上
- if(leizheng[i][j-1]==10) leizhengout[i][j-1]=44;//左
- if(leizheng[i][j+1]==10) leizhengout[i][j+1]=44;//右
- if(leizheng[i+1][j-1]==10) leizhengout[i+1][j-1]=44;//左下
- if(leizheng[i+1][j]==10) leizhengout[i+1][j]=44;//下
- if(leizheng[i+1][j+1]==10) leizhengout[i+1][j+1]=44;//左下
- }
- if(leizheng[i][j]==5&&leibiao==5)
- {
- //周圍只有5個雷且周圍已經標記了5個地雷就把周圍其它未翻開的雷格翻開
- if(leizheng[i-1][j-1]==10) leizhengout[i-1][j-1]=88;//左上
- if(leizheng[i-1][j]==10) leizhengout[i-1][j]=88;//上
- if(leizheng[i-1][j+1]==10) leizhengout[i-1][j+1]=88;//右上
- if(leizheng[i][j-1]==10) leizhengout[i][j-1]=88;//左
- if(leizheng[i][j+1]==10) leizhengout[i][j+1]=88;//右
- if(leizheng[i+1][j-1]==10) leizhengout[i+1][j-1]=88;//左下
- if(leizheng[i+1][j]==10) leizhengout[i+1][j]=88;//下
- if(leizheng[i+1][j+1]==10) leizhengout[i+1][j+1]=88;//左下
- }
- ////////////////////////////////////////////////////////////////////
- if((leizheng[i][j]==6&&hei==6&&leibiao==0)||(leizheng[i][j]==(leibiao+hei)))
- {
- //周圍只有6個雷且周圍只剩6個未翻開的雷格,或者周圍未翻開和已經標記為地雷的和等于雷格狀態值則確定一組地雷并在輸出數組中做標記
- if(leizheng[i-1][j-1]==10) leizhengout[i-1][j-1]=44;//左上
- if(leizheng[i-1][j]==10) leizhengout[i-1][j]=44;//上
- if(leizheng[i-1][j+1]==10) leizhengout[i-1][j+1]=44;//右上
- if(leizheng[i][j-1]==10) leizhengout[i][j-1]=44;//左
- if(leizheng[i][j+1]==10) leizhengout[i][j+1]=44;//右
- if(leizheng[i+1][j-1]==10) leizhengout[i+1][j-1]=44;//左下
- if(leizheng[i+1][j]==10) leizhengout[i+1][j]=44;//下
- if(leizheng[i+1][j+1]==10) leizhengout[i+1][j+1]=44;//左下
- }
- if(leizheng[i][j]==6&&leibiao==6)
- {
- //周圍只有6個雷且周圍已經標記了6個地雷就把周圍其它未翻開的雷格翻開
- if(leizheng[i-1][j-1]==10) leizhengout[i-1][j-1]=88;//左上
- if(leizheng[i-1][j]==10) leizhengout[i-1][j]=88;//上
- if(leizheng[i-1][j+1]==10) leizhengout[i-1][j+1]=88;//右上
- if(leizheng[i][j-1]==10) leizhengout[i][j-1]=88;//左
- if(leizheng[i][j+1]==10) leizhengout[i][j+1]=88;//右
- if(leizheng[i+1][j-1]==10) leizhengout[i+1][j-1]=88;//左下
- if(leizheng[i+1][j]==10) leizhengout[i+1][j]=88;//下
- if(leizheng[i+1][j+1]==10) leizhengout[i+1][j+1]=88;//左下
- }
- ////////////////////////////////////////////////////////////////////
- if((leizheng[i][j]==7&&hei==7&&leibiao==0)||(leizheng[i][j]==(leibiao+hei)))
- {
- //周圍只有7個雷且周圍只剩7個未翻開的雷格,或者周圍未翻開和已經標記為地雷的和等于雷格狀態值則確定一組地雷并在輸出數組中做標記
- if(leizheng[i-1][j-1]==10) leizhengout[i-1][j-1]=44;//左上
- if(leizheng[i-1][j]==10) leizhengout[i-1][j]=44;//上
- if(leizheng[i-1][j+1]==10) leizhengout[i-1][j+1]=44;//右上
- if(leizheng[i][j-1]==10) leizhengout[i][j-1]=44;//左
- if(leizheng[i][j+1]==10) leizhengout[i][j+1]=44;//右
- if(leizheng[i+1][j-1]==10) leizhengout[i+1][j-1]=44;//左下
- if(leizheng[i+1][j]==10) leizhengout[i+1][j]=44;//下
- if(leizheng[i+1][j+1]==10) leizhengout[i+1][j+1]=44;//左下
- }
- if(leizheng[i][j]==7&&leibiao==7)
- {
- //周圍只有7個雷且周圍已經標記了7個地雷就把周圍其它未翻開的雷格翻開
- if(leizheng[i-1][j-1]==10) leizhengout[i-1][j-1]=88;//左上
- if(leizheng[i-1][j]==10) leizhengout[i-1][j]=88;//上
- if(leizheng[i-1][j+1]==10) leizhengout[i-1][j+1]=88;//右上
- if(leizheng[i][j-1]==10) leizhengout[i][j-1]=88;//左
- if(leizheng[i][j+1]==10) leizhengout[i][j+1]=88;//右
- if(leizheng[i+1][j-1]==10) leizhengout[i+1][j-1]=88;//左下
- if(leizheng[i+1][j]==10) leizhengout[i+1][j]=88;//下
- if(leizheng[i+1][j+1]==10) leizhengout[i+1][j+1]=88;//左下
- }
- }
- }
- }
復制代碼
|
|