导航:首页 > 编程知识 > 编程怎么做扫雷

编程怎么做扫雷

发布时间:2023-08-08 10:10:36

『壹』 如何用C++写扫雷

用VC++编写扫雷游戏

用VC++编写扫雷游戏
王洪亚
本文从分析windows扫雷游戏的功能特点开始,应用面向对象的可视化编程语言visual c++给出了个功能模块的具体实现方法,并提供了编写小游戏程序的一般方法和visual c++的一些使用技巧。

首先分析扫雷的最基本功能。

点击鼠标左键于未知区域,如果未知区域有雷,游戏停止,显示所有的地雷。如果没雷,则显示周围雷数,如果周围没雷,则再查看周围八个区域是否有雷直到有雷为止并显示,这其实是一个递归过程。

点击鼠标右键于未知区域,则将其置为有雷而不管是否真的有雷。可选择初、中、高三级并可自定义雷数和区域大小。

雷区上部左侧显示总雷数减被标明有雷区域的数目。

雷区上部中间位置显示一按钮用于开局和显示鼠标动作的结果。

雷区上部右侧显示扫雷的时间。

将雷全部扫清后,则显示一对话框将你的姓名记入排行榜。以时间排序。

为完成上述功能,应用visual c++的具体技术细节如下:

1. 应用appwizard创建基于sdi的应用程序cbombapp,去除打印和状态条支持,在资源编辑器中修改菜单和相应的加速键,使其与windows扫雷游戏一致。具体为开局(id-game-begin)、初级(id-game-junior)、中级(id-game-middle)、高级(id-game-senior)、自定义(id-game-custom)、颜色(id-game-color)、英雄榜(id-game-sort)、退出(id-game-exit)、帮助(id-help)。

2. 在资源编辑器中对应于雷区的每个小区域的13个属性。用画笔或其他绘图工具绘制出相对应的13个10乘10的16色小位图,三个对应于小人表情的20乘20的16色小位图,供更换颜色时使用的一套与前16个对应的单色位图,显示时间和雷数的0~9十个数字位图(底色为黑色)。

定制customer对话框,内含三个静态文本控件和三个编辑控件,三个编辑控件分别对应成员m_irownum,m_icolumnnum,m_ibombnum。该对话框用于定制雷数,行列数,其相应的mfc类为ccustomer。定制sort对话框,内含九个静态文本控件,其中六个显示排行榜的姓名和时间,其对应的mfc类为csort。定制input对话框,内含一个静态文本控件和一个编辑控件,编辑控件用于在游戏成功结束时输入姓名,其对应的mfc类为cinput。

3. 定义类bomb,封装每颗雷的相关属性。

class bomb

{

public:

int isbomb;//决定初始时是否是雷

bool issel; //判断区域是否被处理过且周围有雷

bool isdone;//判断递归时是否被处理过

int num; //周围雷数

bool findbomb; //排雷者认为是雷时置一(但是不一定真是雷)

} ;

4. 重载cmainframe中precreatewindow,并设置相应属性,使其窗体大小固定,这样就固定了显示区域的大小为初始10乘10个雷和外加雷区上部的控制区域,部分代码如下。

cs.style=ws_overlapped|ws_sysmenu| ws_border|ws_minimizebox;

cs.cy = 10*15+6;

cs.cx = 10*15+60; //6和60分别是横纵的附加值,用于边框、菜单、标题条、控制区域。
5. 游戏的主要工作就是呈现不断变换的图形或动画,并按用户的输入交互进行显示,而windows文档-----视窗构架中的视窗的功能正是接受用户输入并负责显示,因此由cview类来完成扫雷的大部分工作。在cbombview中定义下列成员变量记录相关操作的结果或对象的状态。

bomb m_bomb[30][30]; //最大的地雷区域

cstring m_currenttime; //用于记录并显示扫雷时间

ctime m_begintime;//记录游戏开始时的时间

bool m_timerbegin;//定时器是否开启

int m_ibomnum;//雷的数目

int m_irow;//雷的行数

int m_icolumn;//雷的列数

int m_ibombfound;//指示被认为是雷的数目

cbitmapbutton m_bitbutton;//控制区的位图按钮

