奖励100元。注释一个java扫雷游戏源码,就是把每一行的意思写在后面!在线等待。

导入Java . awt . *;

导入javax . swing . *;

导入Java . util . random;

导入Java . awt . event . *;

Min类扩展JPanel // lei的类

{

//备注:鼠标左键= 1;右键= 3;中间键= 2

private int flag = 0,statu = 0;//定义迅雷的属性0:未打开1:打开2:标记为迅雷3:不确定。

//flag = 0不是雷霆;Flag = 1就是雷。

private int but,count = 0;//但是:按了哪个鼠标键?伯爵:这一带有多少雷?

private int mx = 0,my = 0,MW = 10;//定义地雷的坐标和宽度。

Public Min() //构造函数

{

statu = 0;

}

public Min(int f,int x,int y,int w)

//构造函数

{

flag = f;

MX = x;

my = y;

MW = w;

}

public int get flag(){ return flag;}

public int get statu(){ return statu;}

public int getMx(){ return MX;}

public int getMy(){ return my;}

public int getMw(){ return MW;}

public int get count(){ return count;}

public void set flag(int f){ flag = f;}

public void set count(int c){ count = c;}

public void setData(int f,int x,int y,int w,int s)

//传递值

{

flag = f;

MX =(x-1)* w;

my =(y-1)* w;

MW = w-1;

statu = s;

}

//根据鼠标点击的不同改变光线的属性。

public int sendKey(int key)

{

//返回值,如果游戏结束则为-1。

int RTN = 1;

if(key == 3)

{

开关(状态)

{

案例1:

打破;

案例二:

statu = 3;

打破;

案例三:

statu = 0;

打破;

案例0:

statu = 2;

打破;

}

RTN = 1;

}

if(key = = 1 & amp;& amp状态== 0)

{

开关(标志)

{

案例0:

statu = 1;

RTN = 2;

打破;

案例1:

statu = 1;

RTN =-1;

打破;

}

}

返回rtn

}

}

类DrawPanel扩展JPanel

