當前位置:首頁 » 編程軟體 » 掃雷計數編程

掃雷計數編程

發布時間: 2022-08-16 22:25:06

A. 掃雷怎麼推理又怎麼計算

第一步打開掃雷游戲,注意數字10,表示這幅圖有10個雷,10左邊的數字是時間。

在判斷出不是雷的方塊上按下左鍵,可以打開該方塊。如果方塊上出現數字,則該數字表示其周圍3×3區域中的地雷數(一般為8個格子,對於邊塊為5個格子,對於角塊為3個格子。所以掃雷中最大的數字為8);如果方塊上為空(相當於0),則可以遞歸地打開與空相鄰的方塊;如果不幸觸雷,則游戲結束。

(1)掃雷計數編程擴展閱讀:

游戲區包括雷區、地雷計數器(位於左上角,記錄剩餘地雷數)和計時器(位於右上角,記錄游戲時間),確定大小的矩形雷區中隨機布置一定數量的地雷(初級為9*9個方塊10個雷,中級為16*16個方塊40個雷,高級為16*30個方塊99個雷。

自定義級別可以自己設定雷區大小和雷數,但是雷區大小不能超過24*30),玩家需要盡快找出雷區中的所有不是地雷的方塊,而不許踩到地雷。

游戲的基本操作包括左鍵單擊(Left Click)、右鍵單擊(Right Click)、雙擊(Chording)三種。其中左鍵用於打開安全的格子,推進游戲進度;右鍵用於標記地雷,以輔助判斷,或為接下來的雙擊做准備;雙擊在一個數字周圍的地雷標記完時,相當於對數字周圍未打開的方塊均進行一次左鍵單擊操作:

左鍵單擊:在判斷出不是雷的方塊上按下左鍵,可以打開該方塊。如果方塊上出現數字,則該數字表示其周圍3×3區域中的地雷數(一般為8個格子,對於邊塊為5個格子,對於角塊為3個格子。所以掃雷中最大的數字為8);如果方塊上為空(相當於0),則可以遞歸地打開與空相鄰的方塊;如果不幸觸雷,則游戲結束。

右鍵單擊:在判斷為地雷的方塊上按下右鍵,可以標記地雷(顯示為小紅旗)。重復一次或兩次操作可取消標記(如果在游戲菜單中勾選了「標記(?)」,則需要兩次操作來取消標雷)。

雙擊:同時按下左鍵和右鍵完成雙擊。當雙擊位置周圍已標記雷數等於該位置數字時操作有效,相當於對該數字周圍未打開的方塊均進行一次左鍵單擊操作。地雷未標記完全時使用雙擊無效。若數字周圍有標錯的地雷,則游戲結束,標錯的地雷上會顯示一個「 ×」。

雷訣八條

第一條:基本定式不要忘,現場推理真夠嗆。

第二條:滑鼠點擊不要快,穩定節奏把空開。

第三條:順手標雷不要慣,積累下來記錄懸。

第四條:無從下手不要愣,就近猜雷把心橫。

第五條:遇到猜雷不要怕,爆了臉上不留疤。

第六條:猜雷猜錯不要悔,哭天搶地也白費。

第七條:碰上好局不要慌,緊盯局部慢擴張。

第八條:痛失好局不要恨,既然有緣定有份。

B. 掃雷公式及詳解是什麼

掃雷公式是一夾二,一有雷。二夾一,心有雷。二夾三,全有雷。 二二邊,都有雷。三連一,中有雷。四連一,邊有雷。

詳解:

數字表示周圍臨近8個格子雷的數量,如此數字為2,則周圍8個格子一共會有2個雷。

基礎確定雷:基於上規則,若周圍空地=數字,則空地均為【基礎確定雷】。

等效:數字減去周圍雷數為【等效數字】,如此3確定周圍存有1雷,則等效為2。

等效在後續公式套用中會起到很關鍵的作用,基本來說,就是將一些不符合公式的情況,變為符合公式的情況。