int m_currentlevel;//指示当前游戏的级别

bool m_biscolor;//指示当前是彩色还是单色

cbitmap m_bmbomb[12];//用于存放12个小位图

int m_igameover;//游戏未结束置0,已清除所有的雷置1,被炸死置2。

重载cbombview中oncreate函数创建位图按钮,该位图按钮的两幅位图对应了正常、排雷正确两种状态,当要显示被炸死的状态时应动态销毁该按钮,并重新创建一位图对应正常和被炸死两种状态,将该位图按钮的id号定为id_game_begin,这样一来当点击按钮时便可重新开始游戏,部分代码如下。

crect rcclient;

getclientrect(&rcclient);

crect rect(rcclient.cx/2-8,10,rcclient.cx/2+8,20);

m_button.create("new",bs_defpushbutton|ws_visible|

bs_ownerdraw,rect,this,id_game_begin);

m_button.loadbitmaps(idb_face1, idb_face2);

显示时间的功能相对比较简单,在响应第一个wm_lbuttomdown消息时开启定时器,并记录游戏开始的时间,在wm_time消息响应函数ontimer中获得当前时间,减去游戏开始时的时间,在显示时间的客户区域显示得到的时间差(用数字位图),当游戏结束时(排完全部雷或被炸死)关闭定时器,停止显示。

wm_lbuttomdown消息响应函数onlbuttomdown是处理用户输入的主要执行者,函数首先判断点中位置是否是雷,是则关闭定时器,销毁原位图按钮,创建一对应正常和被炸死两种状态的新位图按钮,并调用setstate将其设置为pushdown(小人哭的状态),将m_bgameover,置为true标志游戏结束,否则先调用setstate 设置位图按钮为pushdown (小人笑的状态),并在onlbuttomup中设置位图按钮为正常状态,然后调用caculate函数记下周围雷的数目,最后调用invalidate使客户区无效,迫使ondraw函数重绘客户区域,在调用invalidate时不应重画背景,避免闪烁,这样就完成了在雷区按下左键的响应动作。

wm_rbuttomdown消息响应函数onlbuttomdown将被认为有雷位置的m_ibombnum.findbomb置一,减少左上角的雷记数,然后判断是否真正全部排完了雷,是则结束游戏弹出input对话框,让扫雷的人输入姓名,在响应idok通知码时将其写入注册表,没有全部排完则使客户区无效,迫使ondraw函数重绘客户区域完成在雷区按下右键的动作。

ondraw函数在每次点击左键或右键时都会被调用重雷区和控制区域,因为点击情况的复杂性和雷属性的多元化导致ondraw函数需要精心设计。

函数caculate计算某个雷周围的雷数,根据前面的分析知道,计算某个雷周围的雷数本身就是一个递归过程,在编制时应注意递归的边界条件,稍不注意会陷入无穷递归而耗尽了系统的资源。

6. 菜单命令的响应是游戏交互的另一个重要方式,下面的九个命令响应函数分别与九个菜单项相对应,用以完成用户的更新和设置命令。

ongamebegin完成初始时间清零,随机布雷,依据颜色指示装载12幅小位图,使雷区无效调用ondraw重绘等工作。其中随机布雷就是多次调用rand(),根据其返回值决定m_bomb[i][j].isbomb的值。

ongamecustom首先弹出ccustomer对话框,在用户输入设置后响应idok通知码时将用户输入的雷数、行列数分别赋给cview的数据成员m_ibombnum、m_irow、m_icolumn,得到框架窗口的指针,用其调用movewindow将窗口调至所需大小,销毁原位置的位图按钮,并在x轴坐标为新窗口宽1/2减8处,y轴坐标为新窗口顶部加30的位置创建一新按钮。最后调用ongamebegin重新开始游戏。

ongamejunior、ongamemiddle、ongamesenior三个函数与ongamecustom类似,只不过将分别赋给cview的数据成员m_ibombnum、m_irow、m_icolumn以固定的值,其大小可由编程者自定,笔者定为junior(20,8,8,)、middle(40,13,13)、senior(99,20,25)。