{

private int i,j;

private int f = 0;//如果f = 1,则游戏结束,如果f =2,则获胜

private int chx = 0,chy = 0;//专门记录坐标x和y的值。

private int msum = 6,ksum = 0;//msum:地雷数量,ksum:标记的地雷数量。

private int bx = 10,by = 10,bw = 40//bx,by:棋盘的大小,bw:棋子的大小。

公共最小板[][] = {

{新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值(),

{新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值(),

{新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值(),

{新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值(),

{新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、{新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、新Min()、

{新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值(),

{新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值(),

{新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值(),

{新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值(),

{新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值(),

{新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值(),

{新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值(),

{新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值(),

{新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值(),

{新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值(),

{新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值(),

{新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值(),

{新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值(),

{新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值()、新最小值(),

};

//用坐标ax和ay画出该区域的雷的状态。

公共空绘制(Graphics g,int ax,int ay)

{

int x,y,w;//坐标x,y;和宽度:w

int s,c,flag//状态;雷声的数量;

int CX = bw/2-4;

int cy = bw/2+4;

x = board[ax][ay]。getMx();

y = board[ax][ay]。getMy();

w = board[ax][ay]。getMw();

s = board[ax][ay]。get statu();

c = board[ax][ay]。getCount();

flag= board[ax][ay]。get flag();

开关

{

案例0: //没有打开状态。

{

g . set color(color . black);

g.fillRect(x,y,w,w);

打破;

}

案例1: //打开状态

{

g . set color(color . blue);

g.fillRect(x,y,w,w);

如果(c!= 0 & amp& ampFlag == 0) //这里没有打雷。

{

g . set color(color . red);

g.drawString(String.valueOf(c),x + cx,y+cy);

}

If(flag == 1) //这里有雷。

{

g . set color(color . red);

g.fillRect(x,y,w,w);

g . set color(color . blue);

G.drawString("雷",x+cx,y+cy);

}

打破;

}

情况2: //地雷标记状态

{

g . set color(color . green);

g.fillRect(x,y,w,w);

g . set color(color . blue);

G.drawString ("flag ",x+cx,y+cy);

打破;

}

情况3: //不确定状态

{

g . set color(color . black);

g.fillRect(x,y,w,w);

g . set color(color . red);

g .拉绳("?,x + cx,y+cy);

打破;

}

默认值:

打破;

}

}

//无绘图仪绘图功能:用坐标ax,ay绘制雷霆的状态和图形。

公共无效提取(int ax,int ay)

{

图形g;

g = this . get graphics();

draw(g,ax,ay);

}

//打开周围没有雷的地方,点击左键触发绘画区域。

public int openNoMin(int ax,int ay)

{

int i,j;

if(ax & lt;1 | | ay & lt;1 | | ax & gt;bx | | ay & gtby)返回0;//鼠标点击的区域越界。

if(板[ax][ay]。getStatu()!= 0)返回0;//如果此区域已打开,则返回。

木板[ax][ay]。sendKey(1);//如果返回值等于-1,游戏结束。

draw(ax,ay);

if(板[ax][ay]。getFlag() == 1)

//如果游戏结束了,就把雷霆全部展现出来。

{

for(I = 1;我& lt= bxi++)

{

for(j = 1;j & lt= byj++)

{

if(棋盘[i][j]。getFlag() == 1)

{

理事会[i][j]。sendKey(1);

draw(i,j);

}

}

}

return-1;

}

//如果游戏没有结束。

if(板[ax][ay]。getCount()& gt;0)

{

ksum++;

返回1;//如果周围有雷,就不需要开围了。

}

if(板[ax][ay]。getCount()= = 0 & amp;& amp木板[ax][ay]。getFlag() == 0)

//周围没有打雷。打开周围直到有雷声。

{

openNoMin(ax-1,ay-1);openNoMin(ax,ay-1);openNoMin(ax+1,ay-1);

openNoMin(ax-1,ay);openNoMin(ax+1,ay);

openNoMin(ax-1,ay+1);openNoMin(ax,ay+1);openNoMin(ax+1,ay+1);

}

ksum++;

返回1;

}

//计算坐标x和y周围的雷数。

public int getCount(int ai,int aj)

{

int sum = 0;

if(板[ai][aj]。getFlag() == 1)

{

返回总和;

}

if(ai & gt;1。& ampaj & gt1。& ampai & ltbx & amp& ampaj & lt由)

{

sum = board[ai-1][aj-1]。get flag()+board[ai][aj-1]。get flag()+board[ai+1][aj-1]。getFlag()+

板[ai-1][aj ]。get flag()+board[ai+1][aj]。getFlag()+

板[ai-1][aj+1]。get flag()+board[ai][aj+1]。get flag()+board[ai+1][aj+1]。get flag();

}

if(ai = = 1 & amp;& ampaj==1)

{

sum = board[ai+1][aj ]。getFlag()+

棋盘[ai][aj+1]。get flag()+board[ai+1][aj+1]。get flag();

}

if(ai = = 1 & amp;& ampaj==by)

{

sum = board[ai][aj-1]。get flag()+board[ai+1][aj-1]。getFlag()+

板[ai+1][aj ]。get flag();

}

if(ai = = bx & amp;& ampaj==1)

{

sum = board[ai-1][aj ]。getFlag()+

板[ai-1][aj+1]。get flag()+board[ai][aj+1]。get flag();

}

if(ai = = bx & amp;& ampaj==by)

{

sum = board[ai-1][aj-1]。get flag()+board[ai][aj-1]。getFlag()+

板[ai-1][aj ]。get flag();

}

if(ai = = 1 & amp;& ampaj & gt1。& ampaj & lt由)

{

sum = board[ai][aj-1]。get flag()+board[ai+1][aj-1]。getFlag()+

板[ai+1][aj ]。getFlag()+

棋盘[ai][aj+1]。get flag()+board[ai+1][aj+1]。get flag();

}

if(ai = = bx & amp;& ampaj & gt1。& ampaj & lt由)

{

sum = board[ai-1][aj-1]。get flag()+board[ai][aj-1]。getFlag()+

板[ai-1][aj ]。getFlag()+

板[ai-1][aj+1]。get flag()+board[ai][aj+1]。get flag();

}

if(ai & gt;1。& ampai & ltbx & amp& ampaj==1)

{

sum = board[ai-1][aj ]。get flag()+board[ai+1][aj]。getFlag()+

板[ai-1][aj+1]。get flag()+board[ai][aj+1]。get flag()+board[ai+1][aj+1]。get flag();

}

if(ai & gt;1。& ampai & ltbx & amp& ampaj==by)

{

sum = board[ai-1][aj-1]。get flag()+board[ai][aj-1]。get flag()+board[ai+1][aj-1]。getFlag()+

板[ai-1][aj ]。get flag()+board[ai+1][aj]。get flag();

}

返回总和;

}

//传入参数:多少列,多少行,宽度,雷数。

public void initMin(int ax,int ay,int aw,int as)

{

int k = 1;//指示生成哪个矿。

随机r;//随机数

f = 0;//f=0表示游戏还没有结束。

ksum = 0;

bx = ax

by = ay

bw = aw

msum = as

r = new Random();

//初始化底盘的值。

for(I = 1;我& lt= bxi++)

{

for(j = 1;j & lt= byj++)

{

理事会[i][j]。setData(0,I,j,bw,0);

}

}

//随机生成雷霆

while(k & lt;= msum)

{

I = r . nextint(bx)+1;

j = r . nextint(by)+1;

if(棋盘[i][j]。getFlag()!= 1)

{

理事会[i][j]。set flag(1);

k++;

}

}

//无雷区周围有几个地雷。初始化它们的值。

for(I = 1;我& lt= bxi++)

{

for(j = 1;j & lt= byj++)

{

理事会[i][j]。setCount(getCount(i,j));

}

}

set background(color . white);

repaint();

}

//构造函数

公共绘图面板(int ax,int ay,int aw,int as)

{

initMin(ax,ay,aw,as);

addMouseListener(新的MouseAdapter()

{

公共void mousePressed(MouseEvent me)

{

int r;

如果(f!= 0)返回;//如果游戏结束,返回。

CHX = me . getx();

chy = me . gety();

if(me.getButton()!= 1)

{

板[CHX/bw+1][chy/bw+1]。sendKey(me . get button());

draw(chx/bw+1,chy/bw+1);

}

else if(me.getButton() == 1)

{

if(openNoMin(chx/bw+1,chy/bw+1) == -1)

{

f = 1;

repaint();

}

else if ( ksum + msum == bx*by)

{

f = 2;

repaint();

}

}

}

}

);

}

//重新绘制所有图形,包括一些修饰过的图形。

公共空白油漆(图形g)

{

int x,y,w;

int s;

int CX = bw/2-4;

int cy = bw/2+4;

g.clearRect(0,0,600,600);

for(I = 1;我& lt= bxi++)

{

for(j = 1;j & lt= byj++)

{

draw(g,I,j);

}

}

如果(f == 1)

{

字体f =新字体(" 11 ",1,70);

font fo = g . get font();

g . set color(color . white);

g . set font(f);

//g . setsize();

g.drawString(“游戏结束”,0,200);

g . set font(fo);

}

如果(f == 2)

{

字体f =新字体(" 11 ",1,70);

font fo = g . get font();

g . set color(color . white);

g . set font(f);

//g . setsize();

g.drawString("你赢了!",0,200);

g . set font(fo);

}

}

};

//主类和程序的入口

公共类Mine扩展JFrame实现ActionListener

{

container CP = getContentPane();

JButton Bt = new JButton(" opening ");

Label l1 =新标签("列:");

Label l2 =新标签(" line:");

Label l3 =新标签(" width:");

标签l4 =新标签(“雷数:“);

TextField TF 1 = new TextField(" 10 ",2);//列

TextField tf2 = new TextField(" 10 ",2);//线

TextField tf3 = new TextField("40 ",2);//宽度

TextField tf4 = new TextField(" 15 ",2);//雷霆的数量

int x=10,y=10,w=40,sum = 15;

DrawPanel dp =新DrawPanel(x,y,w,sum);

公共矿山()

{

set background(color . white);

cp.setLayout(空);

CP . add(DP);

CP . add(Bt);

CP . add(TF 1);

CP . add(tf2);

CP . add(tf3);

CP . add(tf4);

CP . add(l 1);

CP . add(L2);

CP . add(L3);

CP . add(l4);

l1.setBounds(20,10,20,20);

tf1.setBounds(40,10,20,20);

l2.setBounds(70,10,20,20);

tf2.setBounds(90,10,20,20);

l3.setBounds(120,10,40,20);

tf3.setBounds(160,10,20,20);

l4.setBounds(190,10,60,20);

tf4.setBounds(250,10,20,20);

bt.setBounds(300,10,80,20);

dp.setBounds(20,40,x*w,y * w);

setResizable(false);

setSize(x*w+40,y * w+80);

SetTitle("排雷");

show();

Bt . addactionlistener(this);

addWindowListener(新WindowAdapter()

{公共void窗口关闭(WindowEvent e)

{ system . exit(0);}

}

);

}

公共无效操作已执行(操作事件e)

{

if(e.getSource() == bt)

{

//x = integer . parse int(TF 1 . gettext());

//y = integer . parse int(tf2 . gettext());

//w = integer . parse int(tf3 . gettext());

sum = integer . parse int(tf4 . gettext());

setSize(x*w+40,y * w+80);

dp.setBounds(20,40,x*w,y * w);

show();

dp.initMin(x,y,w,sum);

}

}

公共静态void main(String args[])

{

新矿();

}

};