114培訓(xùn)網(wǎng)歡迎您來(lái)到游戲設(shè)計(jì)交流中心!

400-850-8622

全國(guó)統(tǒng)一學(xué)習(xí)專線 9:00-21:00

掃雷算法,自然語(yǔ)文或流程圖描述均可

一般都*個(gè)都是隨便點(diǎn)的,

然后就開始計(jì)算了,

這處1、1、1說(shuō)明有一個(gè)炸彈,三個(gè)一可以確定角山是一個(gè)炸彈,那就點(diǎn)開剩下的,

就變成這樣了,有數(shù)字2就說(shuō)明那里有兩個(gè)炸彈,確定兩個(gè)炸彈位置,其他與2相接的肯定不是炸彈? 以此類推? 就會(huì)出結(jié)果了。

剩下的,你來(lái)推敲吧

JAVA代碼解釋及流程圖 有會(huì)編JAVA的 講一掃雷游戲的題 將明白的分都給你

掃雷游戲的算法概述:
你可以把地雷所在的區(qū)域抽象成一個(gè)二維數(shù)組。數(shù)組里的元素是該地周圍的雷數(shù)。然后根據(jù)玩家所設(shè)定的地雷個(gè)數(shù)用一個(gè)隨機(jī)數(shù)生成器來(lái)撒雷。有雷的地方可以用-1來(lái)表示,沒(méi)有雷的地方在撒雷的時(shí)候數(shù)它旁邊的雷數(shù),然后將值填入對(duì)應(yīng)的數(shù)組元素里。這樣,你的雷陣已經(jīng)部署完畢。
接下來(lái)是玩家的操作了。如果你有仔細(xì)觀察的話,當(dāng)你點(diǎn)擊一個(gè)位置的是后發(fā)生的情況有3種:
1. 如果該處有雷的話,很簡(jiǎn)單,游戲結(jié)束
2. 如果該處沒(méi)有雷,但是這個(gè)地方附近有至少一個(gè)雷的話,只將當(dāng)前的位置周圍雷數(shù)顯示出來(lái)。
3. 如果該處沒(méi)有雷,并且附近也沒(méi)有雷的話,就用一個(gè)循環(huán)或是遞歸的方法將它四周的沒(méi)有雷的地方也顯示出來(lái)。如果他四周的位置的四周也沒(méi)有雷的話,繼續(xù)這個(gè)過(guò)程,知道四周至少有一個(gè)雷時(shí)候停止。
玩家事件的處理:
玩家的事件有三種:?jiǎn)螕簦笥益I同時(shí)點(diǎn)擊,和右擊。
單擊可以想象成走到該處,如果有雷的話就游戲結(jié)束,沒(méi)有的話就根據(jù)我以上講的三點(diǎn)來(lái)判斷該做什么。
左右鍵同時(shí)點(diǎn)擊的話就將該處四周可能有雷的地方顯示出來(lái),如果玩家錯(cuò)將沒(méi)有雷的地方放了小紅旗的話,游戲結(jié)束。
右擊是放小紅旗。
當(dāng)所有雷都被清楚的時(shí)候,游戲結(jié)束,玩家勝利。

Windows掃雷*步,先戳哪里*效

