導入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[])
{
新礦();
}
};