ongamecolor函数销毁原位图按钮,根据重新装载位图的标志m_iscolor来创建新的位图按钮,将装载12幅单色位图的标志取反,调用ongamebegin重新开始游戏。

ongamesort函数根据当前游戏级别从注册表中读出排名并弹出sort对话框显示结果。到现在为止,一个自己编制的扫雷游戏就基本完成了,将数百行代码编译一下,找出小错误,最后build一遍,run一下,好了,可爱的扫雷游戏就出现在你的面前了。怎么样,自己的劳动成果并不比microsoft的差吧,而且你还可以把小位图画成各种样子,当然你自己要认得出才行了。

『贰』 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

『叁』 毕业设计要做一个扫雷游戏,求完整代码,最好是用java做的,没有别的也行。但一定要运行得了啊。拜谢

【代码1】: new LinkedList();
【代码2】: list.add(block[i][j]) ;
【代码3】: list.size();
【代码4】: (Block)list.get(randomIndex);
【代码5】: list.remove(randomIndex);
2.模板代码
Block.java
public class Block
{ String name;
int number;
boolean boo=false;
public void setName(String name)
{ this.name=name;
}
public void setNumber(int n)
{ number=n;
}
public int getNumber()
{ return number;
}
public String getName()
{ return name;
}
boolean isMine()
{ return boo;
}
public void setIsMine(boolean boo)
{ this.boo=boo;
}
}
LayMines.java
import java.util.LinkedList;
public class LayMines
{ public void layMinesForBlock(Block block[][],int mineCount)
{ int row=block.length;
int column=block[0].length;
LinkedList list=【代码1】 //创建空链表list
for(int i=0;i<row;i++)
{ for(int j=0;j<column;j++)
{ 【代码2】 // list添加节点,其中的数据为block[i][j]
}
}
while(mineCount>0)
{ int size=【代码3】 // list返回节点的个数
int randomIndex=(int)(Math.random()*size);
Block b=【代码4】 // list返回索引为randomIndex的节点中的数据
b.setName(

『肆』 用VB编程实现扫雷的思路

'一个简单扫雷游戏
Option Explicit
Dim Map() As Integer
Dim Row_Num, Col_Num As Integer '范围,一个正方形的边长
Dim Ant_Num As Long '白蚁数量
Const x0 = 30 '方框左上角坐标
Const y0 = 30
Const 小快宽度 = 9
Dim a As Integer '各个小块的边长

Private Sub Command1_Click()
'重设按钮
Init_Form
End Sub

Private Sub Form_Load()
Init_Form
End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim x1 As Integer, y1 As Integer
x1 = 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 Sub
If x < x0 Or y < y0 Then Exit Sub
If 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 Sub
If Button = 1 Then
If Map(x1, y1) = 0 Then
Call fan(x1, y1)
ElseIf Map(x1, y1) = 1 Then
Call lose
End If
ElseIf Button = 2 Then
Call draw_flg(x1, y1)
End If
Dim n As Integer
n = 0
Dim i As Integer, j As Integer
For i = 0 To Col_Num
For j = 0 To Row_Num
If Map(i, j) = -2 Then n = n + 1
Next j
Next i
If n = (Col_Num + 1) * (Row_Num + 1) - Ant_Num Then
Beep
CurrentX = (Col_Num / 2) * a + x0
CurrentY = (Row_Num / 2) * a + y0
Call sub1
a = Form1.FontSize
Form1.FontSize = 80
'Form1.ForeColor = vbBlack
Print "you win"
Form1.FontSize = a
End If
End Sub

Sub fan(x As Integer, y As Integer)
Dim i As Integer, j As Integer
Dim n As Integer
For i = -1 To 1
For j = -1 To 1
If j * i = 0 And Map(x + i, y + j) = 0 Then
Map(x + i, y + j) = -2
n = 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 Then
CurrentX = (x + i) * a + 2 + x0
CurrentY = (y + j) * a + 2 + y0
Select Case n
Case Is = 1
Form1.ForeColor = vbWhite
Case Is = 2
Form1.ForeColor = vbYellow
Case Is > 2
Form1.ForeColor = vbRed
End Select
Print n
ElseIf n = 0 Then

Call fan(x + i, y + j)
End If
End If
Next j
Next i
End Sub

Function Counts(x As Integer, y As Integer) As Integer
Dim i As Integer, j As Integer
For i = -1 To 1
For j = -1 To 1
If Map(x + i, y + j) = 1 Then Counts = Counts + 1
Next
Next
End Function
Sub lose()
Dim i As Integer, j As Integer
For i = 0 To Row_Num
For j = 0 To Col_Num
If Map(j, i) = 1 Then
Form1.FillColor = vbBlack
Form1.FillStyle = 0
Form1.Circle (x0 + j * a + a / 2, y0 + i * a + a / 2), a / 3, vbBlack, , , 0.8
Form1.Line (x0 + j * a, y0 + i * a)-Step(a, a), vbWhite
Form1.Line (x0 + j * a + a, y0 + i * a)-Step(-a, a), vbWhite

ElseIf Map(j, i) = 0 Then
Form1.Line (x0 + j * a + 2, y0 + i * a + 2)-Step(a - 4, a - 4), Form1.BackColor, BF
CurrentX = j * a + x0
CurrentY = i * a + y0
Print Counts(j, i)
End If
Next j

Next i
Beep
a = Form1.FontSize
Form1.FontSize = 80
'Form1.ForeColor = vbBlack
Print "you lose"
Form1.FontSize = a
End Sub
Sub draw_flg(x As Integer, y As Integer)
CurrentX = x * a + x0 + 2
CurrentY = y * a + y0 + 2
Print "?"
End Sub

Public Sub Init_Form()

Form1.Cls
Form1.ScaleMode = 3
Form1.Width = 8000
Form1.Height = 6000
Form1.BackColor = vbGreen
Form1.AutoRedraw = True
Form1.Caption = "一个简单扫雷游戏 作者 zfc"
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 Integer
For i = -1 To Row_Num + 1

For j = -1 To Col_Num + 1
Form1.Line (x0 + j * a, y0 + i * a)-Step(a, a), 0, B
Form1.Line (x0 + j * a + 2, y0 + i * a + 2)-Step(a - 4, a - 4), vbRed, BF
Map(j, i) = 0 '初始化位置标记为空格0
If i = -1 Or i = Row_Num + 1 Or j = -1 Or j = Row_Num + 1 Then
Form1.Line (x0 + j * a + 1, y0 + i * a + 1)-Step(a - 2, a - 2), RGB(100, 120, 100), BF '画四周墙体
Map(j, i) = -1 '四周位置标记为墙体:-1
End If
Next j

Next i
Dim x As Integer, y As Integer
For i = 1 To Ant_Num
1000
Randomize
x = Rnd * Col_Num
y = Rnd * Row_Num
DoEvents
If Map(x, y) <> 0 Then GoTo 1000
Map(x, y) = 1
Next
End Sub

Sub sub1()

Dim i As Integer, j As Integer
For i = 0 To Row_Num
For j = 0 To Col_Num
If Map(j, i) = 1 Then
Form1.FillColor = vbBlack
Form1.FillStyle = 0
Form1.Circle (x0 + j * a + a / 2, y0 + i * a + a / 2), a / 3, vbBlack, , , 0.8
ElseIf Map(j, i) = 0 Then
Form1.Line (x0 + j * a + 2, y0 + i * a + 2)-Step(a - 4, a - 4), Form1.BackColor, BF
CurrentX = j * a + x0
CurrentY = i * a + y0
Print Counts(j, i)
End If
Next j

Next i
End Sub

『伍』 谁用VB6.0做一个扫雷,并且写出代码和解释

'窗体1
OptionExplicit
PrivateConstvbGray=&H848284'灰色
PrivateConstMLeftAsLong=180'雷区距离左侧(按Twips计算)
PrivateConstMTopAsLong=825'雷区距离上部
PrivateConstWAVE_DEFAULT=432'默认声音
PrivateConstWAVE_VICTORY=433'失败声音
PrivateConstWAVE_LOST=434'胜利声音
PrivateConstBMP_GRID_WIDTH=16'格子的宽
PrivateConstBMP_GRID_HEIGHT=16'格子的高
PrivateConstBMP_NUM_WIDTH=13'数字的宽
PrivateConstBMP_NUM_HEIGHT=23'数字的高
PrivateConstBMP_NUM_TOP=16'数字距离上边(菜单底)
PrivateConstBMP_NUM_MINE_LEFT=17'计数器距离左侧
PrivateConstBMP_NUM_TIME_RIGHT=BMP_NUM_WIDTH*3+20'计时器左侧距离窗体右侧
PrivateConstBMP_FACE_WIDTH=24'表情的宽
PrivateConstBMP_FACE_HEIGHT=24'表情的高
PrivateConstBMP_FACE_TOP=16'表情距离上边(菜单底)
PrivateCanPeeperAsBoolean'作弊啊
'初级9/9/10
'中级16/16/40
'高级30/16/99
'PrivateNoMineAsBoolean

PrivateSubInithDC()
DimIAsLong
DimhBmpAsStdPicture
'从资源读取游戏图片
ForI=0To2
'不用PictureBox
SethBmp=LoadResPicture(IIf(MnuCheck(1).Checked,410,411)+I*10,vbResBitmap)
LethBmpDC(I)=CreateCompatibleDC(Me.hdc)
CallSelectObject(hBmpDC(I),hBmp.Handle)
SethBmp=Nothing
Next
EndSub
'开始
PublicSubGameStart()
'NoMine=False
LetMe.Width=MLeft+(MWidth*16+8+GetMePixelWidth-Me.ScaleWidth)*Screen.TwipsPerPixelX'调整窗体宽度
LetMe.Height=MTop+(MHeight*16+8+GetMePixelHeight-Me.ScaleHeight)*Screen.TwipsPerPixelY'调整窗体高度270OR390'19/26'495/510
LetIsFirstHit=False'没有埋雷'没有处理第一个雷
LetIsGameWin=False'没有赢
LetIsGameOver=False'没有输
LetTimer1.Enabled=False'定时器,需要鼠标激活
LetTime_Count=0'记时器清零
LetNowFace=4'CallCheckFace(4)
ReDimN(MWidth-1,MHeight-1)
LetShow_Count=MWidth*MHeight'倒计数字,剩余未揭开的格子
LetMine_Count=Mines'剩余未标记的地雷
CallForm_Paint
CallSetMines
EndSub
'Downloadbyhttp://www.codefans.net
PrivateSubSetMines()'OptionalByValXAsLong,OptionalByValYAsLong
'初始化地雷
DimIAsLong',JAsLong
DimAAsLong,BAsLong
DimKAsLong,LAsLong
CallMath.Randomize'初始化随机数生成器。
ForI=0ToMines-1
LetA=Int(MWidth*Rnd)'Int((upperbound-lowerbound+1)*Rnd+lowerbound)
LetB=Int(MHeight*Rnd)
IfNotN(A,B).IsMineThen'不能重复,不能是按下的位置'Not(A=XAndb=Y)And
'IfI=1Then
'IfNoMine=FalseThen
'LetA=X:b=Y'第一个按下去总是雷--#
'EndIf
'EndIf
LetN(A,B).IsMine=True
'统计每个格子周围的地雷数目
AddtionA,B,1
Else
LetI=I-1'再来
EndIf
NextI
'NoMine=False
'显示每个格子'作弊1
'DimJAsLong
'作弊2
'ForI=0To8
'ForJ=0To8
'IfN(I,J).IsMineThen
'N(I,J).State=1
''SetImageI,J,15-N(I,J).Number
''N(I,J).IsShow=True
'EndIf
'Next
'Next
EndSub

PrivateSubAddtion(ByValXAsLong,ByValYAsLong,ByValOneAsLong)
DimIAsLong,JAsLong
ForI=-1To1
ForJ=-1To1
IfInRange(X+I,Y+J)AndNot(I=0AndJ=0)Then'在地图的范围内
LetN(X+I,Y+J).Number=N(X+I,Y+J).Number+One
EndIf
Next
Next
EndSub
'雷区
PrivateSubSetImage(ByValXAsLong,ByValYAsLong,OptionalByValImgIDAsLong)
'每个图片宽16,高16,ImgID=0~15
CallBitBlt(Me.hdc,MLeft/Screen.TwipsPerPixelX+X*BMP_GRID_WIDTH,MTop/Screen.TwipsPerPixelY+Y*BMP_GRID_HEIGHT,BMP_GRID_WIDTH,BMP_GRID_HEIGHT,hBmpDC(0),0,ImgID*BMP_GRID_HEIGHT,vbSrcCopy)
EndSub
'剩余地雷和时间
PrivateSubSetNumber(ByValXAsLong,ByValYAsLong,ByValNumIDAsLong,OptionalByValnWhatAsBoolean=True)
'每个数字宽13,高23,NumID=0~11
CallBitBlt(Me.hdc,X*BMP_NUM_WIDTH+IIf(nWhat,BMP_NUM_MINE_LEFT,GetMePixelWidth-BMP_NUM_TIME_RIGHT),Y*BMP_NUM_HEIGHT+BMP_NUM_TOP,BMP_NUM_WIDTH,BMP_NUM_HEIGHT,hBmpDC(1),0,BMP_NUM_HEIGHT*NumID,vbSrcCopy)
EndSub
'表情
PrivateSubSetFace(OptionalByValFaceIDAsLong=4)
'每个笑脸宽24,高24,NumID=0~4
CallBitBlt(Me.hdc,GetMePixelWidth/2-BMP_FACE_WIDTH/2-1,BMP_FACE_TOP,BMP_FACE_WIDTH,BMP_FACE_HEIGHT,hBmpDC(2),0,BMP_FACE_HEIGHT*FaceID,vbSrcCopy)
EndSub

这些只是主窗体部分代码,还有几个模块和窗体、相关文档,写不下你自己看附件

『陆』 请教扫雷算法

扫雷的算法有两种,一种是老手使用的(凭经验操作),一种是新手使用的,我现在介绍一下老手使用的算法:
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

『柒』 用LINUX编写“扫雷”游戏,怎么做

对于一个大一的学生来说,目测埋枣你的基础已经不错了,坚持努力下去应该会有不错的成就。独立游戏是个很大的话题,首先先明确想要自己一个人做还是找小团队一起合作。自己一个人做的话,设计、程序、美术、音乐等等就都得会。如果组团队做,可以重点攻坚其中1到2个方向。我主要说说技术方面。你在编程方面已经有所积累,至少算法方面应该是吧,这对于编程来说是个不错的开始。开发游戏的话,对基本的数据结构和算法要求还是很高的,再有就是软件结构的设计,这个需要较长时间的积累,最好多看看其他的游戏类工程是怎么做的,游戏和那种业务流软件的一个不同在于,游戏程序对实时性要求很高,会有一些为了性能而出现的不同的代码模式。最基本的一个东西,编程语言,看你希望的开发平台,不同平台会使用不同的开发语言,这个要熟练掌握(不是能写算法、玩具例子那么简单就行,需要知道如何用这种语言开发大型工程)。关于开发平台,多说两句。如果想要自己的程序便于大家在任何平台使用,推荐Web相关的技术,如HTML5/JavaScript(用canvas元素,如果需要GPU加速的底层3D API,canvas有WebGL绘制环境(OpenGL ES 2.0的浏览器版))。如果希望更方便开发,Unity3D是个很好的选择,是个集游戏引擎与运行平台于一体的东西,而且这个东西牛逼的地方在于所有平台都支持(PC、Mobile、Web)。如果开发手机上的原生app,推荐学习cpp以及那个平台上官方语言,这样可以用cpp开发,然后用官方语言做一个壳。如果是PC上的游戏,还是推荐cpp。另一个就是数学/物理,当然这个要看你要做什么游戏。基本的东西是几何相关的东西,基本上是个游戏都用得到。如果有不确定性(绝大部分游戏应该都需要)在里面,基本的概率分布要深刻的理解。如果要自己做物理效果(碰撞,弹性,形变等),除了需要搞定相关的物理(刚体物理,柔体物理(这个通常很麻烦),流体物理(这个也很麻烦)等),还需要搞定数值计算方法,自己做物理这个水很深,不建议自己做,用现有的物理引擎最好。如果想要做到很好的3D画面洞液闹,还需要学习计算机图形学,这里会有很多的光学,很多的立体几何,一坨线性代数的东西还有各种形式的积分。而且实时图形系统的开发对编程能力要求也非常高,除了普通程序的要求以外,还要能掌握高性能的数值密集型的代码开发(这个对于物理相关的开发也一样)。另外还需要掌握至少一个GPU加速的图形接口的使用(OpenGL,Direct3D等)以及对应的shader代码的编写。同样,如果想做到很好的画面效果,建议用现有的渲染引擎,自己做水也太深。总体上来说,2D游戏和3D游戏所需的技能还有很大差别,2D游戏在技术上的要求相对简单很多。还有就是,独立游戏可能有服务器端得比较少。如果真的需要,这方面的开发相对来说和通常的业务流软件的服务端比较相似,所以不是太复杂。不过会有很多游戏逻辑需要在服务端处理,多客户端的信息实时同步可能会成为一个比较有难度的问题。还有就是各种客户端请求的验证,反作弊用,这个一开始应该不会涉及到,不扯了。总的来说,游戏开发作为程序开发最难的一种形式之一,技术方面需要非常多的积累,这个需要时间去积累。可以先从那种非常小的小游戏(先是扫雷、贪食蛇这类休闲游戏,然后做塔防类游戏不错)做起,练手用。基本功扎实了以后可以考虑进入3D。游戏美术方面呢,2D和3D也是很不一样的。3D游戏的美术很复杂,各种模型网格的创建,各种贴图纹理的绘制。如果有人物,还需要人物动画,这又是一大块。美术我不专业,不多说了,希望哪位专业的来补充一下。2D的相对好很多,只要能画好画,基本上就能做了。游戏音乐方面,主要是纳罩作曲,用mid的话也不错,但现在好像这么做的很少了。演奏要看作的曲子的复杂度了。除了音乐还有音效,这个我不懂,不说了。设计嘛,这个是制作游戏的核心。从你的表述来看,应该是玩过不少游戏了,那应该多少能体会到各种游戏的设计模式。把自己的想法,参考现有的一些模式,规划好,做出来原型。设计这里有一个很重要的细节:开发工具要能尽可能提供高效的迭代方式,游戏的完成度是一点一点打磨出来的,而这个打磨过程的长短很大程度上取决于工具是否好用。

『捌』 能在dev-c++上运行通过的扫雷,贪吃蛇,等小游戏的c语言代码

#include<bits/stdc++.h>
#include<stdlib.h>
#include<dos.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key;
int score=0;
int gamespeed=32000;
struct Food /*食物的结构体*/
{
int x; /*食物的横坐标*/
int y; /*食物的纵坐标*/
int yes; /*食物是否出现的变量*/
}food;
struct Snack /*蛇的结构体*/
{
int x[N];
int y[N];
int node; /*蛇的节数*/
int direction; /*蛇的方向*/
int life; /*蛇的生命,0活着,1死亡*/
}snake;
void Init(void); /*图形驱动*/
void Close(void); /*关闭游戏函数*/
void DrawK(void); /*画图函数*/
void GameOver(void);/*输出失败函数*/
void GamePlay(); /*游戏控制函数 主要程序*/
void PrScore(void); /*分数输出函数*/
DELAY(char ch)/*调节游戏速度*/
{
if(ch=='3')
{
delay(gamespeed); /*delay是延迟函数*/
}
else if(ch=='2')
{
delay(gamespeed);
}
}
Menu()/*游戏开始菜单*/
{
char ch;
printf("Please choose the gamespeed:\n");
printf("1-Fast 2-Normal 3-Slow\n");
printf("\nPlease Press The numbers..\n");
do
{ch=getch();}
while(ch!='1'&&ch!='2'&&ch!='3');
clrscr();
return(ch);
}
/*主函数*/
void main(void)
{
int ch;
ch=Menu();
Init();
DrawK();
GamePlay(ch);
Close();
}
void Init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
}
void DrawK(void)
{
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);
for(i=50;i<=600;i+=10)
{
rectangle(i,40,i+10,49); /*画出上边框*/
rectangle(i,451,i+10,460); /*画出下边框*/
}
for(i=40;i<=450;i+=10)
{
rectangle(50,i,59,i+10); /*画出左边框*/
rectangle(601,i,610,i+10); /*画出右边框*/
}
}
void GamePlay(char ch)
{
randomize(); /*随机数发生器*/
food.yes=1; /*1代表要出现食物,0表示以存在食物*/
snake.life=0;
snake.direction=1;
snake.x[0]=100;snake.y[0]=100;
snake.x[1]=110;snake.y[1]=100;
snake.node=2;
PrScore();
while(1) /*可以重复游戏*/
{
while(!kbhit()) /*在没有按键的情况下蛇自己移动*/
{
if(food.yes==1) /*需要食物*/
{
food.x=rand()%400+60;
food.y=rand()%350+60; /*使用rand函数随机产生食物坐标*/
while(food.x%10!=0)
food.x++;
while(food.y%10!=0)
food.y++; /*判断食物是否出现在整格里*/
food.yes=0; /*现在有食物了*/
}
if(food.yes==0) /*有食物了就要显示出来*/
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10);
}
for(i=snake.node-1;i>0;i--) /*贪吃蛇的移动算法*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1]; /*贪吃蛇的身体移动算法*/
}
switch(snake.direction) /*贪吃蛇的头部移动算法,以此来控制移动*/
{
case 1:snake.x[0]+=10;break;
case 2:snake.x[0]-=10;break;
case 3:snake.y[0]-=10;break;
case 4:snake.y[0]+=10;break;
}
for(i=3;i<snake.node;i++) /*判断是否头部与身体相撞*/
{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
GameOver();
snake.life=1;
break;
}
}
/*下面是判断是否撞到墙壁*/
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)
{
GameOver();
snake.life=1;
}
if(snake.life==1) /*如果死亡就退出循环*/
break;
if(snake.x[0]==food.x&&snake.y[0]==food.y) /*判断蛇是否吃到食物*/
{
setcolor(0);
rectangle(food.x,food.y,food.x+10,food.y-10); /*吃的食物后用黑色将食物擦去*/
snake.x[snake.node]=-20;snake.y[snake.node]=-20; /*现把增加的一节放到看不到的地方去*/
snake.node++;
food.yes=1;
score+=10;
PrScore();
}
setcolor(4); /*每次移动后将后面的身体擦去*/
for(i=0;i<snake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);
delay(gamespeed);
DELAY(ch);
setcolor(0);
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
}
if(snake.life==1)
break;
key=bioskey(0); /*接受按键*/
if(key==ESC)
break;
else
if(key==UP&&snake.direction!=4)/*判断是否改变方向*/
snake.direction=3;
else
if(key==RIGHT&&snake.direction!=2)
snake.direction=1;
else
if(key==LEFT&&snake.direction!=1)
snake.direction=2;
else
if(key==DOWN&&snake.direction!=3)
snake.direction=4;
}
}
void GameOver(void)
{
cleardevice();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();
}
void PrScore(void)
{
char str[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"scord:%d",score);
outtextxy(55,20,str);
}
void Close(void)
{
getch();
closegraph();
}

阅读全文

与编程怎么做扫雷相关的资料

热点内容
瑞斯康达网络管理界面 浏览:254
ca证书管理器linux 浏览:358
苹果id安全提示问题3个字符 浏览:949
iphone上好的拍照软件 浏览:579
word内嵌文件怎么下载 浏览:864
8s16升级 浏览:340
计算机网络技术基础pdf 浏览:544
javafrom提交地址参数 浏览:721
git发布版本 浏览:728
vc修改文件名 浏览:149
linux65从域 浏览:321
用什么东西压缩文件 浏览:406
怎么删除ipad隐藏的APP 浏览:981
编程如何占用大量内存 浏览:116
多个excel表格文件如何组合 浏览:918
ubuntu内核升级命令 浏览:679
pgp文件夹 浏览:894
一键还原的文件是什么格式 浏览:581
女汉子微信名霸气十足 浏览:65
win10手机蓝屏修复 浏览:419

友情链接