一二一,邊有雷:出現121列時,且2僅有一側空地(3格),則如圖,2的斜側均為確定雷(並且2正側方確定無雷)。由於「2122」的2周圍有一個確定雷,則變化為「2121」形式,套用上公式。

二連一,邊有雷:出現「a21b」時,a正側為確定雷(並且b正側確定無雷)。

一種等效變換的二連一:此情況中「314旗」,由於4側有2雷,則4等效為2,變換為「312x」,套用上公式。

1221,二側雷:出現「1221」時,2上確定雷。

二夾一,心有雷:在「x212x」時,1正側方確定雷(並且1斜側方確定無雷)。

如此情況,盡管無法確定雷的位置,但是可確定上方三格無雷。原理是由於雷一定出現在第二行,因此第二行的1已經被第二行滿足,則上方無雷。而再推進一格,此時第2行的1被第三行滿足,則1行2行均無雷 。

C. c程序編程掃雷

希望對你有幫助!
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#define LEFTPRESS 0xff01
#define LEFTCLICK 0xff10
#define LEFTDRAG 0xff19
#define MOUSEMOVE 0xff08
int num[10][10];/*范圍*/
int p[10][10];/*統計雷的數組*/
int loop;/*重新來的標志*/
int again=0;/*是否重來的變數*/
int scorenum;/*一開始統計有幾個雷*/
char score[3];/*輸出一共有幾個地雷*/
int Keystate;
int MouseExist;
int MouseButton;
int MouseX;
int MouseY;
/*滑鼠游標形狀定義*/
typedef struct
{
unsigned int shape[32];
char hotx;
char hoty;
}SHAPE;

/*箭頭型*/
SHAPE ARROW={
{
0x3fff,0x1fff,0x0fff,0x07ff,
0x03ff,0x01ff,0x00ff,0x007f,
0x003f,0x00ff,0x01ff,0x10ff,
0x30ff,0xf87f,0xf87f,0xfc3f,
0x0000,0x7c00,0x6000,0x7000,
0x7800,0x7c00,0x7e00,0x7f00,
0x7f80,0x7e00,0x7c00,0x4600,
0x0600,0x0300,0x0300,0x0180
},
0,0,
};

/*滑鼠游標顯示*/
void MouseOn()
{
_AX=0x01;
geninterrupt(0x33);
}

