標(biāo)題:
掃雷AI核心代碼(不讀內(nèi)存完全擬人按數(shù)字邏輯去解)
[打印本頁]
作者:
liuyy
時(shí)間:
2015-1-11 19:53
標(biāo)題:
掃雷AI核心代碼(不讀內(nèi)存完全擬人按數(shù)字邏輯去解)
這是掃雷算法的后臺(tái)數(shù)據(jù)處理,前臺(tái)的模擬按鍵和讀棋盤信息由按鍵精靈完成
解決了一個(gè)大家寫com組件時(shí)不能以數(shù)組做參數(shù)或返回值的難題
至于怎么處理的方法全在源碼中就不解釋了
/*********************************************************************
歡迎您為按鍵精靈制作插件!
這是按鍵精靈的插件模板 091026版
請(qǐng)編譯Release版的插件使用,Debug版的插件會(huì)導(dǎo)致按鍵精靈出現(xiàn)異常錯(cuò)誤
如果有其他問題,歡迎通過以下方式和我們?nèi)〉寐?lián)系
Email: hi@vrbrothers.com
論壇: bbs.ajjl.cn
插件模板更新記錄:
091026
解決由于MFC的功能不完善導(dǎo)致所有的插件函數(shù)都在主線程中執(zhí)行的問題。
這個(gè)問題會(huì)導(dǎo)致插件效率低下,而且可能互相阻塞,甚至阻塞主線程。
*********************************************************************/
#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;
/*********************************************************************
按鍵精靈的每個(gè)插件可以支持若干條命令。
如果您需要寫一條自己的命令,需要遵循以下步驟:
1. 打開文件CQMPlugin.cpp,就是您現(xiàn)在看到的這個(gè)文件
2. 在Visual C++ 6.0的菜單中選擇 View->ClassWizard
3. 在彈出的對(duì)話框中選擇Automation面板,按Add Method按鈕
4. 依次填寫您的插件函數(shù)的名字、返回類型和參數(shù)類型
需要注意的是,如果返回值是字符串類型,請(qǐng)選擇BSTR
如果參數(shù)是字符串類型,請(qǐng)選擇LPCTSTR
如果需要傳地址的參數(shù)(可用于返回多個(gè)值),參數(shù)類型請(qǐng)選擇VARIANT*,如下面的GetScreenResolution插件函數(shù)所示
5. 按OK按鈕,您會(huì)看到CQMPlugin.cpp有了一個(gè)空白的函數(shù),您只需要填寫函數(shù)功能即可
6. 您也可以在Automation面板中選擇刪除某個(gè)已有的函數(shù),并同時(shí)在下面的程序中刪除對(duì)應(yīng)的函數(shù)體
7. 在下面的m_DescriptionList表格中填寫您的插件說明和函數(shù)說明
8. 編譯形成DLL文件,把DLL文件放在按鍵精靈的Plugin目錄下
9. 打開按鍵精靈,進(jìn)入編輯腳本界面,打開“插件命令”面板,編寫腳本測(cè)試你的插件!
*********************************************************************/
/*********************************************************************
* 名稱:m_DescriptionList
* 你可以把它看成一個(gè)表格,表格中的每一行代表了一條插件命令。
* 每行第一個(gè)字符串是插件命令的名字(如果為空,則代表整個(gè)插件);第二個(gè)字符串是這條插件命令的解釋;
* 第三個(gè)字符串是插件命令的顯示模板信息,其中的$1 $2 ... 等內(nèi)容在顯示時(shí)將用第一個(gè)參數(shù)、第二個(gè)參數(shù)、... 代替
* 當(dāng)你需要新增一條插件命令的時(shí)候,就需要在表格里面加一行。
*********************************************************************/
CQMPlugin::DESCRIPTION_LIST CQMPlugin::m_DescriptionList[] =
{
{"","掃雷算法",""},
{"tishi","彈窗提示","提示內(nèi)容"},
{"leigeset","設(shè)置雷格狀態(tài)","雷格Y坐標(biāo)雷格X坐標(biāo)雷格狀態(tài)值"},
{"leigeget","返回雷格狀態(tài)","雷格Y坐標(biāo)雷格X坐標(biāo)"},
{"leizhengjs","計(jì)算雷陣信息返回能翻開的雷格坐標(biāo)",""},
};
//這行您不需要修改
const int CQMPlugin::m_iDescriptionListSize = sizeof(CQMPlugin::m_DescriptionList) / sizeof(CQMPlugin::DESCRIPTION_LIST);
/*********************************************************************
* 下面是各個(gè)插件命令的處理函數(shù),函數(shù)名和插件名是對(duì)應(yīng)的。
* 如果要增加一個(gè)插件命令,通常Visual C++會(huì)幫您寫一個(gè)空的處理函數(shù)
* 如果要?jiǎng)h除一個(gè)插件命令,別忘了把對(duì)應(yīng)的處理函數(shù)也一起刪掉。
*********************************************************************/
/*********************************************************************
* 下面是公共處理函數(shù)。
* OnLoad 函數(shù)會(huì)在插件被加載時(shí)調(diào)用,返回值通常為TRUE。如果返回FALSE,表示插件拒絕被加載
* OnLoad 函數(shù)的第一個(gè)參數(shù)表示加載動(dòng)態(tài)鏈接庫的Instance Handle,第二個(gè)參數(shù)暫時(shí)保留
* OnExit 函數(shù)會(huì)在插件被卸載是調(diào)用,沒有返回值
*********************************************************************/
BOOL OnLoad(HMODULE hModule, int iReserved)
{
return TRUE;
}
void OnExit()
{
return;
}
//////////////////////////////////////////////////////////////////////
// 掃雷算法插件
// BY:DEBUG 2014/9/12
//////////////////////////////////////////////////////////////////////
void CQMPlugin::tishi(LPCTSTR str)
{
//提供一個(gè)彈窗口提示方法
AfxMessageBox(str);
}
//////////////////////////////////////////////////////////////////////
long leizheng[16][30]; //保存雷陣輸入信息的全局變量
long leizhengout[16][30];//保存計(jì)算后雷陣的輸出信息
/////////////////////////////////////////////////////////////////////
void CQMPlugin::leigeset(long Y, long X, long zhi)
{
// 提供設(shè)置雷格信息的方法
leizheng[Y][X]=zhi;
}
//////////////////////////////////////////////////////////////////////
long CQMPlugin::leigeget(long Y, long X)
{
// 提供返回計(jì)算后的雷格信息的方法 88表示能翻開 44表示確定為雷格提示標(biāo)記 0不做任何操作
// 必須先調(diào)用計(jì)算雷陣方法后再掉用這個(gè)方法
return leizhengout[Y][X];
}
//////////////////////////////////////////////////////////////////////
void CQMPlugin::leizhengjs()
{
// 提供一個(gè)雷陣信息計(jì)算的方法,在對(duì)象獲取玩所有雷格信息后才能調(diào)用此方法
long i;
long j;
for(i=0;i<16;i++)
for(j=0;j<30;j++)
{
//清零輸出數(shù)組
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;//周邊已經(jīng)確定的地雷個(gè)數(shù)
//統(tǒng)計(jì)九宮格內(nèi)地雷的個(gè)數(shù)
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;//周邊未翻開的雷格數(shù)
//統(tǒng)計(jì)九宮格內(nèi)未翻開的雷格數(shù)
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)
{
//周圍只有一個(gè)雷且周圍只剩一個(gè)未翻開的雷格確定一個(gè)地雷并在輸出數(shù)組中做標(biāo)記
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)
{
//周圍只有一個(gè)雷且周圍已經(jīng)標(biāo)記了一個(gè)地雷就把周圍其它未翻開的雷格翻開
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個(gè)雷且周圍只剩2個(gè)未翻開的雷格,或者周圍未翻開和已經(jīng)標(biāo)記為地雷的和等于雷格狀態(tài)值則確定一組地雷并在輸出數(shù)組中做標(biāo)記
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個(gè)雷且周圍已經(jīng)標(biāo)記了2個(gè)地雷就把周圍其它未翻開的雷格翻開
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個(gè)雷且周圍只剩3個(gè)未翻開的雷格,或者周圍未翻開和已經(jīng)標(biāo)記為地雷的和等于雷格狀態(tài)值則確定一組地雷并在輸出數(shù)組中做標(biāo)記
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個(gè)雷且周圍已經(jīng)標(biāo)記了3個(gè)地雷就把周圍其它未翻開的雷格翻開
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個(gè)雷且周圍只剩4個(gè)未翻開的雷格,或者周圍未翻開和已經(jīng)標(biāo)記為地雷的和等于雷格狀態(tài)值則確定一組地雷并在輸出數(shù)組中做標(biāo)記
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個(gè)雷且周圍已經(jīng)標(biāo)記了4個(gè)地雷就把周圍其它未翻開的雷格翻開
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個(gè)雷且周圍只剩5個(gè)未翻開的雷格,或者周圍未翻開和已經(jīng)標(biāo)記為地雷的和等于雷格狀態(tài)值則確定一組地雷并在輸出數(shù)組中做標(biāo)記
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個(gè)雷且周圍已經(jīng)標(biāo)記了5個(gè)地雷就把周圍其它未翻開的雷格翻開
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個(gè)雷且周圍只剩6個(gè)未翻開的雷格,或者周圍未翻開和已經(jīng)標(biāo)記為地雷的和等于雷格狀態(tài)值則確定一組地雷并在輸出數(shù)組中做標(biāo)記
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個(gè)雷且周圍已經(jīng)標(biāo)記了6個(gè)地雷就把周圍其它未翻開的雷格翻開
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個(gè)雷且周圍只剩7個(gè)未翻開的雷格,或者周圍未翻開和已經(jīng)標(biāo)記為地雷的和等于雷格狀態(tài)值則確定一組地雷并在輸出數(shù)組中做標(biāo)記
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個(gè)雷且周圍已經(jīng)標(biāo)記了7個(gè)地雷就把周圍其它未翻開的雷格翻開
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;//左下
}
}
}
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1