Windows系統(tǒng)保證了掃雷的*步無(wú)論點(diǎn)擊哪個(gè)方塊都是安全的。一名普通玩家一上來(lái)大概會(huì)很隨意地點(diǎn)擊一個(gè)方塊,反正不曉得哪個(gè)是雷又肯定是安全的,點(diǎn)哪不一樣。但對(duì)高手來(lái)說(shuō),卻是每一步都要運(yùn)籌帷幄。
在掃雷游戲中,如果你點(diǎn)擊的方塊附近都沒(méi)有地雷,點(diǎn)擊的后果就是一片沒(méi)有雷的區(qū)域瞬間展開了,然后我們就可以根據(jù)區(qū)域邊緣的數(shù)字慢慢排雷。
于是問(wèn)題來(lái)了:*步點(diǎn)擊什么位置碰到安全區(qū)域的幾率更大?是角、邊還是中間?這當(dāng)然需要算一算。
金角銀邊草肚皮
首先不難看出,點(diǎn)擊某個(gè)方塊出現(xiàn)一片安全區(qū)域的條件是這個(gè)方塊的周邊沒(méi)有地雷。假設(shè)我們*次點(diǎn)擊的方塊處在盤面中間的位置,那么就需要它周圍的8個(gè)方塊都沒(méi)有雷;如果方塊在盤面的4條邊上,則是5個(gè)方塊;在角上是3個(gè)方塊。
假如我們*次點(diǎn)擊的方塊在盤面中間,那么出現(xiàn)安全區(qū)域的概率就等于它周圍8個(gè)方塊都沒(méi)有雷的概率(暫且不論這個(gè)安全區(qū)域可以有多大)。如下圖所示,令N表示盤面上格子的總數(shù),M表示地雷的個(gè)數(shù),前面說(shuō)過(guò)因?yàn)?次點(diǎn)擊的一定不是雷,所以這時(shí)候場(chǎng)上還剩N-1個(gè)格子和M個(gè)地雷,于是圖中右下角那個(gè)格子不是雷的概率就是(N-M-1)/(N-1)。
類似地,當(dāng)前場(chǎng)上還剩N-2個(gè)格子和M個(gè)雷,所以下一個(gè)格子依然不是雷的概率是(N-M-2)/(N-2)。
依此類推,*可以發(fā)現(xiàn),*次點(diǎn)擊的格子,其周圍沒(méi)有雷的概率是:
對(duì)于邊和角的情況,推導(dǎo)的過(guò)程完全類似,只是上述乘積的項(xiàng)數(shù)不一樣——邊上只有5項(xiàng),角上只有3項(xiàng)。
根據(jù)游戲的設(shè)置,將N和M的取值代入這個(gè)表達(dá)式中,最終可以得到三種難度下三種策略各自出現(xiàn)安全區(qū)的可能性大小:
所以得出的結(jié)論是,“從角上開局”!
安全區(qū)有大有小
當(dāng)然,看到這里你可能有個(gè)疑問(wèn),雖然說(shuō)*步點(diǎn)擊角出現(xiàn)安全區(qū)的概率*,但安全區(qū)域的面積也有大有小。一個(gè)直觀的想法是,雖然角上出現(xiàn)安全區(qū)域的可能性*,但其能擴(kuò)展出的面積也最受限制,而在中間的位置,雖然安全區(qū)出現(xiàn)的可能性最小,但是一旦出現(xiàn),這個(gè)區(qū)域可以向四周發(fā)散,能擴(kuò)展出的面積也隨之增大。這兩個(gè)因素相互制約,究竟誰(shuí)能最終勝出?
我們轉(zhuǎn)而考慮另一個(gè)指標(biāo),也就是某一個(gè)方塊被點(diǎn)擊后出現(xiàn)的安全區(qū)域的平均面積。這個(gè)指標(biāo)在概率論和統(tǒng)計(jì)學(xué)中稱為期望值。但因?yàn)榘踩珔^(qū)域面積的期望大小很難從理論上推導(dǎo)出來(lái),所以在這里我們利用了蒙特卡羅模擬的辦法來(lái)對(duì)它進(jìn)行計(jì)算。其主要流程就是在電腦中模擬很多次掃雷的過(guò)程(比如10萬(wàn)次),然后把每一次的結(jié)果記錄下來(lái),*做一次平均。
下圖是初級(jí)模式下游戲開始*步,點(diǎn)擊每個(gè)格子出現(xiàn)安全區(qū)域的期望面積,可以看出,顏色越淺的地方安全區(qū)域面積傾向于越大,在圖中即為四個(gè)角的位置,平均下來(lái)一次可以擊出約16個(gè)格子。最“差”的地方則是從外向里第二圈的四個(gè)頂點(diǎn),僅為10個(gè)格子左右。這其實(shí)也符合記錄。初級(jí)掃雷的世界紀(jì)錄是1秒,世界上很多人達(dá)到了這一點(diǎn)。在1秒的時(shí)間里完成初級(jí)掃雷其實(shí)屬于碰運(yùn)氣,最可能的方法就是直接點(diǎn)擊4個(gè)角的方塊。
類似地,中級(jí)和高級(jí)的圖如下所示:
其中顏色最淺的地方都指向了四條邊的中心。
所以,如果考慮的是連擊區(qū)域的大小,那么在初級(jí)模式下還是應(yīng)該優(yōu)先選擇四個(gè)角的位置;而對(duì)于中級(jí)和高級(jí)模式,則是邊的中心其大小的期望值*。
模擬結(jié)果存在不足
然而上面用蒙特卡羅方法得出的結(jié)果卻并不就是我們想要的答案。計(jì)算機(jī)模擬的只是*步點(diǎn)擊哪里出現(xiàn)安全區(qū)域的期望面積*,但實(shí)際上,*次點(diǎn)擊出現(xiàn)的安全區(qū)域面積越大,下一次點(diǎn)擊未知區(qū)域出現(xiàn)安全區(qū)域的概率也就越小,區(qū)域面積也會(huì)越小。如果只是貪圖*步撿一個(gè)大便宜,而讓之后的操作寸步難行,那未免得不償失。
另一方面,并非每一個(gè)掃雷局都是有解的,有時(shí)候根據(jù)現(xiàn)有的局面,并不能夠判斷*剩下的幾個(gè)方塊哪個(gè)是雷哪個(gè)不是,例如下圖這種情況,剩下兩個(gè)方塊各自有雷的概率都是50%。
出現(xiàn)這種情況,除了因?yàn)榈乩撞季值脑颍€和游戲者的操作有關(guān)。試想辛辛苦苦大半天,*卻只能“謀事在人成事在天”,未免太虧。而如果*步就點(diǎn)擊角落,自然就降低這種局面出現(xiàn)的概率。
對(duì)于掃雷游戲來(lái)說(shuō),首要目的是要排出全部地雷,其次是盡量縮短游戲時(shí)間。根據(jù)前面的推算,我們知道,首先點(diǎn)擊角無(wú)疑會(huì)讓這個(gè)游戲變得更為簡(jiǎn)單和容易,并且也不會(huì)為之后的操作帶來(lái)什么麻煩,作為一名技術(shù)流高手,*步首先點(diǎn)擊角落的方塊,無(wú)疑是最保險(xiǎn)和高效的。