/*滑鼠游標掩示*/
void MouseOff()/*滑鼠游標隱藏*/
{
_AX=0x02;
geninterrupt(0x33);
}
void MouseSetXY(int x,int y)/*設置當前位置*/
{
_CX=x;
_DX=y;
_AX=0x04;
geninterrupt(0x33);
}
int LeftPress()/*左鍵按下*/
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&1);
}
void MouseGetXY()/*得到當前位置*/
{
_AX=0x03;
geninterrupt(0x33);
MouseX=_CX;
MouseY=_DX;
}
begain()/*游戲開始畫面*/
{
int i,j;
loop: cleardevice();
MouseOn();
MouseSetXY(180,30);
MouseX=180;
MouseY=30;
scorenum=0;
setfillstyle(SOLID_FILL,7);
bar(190,60,390,290);
setfillstyle(SOLID_FILL,8);
for(i=100;i<300;i+=20)/*畫格子*/
for(j=200;j<400;j+=20)
bar(j-8,i+8,j+8,i-8);
setcolor(7);
setfillstyle(SOLID_FILL,YELLOW);/*畫臉*/
fillellipse(290,75,10,10);
setcolor(YELLOW);
setfillstyle(SOLID_FILL,0);
fillellipse(285,75,2,2);
fillellipse(295,75,2,2);
setcolor(0);
bar(287,80,293,81);
randomize();
for(i=0;i<10;i++)
for(j=0;j<10;j++)
{
num[i][j]=random(7)+10;/*用10代表地雷算了*/
if(num[i][j]==10)
scorenum++;
}
sprintf(score,"%d",scorenum);
setcolor(1);
settextstyle(0,0,2);
outtextxy(210,70,score);
scorenum=100-scorenum;/*為了後面判斷勝利*/
}
gameove()/*游戲結束畫面*/
{
int i,j;
setcolor(0);
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(num[i][j]==10)/*是地雷的就顯示出來*/
{
setfillstyle(SOLID_FILL,RED);
bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8);
setfillstyle(SOLID_FILL,0);
fillellipse(200+j*20,100+i*20,7,7);
}
}
int tongji(int i,int j)/*計算有幾個雷*/
{
int x=0;/*10代表地雷*/
if(i==0&&j==0)
{
if(num[0][1]==10)
x++;
if(num[1][0]==10)
x++;
if(num[1][1]==10)
x++;
}
else if(i==0&&j==9)
{
if(num[0][8]==10)
x++;
if(num[1][9]==10)
x++;
if(num[1][8]==10)
x++;
}
else if(i==9&&j==0)
{
if(num[8][0]==10)
x++;
if(num[9][1]==10)
x++;
if(num[8][1]==10)
x++;
}
else if(i==9&&j==9)
{
if(num[9][8]==10)
x++;
if(num[8][9]==10)
x++;
if(num[8][8]==10)
x++;
}
else if(j==0)
{
if(num[i][j+1]==10)
x++;
if(num[i+1][j]==10)
x++;
if(num[i-1][j]==10)
x++;
if(num[i-1][j+1]==10)
x++;
if(num[i+1][j+1]==10)
x++;
}
else if(j==9)
{
if(num[i][j-1]==10)
x++;
if(num[i+1][j]==10)
x++;
if(num[i-1][j]==10)
x++;
if(num[i-1][j-1]==10)
x++;
if(num[i+1][j-1]==10)
x++;
}
else if(i==0)
{
if(num[i+1][j]==10)
x++;
if(num[i][j-1]==10)
x++;
if(num[i][j+1]==10)
x++;
if(num[i+1][j-1]==10)
x++;
if(num[i+1][j+1]==10)
x++;
}
else if(i==9)
{
if(num[i-1][j]==10)
x++;
if(num[i][j-1]==10)
x++;
if(num[i][j+1]==10)
x++;
if(num[i-1][j-1]==10)
x++;
if(num[i-1][j+1]==10)
x++;
}
else
{
if(num[i-1][j]==10)
x++;
if(num[i-1][j+1]==10)
x++;
if(num[i][j+1]==10)
x++;
if(num[i+1][j+1]==10)
x++;
if(num[i+1][j]==10)
x++;
if(num[i+1][j-1]==10)
x++;
if(num[i][j-1]==10)
x++;
if(num[i-1][j-1]==10)
x++;
}
return(x);
}
funcheck(int i,int j)/*開始找無雷*/
{
scorenum--;
if(p[i][j]==0&&num[i][j]!=10)
{
setfillstyle(SOLID_FILL,7);/*顯示無雷區*/
bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);
num[i][j]=-1;
}
else if(p[i][j]!=0)
{
sprintf(score,"%d",p[i][j]);/*輸出雷數*/
setcolor(RED);
outtextxy(195+j*20,95+i*20,score);
num[i][j]=-1;
return ;
}
if(i!=0&&num[i-1][j]!=-1&&num[i-1][j]!=10)/*第歸開始*/
funcheck(i-1,j);
if(i!=0&&j!=9&&num[i-1][j+1]!=-1&&num[i-1][j+1]!=10)
funcheck(i-1,j+1);
if(j!=9&&num[i][j+1]!=-1&&num[i][j+1]!=10)
funcheck(i,j+1);
if(j!=9&&i!=9&&num[i+1][j+1]!=-1&&num[i+1][j+1]!=10)
funcheck(i+1,j+1);
if(i!=9&&num[i+1][j]!=-1&&num[i+1][j]!=10)
funcheck(i+1,j);
if(i!=9&&j!=0&&num[i+1][j-1]!=-1&&num[i+1][j-1]!=10)
funcheck(i+1,j-1);
if(j!=0&&num[i][j-1]!=-1&&num[i][j-1]!=10)
funcheck(i,j-1);
if(i!=0&&j!=0&&num[i-1][j-1]!=-1&&num[i-1][j-1]!=10)
funcheck(i-1,j-1);
}

