奖励100元。注释一个java扫雷游戏源码,就是把每一行的意思写在后面!在线等待。
导入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[])
{
新矿();
}
};