求掃雷流程圖

先用鼠標(biāo)左鍵點(diǎn)開一片,然后利用左鍵,以及右鍵標(biāo)旗,就可以很快的完成一局。如果你追求速度,不妨去掃雷網(wǎng)看看,里邊有很多高手,教些公式什么的。例如 121 212 1221等等,以及這些公式的推導(dǎo)公式。慢慢練習(xí),總會(huì)有意想不到的收獲。貴在堅(jiān)持!

如何編寫一個(gè)掃雷速度最快的自動(dòng)掃雷程序

#include
#include
#include
using namespace std;
int map[12][12]; // 為避免邊界的特殊處理,故將二維數(shù)組四周邊界擴(kuò)展1
int derection[3] = { 0, 1, -1 }; //方向數(shù)組
int calculate ( int x, int y )
{
int counter = 0;
for ( int i = 0; i < 3; i++ )
for ( int j = 0; j < 3; j++ )
if ( map[ x+derection[i]][ y+derection[j] ] == 9 )
counter++; // 統(tǒng)計(jì)以(x,y)為中心的四周的雷數(shù)目
return counter;
}
void game ( int x, int y )
{
if ( calculate ( x, y ) == 0 )
{
map[x][y] = 0;
for ( int i = 0; i < 3; i++ )
{ // 模擬游戲過(guò)程,若點(diǎn)到一個(gè)空白,則系統(tǒng)自動(dòng)向外擴(kuò)展
for ( int j = 0; j < 3; j++ )
if ( x+derection[i] <= 9 && y+derection[j] <= 9 && x+derection[i] >= 1 && y+derection[j] >= 1
&& !( derection[i] == 0 && derection[j] == 0 ) && map[x+derection[i]][y+derection[j]] == -1 )
game( x+derection[i], y+derection[j] ); // 條件比較多,一是不可以讓兩個(gè)方向坐標(biāo)同時(shí)為0,否則
遞歸調(diào)用本身!
} //二是遞歸不能出界.三是要保證不返回調(diào)用。
}
else
map[x][y] = calculate(x,y);
}
void print ()
{
for ( int i = 1; i < 10; i++ )
{
for ( int j = 1; j < 10; j++ )
{
if ( map[i][j] == -1 || map[i][j] == 9 )
cout << "#";
else
cout <> x >> y )
{
if ( map[x][y] == 9 )
{
cout << "GAME OVER" <> ch;
cout << "nn";
} while ( ch == 'Y' );

return 0;
}

溫馨提示:為不影響您的學(xué)業(yè),來(lái)校區(qū)前請(qǐng)先電話咨詢,方便我校安排相關(guān)的專業(yè)老師為您解答
相關(guān)資料
姓名不能為空
手機(jī)號(hào)格式錯(cuò)誤