playgame()/*游戲過程*/
{int i,j,numx;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
p[i][j]=tongji(i,j);/*把標記有幾個雷的數字都存放起來*/
while(!kbhit())
{
if(LeftPress())/*左鍵盤按下*/
{
MouseGetXY();
if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)/*重新來*/
{
MouseOff();
again=1;
break;
}
if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*是否在游戲范圍內*/
{
j=(MouseX-190)/20;/*x坐標*/
i=(MouseY-90)/20;/*y坐標*/
if(num[i][j]!=-1)
{
if(num[i][j]==10)/*中雷*/
{
MouseOff();
gameove();/*失敗*/
break;
}
else/*非中雷*/
{
MouseOff();
numx=tongji(i,j);
if(numx==0)/*周圍沒地雷*/
funcheck(i,j);/*開始找無雷*/
else/*有地雷*/
{
sprintf(score,"%d",numx);/*輸出雷數*/
setcolor(RED);
outtextxy(195+j*20,95+i*20,score);
scorenum--;
}
MouseOn();
num[i][j]=-1;
if(scorenum<1)/*勝利了*/
{
setcolor(11);
settextstyle(0,0,2);
outtextxy(230,30,"YOU WIN!");
break;
}
}
}
}
}
}
}
main()
{int gd=DETECT,gr;
registerbgidriver(EGAVGA_driver);
initgraph(&gd,&gr,"c:\\tc");
loop: begain();
playgame();/*具體游戲*/
if(again)/*游戲中重新開始*/
{
again=0;
goto loop;
}
MouseOn();
while(!kbhit())/*重新來*/
{
if(LeftPress())
{
MouseGetXY();/*失敗後重新來*/
if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)
goto loop;
}
}
MouseOff();
closegraph();
}

本文來自: 中科軟體園(www.4oa.com) 詳細出處參考:http://www.4oa.com/Article/html/6/31/446/2005/15615.html

D. 掃雷編程

事實上Win的原版掃雷是點擊第一次之後再隨機布置的.而且按合理性來說理應如此.但是不排除其他的掃雷游戲會一開始就確定局勢.

E. 《掃雷》游戲固定公式是什麼

掃雷公式: 一夾二,一有雷,二夾一,心有雷,二夾三,全有雷,二二邊,都有雷,三連一,中有雷,四連一,邊有雷。

《掃雷》是一款大眾類的益智小游戲,於1992年發行,游戲目標是在最短的時間內根據點擊格子出現的數字找出所有非雷格子,同時避免踩雷,踩到一個雷即全盤皆輸,掃雷在科技歷史上也扮演了相似的角色。

這個基於數字的邏輯謎題最早來自20世紀六七十年代,當時Jerimac Ratliff推出的名為「Cube」的游戲已經非常受人歡迎。

幾十年後的1992年,掃雷游戲被加入了Windows3.1,這並不是為了展示Windows是游戲操作系統專家,而是為了訓練用戶的滑鼠左右鍵操作能力,讓這些動作變得非常自然,並培養滑鼠移動的速度和准確性。

模式設定:

以windows XP自帶掃雷winmine.exe為例(其它版本的掃雷游戲與之大同小異),游戲區包括雷區、地雷計數器和計時器(位於右上角,記錄游戲時間),確定大小的矩形雷區中隨機布置一定數量的地雷,玩家需要盡快找出雷區中的所有不是地雷的方塊,而不許踩到地雷。

F. 掃雷的VB編程

Private Sub Form_Load()Init_FormEnd Sub
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)Dim x1 As Integer, y1 As Integerx1 = Fix((x - x0) / a): y1 = Fix((y - y0) / a)If (x - x0) > ((Col_Num + 1) * a) Or (y - y0) > ((Col_Num + 1) * a) Then Exit SubIf x < x0 Or y < y0 Then Exit SubIf x < x0 + x1 * a + 2 Or _x > x0 + x1 * a + a - 4 Or _y < y0 + y1 * a + 2 Or _y > y0 + y1 * a + a - 4 _Then Exit SubIf Button = 1 ThenIf Map(x1, y1) = 0 ThenCall fan(x1, y1)ElseIf Map(x1, y1) = 1 ThenCall loseEnd IfElseIf Button = 2 ThenCall draw_flg(x1, y1)End IfDim n As Integern = 0Dim i As Integer, j As IntegerFor i = 0 To Col_NumFor j = 0 To Row_NumIf Map(i, j) = -2 Then n = n + 1Next jNext iIf n = (Col_Num + 1) * (Row_Num + 1) - Ant_Num ThenBeepCurrentX = (Col_Num / 2) * a + x0CurrentY = (Row_Num / 2) * a + y0Call sub1a = Form1.FontSizeForm1.FontSize = 80'Form1.ForeColor = vbBlackPrint "you win"Form1.FontSize = aEnd IfEnd Sub

Sub fan(x As Integer, y As Integer)Dim i As Integer, j As IntegerDim n As IntegerFor i = -1 To 1For j = -1 To 1If j * i = 0 And Map(x + i, y + j) = 0 ThenMap(x + i, y + j) = -2n = Counts(x + i, y + j)Form1.Line (x0 + (i + x) * a + 2, y0 + (j + y) * a + 2)-Step(a - 4, a - 4), Form1.BackColor, BF
If n <> 0 ThenCurrentX = (x + i) * a + 2 + x0CurrentY = (y + j) * a + 2 + y0Select Case nCase Is = 1Form1.ForeColor = vbWhiteCase Is = 2Form1.ForeColor = vbYellowCase Is > 2Form1.ForeColor = vbRedEnd SelectPrint nElseIf n = 0 Then
Call fan(x + i, y + j)End IfEnd IfNext jNext iEnd Sub
Function Counts(x As Integer, y As Integer) As IntegerDim i As Integer, j As IntegerFor i = -1 To 1For j = -1 To 1If Map(x + i, y + j) = 1 Then Counts = Counts + 1NextNextEnd FunctionSub lose()Dim i As Integer, j As IntegerFor i = 0 To Row_NumFor j = 0 To Col_NumIf Map(j, i) = 1 ThenForm1.FillColor = vbBlackForm1.FillStyle = 0Form1.Circle (x0 + j * a + a / 2, y0 + i * a + a / 2), a / 3, vbBlack, , , 0.8Form1.Line (x0 + j * a, y0 + i * a)-Step(a, a), vbWhiteForm1.Line (x0 + j * a + a, y0 + i * a)-Step(-a, a), vbWhite
ElseIf Map(j, i) = 0 ThenForm1.Line (x0 + j * a + 2, y0 + i * a + 2)-Step(a - 4, a - 4), Form1.BackColor, BFCurrentX = j * a + x0CurrentY = i * a + y0Print Counts(j, i)End IfNext j
Next iBeepa = Form1.FontSizeForm1.FontSize = 80'Form1.ForeColor = vbBlackPrint "you lose"Form1.FontSize = aEnd SubSub draw_flg(x As Integer, y As Integer)CurrentX = x * a + x0 + 2CurrentY = y * a + y0 + 2Print "?"End Sub
Public Sub Init_Form()
Form1.ClsForm1.ScaleMode = 3Form1.Width = 8000Form1.Height = 6000Form1.BackColor = vbGreenForm1.AutoRedraw = Trueform1.caption="一個簡單掃雷游戲 "Col_Num = 10 '獲取列數Row_Num = 10 '獲取行數a = 20 '單元寬(高)度Ant_Num = 40 '雷的數量ReDim Map(-1 To Col_Num + 1, -1 To Row_Num + 1)Dim i As Integer, j As IntegerFor i = -1 To Row_Num + 1
For j = -1 To Col_Num + 1Form1.Line (x0 + j * a, y0 + i * a)-Step(a, a), 0, BForm1.Line (x0 + j * a + 2, y0 + i * a + 2)-Step(a - 4, a - 4), vbRed, BFMap(j, i) = 0 '初始化位置標記為空格0If i = -1 Or i = Row_Num + 1 Or j = -1 Or j = Row_Num + 1 ThenForm1.Line (x0 + j * a + 1, y0 + i * a + 1)-Step(a - 2, a - 2), RGB(100, 120, 100), BF '畫四周牆體Map(j, i) = -1 '四周位置標記為牆體:-1End IfNext j
Next iDim x As Integer, y As IntegerFor i = 1 To Ant_Num1000Randomizex = Rnd * Col_Numy = Rnd * Row_NumDoEventsIf Map(x, y) <> 0 Then GoTo 1000Map(x, y) = 1NextEnd Sub

Sub sub1()
Dim i As Integer, j As IntegerFor i = 0 To Row_NumFor j = 0 To Col_NumIf Map(j, i) = 1 ThenForm1.FillColor = vbBlackForm1.FillStyle = 0Form1.Circle (x0 + j * a + a / 2, y0 + i * a + a / 2), a / 3, vbBlack, , , 0.8ElseIf Map(j, i) = 0 ThenForm1.Line (x0 + j * a + 2, y0 + i * a + 2)-Step(a - 4, a - 4), Form1.BackColor, BFCurrentX = j * a + x0CurrentY = i * a + y0Print Counts(j, i)End IfNext j
Next iEnd Sub

G. 請教掃雷演算法

掃雷的演算法有兩種,一種是老手使用的(憑經驗操作),一種是新手使用的,我現在介紹一下老手使用的演算法:
1.點第一個空
2.若點開的是一個格,則繼續第1步
若點開的是一片(打開數大於等於9),則進行第3步
3.觀察一片格的邊角,
若有一個格數字與它周圍的空格數相等,在空格處標雷並在兩側格子上同時左右鍵雙擊
若沒有這種情況則觀察有無[經驗公式]
這樣做直到不能再找到為止(一般能完成初、中級或高級的50%了)進行第4步
4.檢查邊角,重復第1步
—————
註:
[經驗公式]:121組合,雷在2上
1221組合,兩個雷在2上
還有好多復雜的,得自己總結

至於掃雷圖形成的演算法,是根據你點開的第一個格在哪裡,總之第一個雷總不能在那裡。在點開後萬分之幾秒里形成雷圖,一切都是隨機的,不過有一點對於初級來說有十幾萬分之一的幾率打開3BV=1的圖,也就是說一下就開了。(3BV的意思是贏得這盤掃雷所需要的最少左鍵點擊數,比如一大片的3BV就是1,而一個沒在一大片的邊緣的格的3BV也是1,)也就是說,打開一大片所形成的那些邊緣的格都不算,3BV是目前評價難易程度的最好方法,這也是隨機,初級在1~71,中級大概25~180,高級100~250

熱點內容
c語言5常量 發布:2024-04-27 02:38:49 瀏覽:990
源碼怎麼搭建 發布:2024-04-27 02:33:44 瀏覽:96
java獲取參數 發布:2024-04-27 02:22:21 瀏覽:501
unixlinuxwindows 發布:2024-04-27 02:10:55 瀏覽:445
nginx禁止ip訪問網站 發布:2024-04-27 02:05:43 瀏覽:845
webrtc伺服器搭建哪家價格低 發布:2024-04-27 01:30:08 瀏覽:140
oracle資料庫無法啟動 發布:2024-04-27 01:29:20 瀏覽:613
倪萍超級訪問 發布:2024-04-27 01:23:29 瀏覽:705
java集合循環 發布:2024-04-27 01:17:18 瀏覽:593
解壓喪屍片 發布:2024-04-27 01:02:28 瀏覽:370