📄 gametest.java
字号:
DefineFrame defineFrm=new DefineFrame(GameFrame.this,true,x,y);
}
} );
//复选菜单项
JCheckBoxMenuItem colorItem=new MyCheckBoxMenuItem("颜色(L)");
JCheckBoxMenuItem soundItem=new MyCheckBoxMenuItem("声音(S)");
JCheckBoxMenuItem iconItem=new MyCheckBoxMenuItem("标记(M)");
//设置复选菜单项快捷键
colorItem.setMnemonic(KeyEvent.VK_L);
soundItem.setMnemonic(KeyEvent.VK_S);
iconItem.setMnemonic(KeyEvent.VK_M);
//将元素加入菜单
gameSetMenu.add(startItem);
gameSetMenu.addSeparator();
gameSetMenu.add(easyItem);
gameSetMenu.add(normalItem);
gameSetMenu.add(hardItem);
gameSetMenu.add(definedItem);
gameSetMenu.addSeparator();
gameSetMenu.add(iconItem);
gameSetMenu.add(colorItem);
gameSetMenu.add(soundItem);
gameSetMenu.addSeparator();
gameSetMenu.add(heroListItem);
gameSetMenu.addSeparator();
gameSetMenu.add(exitItem);
helpMenu.add(indexItem);
helpMenu.add(serHelpItem);
helpMenu.add(helpItem);
helpMenu.add(aboutItem);
// 设置分隔符
helpMenu.insertSeparator(3);
menuTitle.add(gameSetMenu);
menuTitle.add(helpMenu);
this.setJMenuBar(menuTitle);
}
//初始化窗口
private void initialFrame(){
//设置观感为WINDOWS观感
String plaf="com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
try{
UIManager.setLookAndFeel(plaf);
SwingUtilities.updateComponentTreeUI(this);
}
catch(Exception e){
e.printStackTrace();
}
this.setResizable(false);
panelX=9;
panelY=9;
//设置窗口相关信息
this.setTitle("扫雷");
this.setLocation(200,100);
this.setVisible(true);
Toolkit tk=Toolkit.getDefaultToolkit();
this.setIconImage(tk.createImage("images\\title.gif"));
Container cont=this.getContentPane();
panelScore=new JPanel(new BorderLayout());
panelBody=new JPanel(new GridLayout(panelY,panelX));
panelMine=new JPanel(new FlowLayout(FlowLayout.LEFT,0,0));
panelTime=new JPanel(new FlowLayout(FlowLayout.RIGHT,0,0));
JPanel panelSmile=new JPanel(new FlowLayout(FlowLayout.CENTER,5,7));
JPanel panelWest=new JPanel(new FlowLayout(FlowLayout.LEFT,10,7));
JPanel panelEast=new JPanel(new FlowLayout(FlowLayout.RIGHT,10,7));
JPanel panelMain=new JPanel(new BorderLayout());
//设置颜色
this.setBackground(Color.LIGHT_GRAY);
panelBody.setBackground(Color.LIGHT_GRAY);
panelScore.setBackground(Color.LIGHT_GRAY);
panelWest.setBackground(Color.LIGHT_GRAY);
panelEast.setBackground(Color.LIGHT_GRAY);
panelSmile.setBackground(Color.LIGHT_GRAY);
cont.add(panelMain);
panelMain.setBorder(BorderFactory.createRaisedBevelBorder());
panelMain.add("Center",panelScore);
panelMain.add("South",panelBody);
//设置边框
Border panelBorder=BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(5,5,3,5),BorderFactory.createBevelBorder(BevelBorder.LOWERED));
panelScore.setBorder(panelBorder);
panelBorder=BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(2,5,5,5),BorderFactory.createBevelBorder(BevelBorder.LOWERED));
//panelBorder=BorderFactory.createCompoundBorder(panelBorder,BorderFactory.createEmptyBorder(1,1,1,1));
panelBody.setBorder(panelBorder);
//设置按钮图片
URL url = GameTest.class.getResource("images/face1.gif");
imgSmile=new ImageIcon(url);
url=GameTest.class.getResource("images/face2.gif");
ico=new ImageIcon(url);
btnSmile=new JButton(imgSmile);
btnSmile.setFocusable(false);
btnSmile.setPreferredSize(new Dimension(22,22));
btnSmile.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
openGame();
}
});
//添加雷数面板
mineLabelBai =new JLabel();
mineLabelShi =new JLabel();
mineLabelGe =new JLabel();
panelMine.add(mineLabelBai);
panelMine.add(mineLabelShi);
panelMine.add(mineLabelGe);
url = GameTest.class.getResource("images/d0.gif");
mineLabelBai.setIcon(new ImageIcon(url));
mineLabelShi.setIcon(new ImageIcon(url));
mineLabelGe.setIcon(new ImageIcon(url));
timeH =new JLabel();
timeM =new JLabel();
timeL =new JLabel();
panelTime.add(timeH);
panelTime.add(timeM);
panelTime.add(timeL);
timeH.setIcon(new ImageIcon(url));
timeM.setIcon(new ImageIcon(url));
timeL.setIcon(new ImageIcon(url));
panelSmile.add(btnSmile);
panelWest.add(panelMine);
panelEast.add(panelTime);
panelScore.add("West",panelWest);
panelScore.add("Center",panelSmile);
panelScore.add("East",panelEast);
//生成菜单
createMenu();
//生成计时器
ActionListener timePerformed=new ActionListener(){
public void actionPerformed(ActionEvent evt){
showTime++;
showTime(showTime);
}
};
clock=new Timer(1000,timePerformed);
//生成雷
setLevel(9,9,10);
}
/*方法:设置难度
输入参数:width 宽 height 高
如果 宽或高的一个小于9 默认产生9*9的窗口
*/
public void setLevel(int width,int height,int mine){
clock.stop();
btnSmile.setIcon(imgSmile);
pass=false;
gameStart=false;
panelBody.removeAll();
if ((width<9)||(height<9)){
width=9;
height=9;
}
panelX=width;
panelY=height;
mine_Count=mine;
mine_AllCount=mine;
showTime=0;
showTime(showTime);
showMineCount(mine_Count);
panelBody.setLayout(new GridLayout(panelY,panelX));
panelScore.setPreferredSize(new Dimension(0,50));
btn=null;
btn=new MyButton[panelX][panelY];
for(int j=0;j<panelY;j++){
for(int i=0;i<panelX;i++){
btn[i][j]=new MyButton();
btn[i][j].setLocate(i,j);
btn[i][j].addMouseMotionListener(new MouseMotionAdapter(){
public void mouseDragged(MouseEvent e){
// ((MyButton)(e.getSource())).setBorder(null);
// URL url=GameTest.class.getResource("images/0.gif");
// ((MyButton)(e.getSource())).setIcon(new ImageIcon(url));
}
});
btn[i][j].addMouseListener( new MouseAdapter(){
public void mousePressed(MouseEvent e){
btnSmile.setIcon(ico);
if (e.getModifiersEx()==e.BUTTON1_DOWN_MASK+e.BUTTON3_DOWN_MASK){
((MyButton)(e.getSource())).both=2;
((MyButton)(e.getSource())).roundDown();
}
//System.out.println ("x="+String.valueOf(((MyButton)(e.getSource())).getLocate().x)+"y="+String.valueOf(((MyButton)(e.getSource())).getLocate().y));
if ((!((MyButton)(e.getSource())).isFlag())&&(!((MyButton)(e.getSource())).isOpen())&&e.getButton()!=3){
((MyButton)(e.getSource())).setBorder(null);
URL url=GameTest.class.getResource("images/0.gif");
((MyButton)(e.getSource())).setIcon(new ImageIcon(url));
}
if ((!gameStart)&&e.getButton()==1){
setMine(((MyButton)(e.getSource())).getLocate().x,((MyButton)(e.getSource())).getLocate().y);
countRoundMine();
gameStart=true;
clock.start();
}
}
public void mouseReleased(MouseEvent e){
btnSmile.setIcon(imgSmile);
// //左右键
if ((((MyButton)(e.getSource())).both==2)&&((MyButton)(e.getSource())).isOpen()){
((MyButton)(e.getSource())).doubleQuick();
if (!((MyButton)(e.getSource())).isOpen()){
((MyButton)(e.getSource())).setBorder(BorderFactory.createRaisedBevelBorder());
URL url=GameTest.class.getResource("images/blank.gif");
((MyButton)(e.getSource())).setIcon(new ImageIcon(url));
}
}
else
{
if (!((MyButton)(e.getSource())).isOpen()&&!((MyButton)(e.getSource())).isFlag()){
((MyButton)(e.getSource())).setBorder(BorderFactory.createRaisedBevelBorder());
URL url=GameTest.class.getResource("images/blank.gif");
((MyButton)(e.getSource())).setIcon(new ImageIcon(url));
}
((MyButton)(e.getSource())).roundUp();
}
if (!((MyButton)(e.getSource())).isOpen()&&((MyButton)(e.getSource())).both==0){
//左键
if ((e.getButton()==e.BUTTON1)&&(!((MyButton)(e.getSource())).isFlag())){
((MyButton)(e.getSource())).showMine();
//showAllMine();
}
//右键
if ((e.getButton()==e.BUTTON3)){
((MyButton)(e.getSource())).setOpen(false);
if ((!((MyButton)(e.getSource())).isFlag())&&(!((MyButton)(e.getSource())).isAsk())){
URL url=GameTest.class.getResource("images/flag.gif");
((MyButton)(e.getSource())).setIcon(new ImageIcon(url));
mine_Count--;
((MyButton)(e.getSource())).setFlag(true);
}
else if(!((MyButton)(e.getSource())).isAsk()){
URL url=GameTest.class.getResource("images/ask.gif");
((MyButton)(e.getSource())).setIcon(new ImageIcon(url));
mine_Count++;
((MyButton)(e.getSource())).setFlag(false);
((MyButton)(e.getSource())).setAsk(true);
}
else{
URL url=GameTest.class.getResource("images/blank.gif");
((MyButton)(e.getSource())).setIcon(new ImageIcon(url));
//((MyButton)(e.getSource())).setFlag(false);
((MyButton)(e.getSource())).setAsk(false);
}
}
}
if (mine_Count==0){
boolean vflag=true;
for(int i=0;i<panelX;i++){
for(int j=0;j<panelY;j++){
if (btn[i][j].isMine()){
if(btn[i][j].isFlag()){
}
else{
vflag=false;
break;
}
}
else
{
if(btn[i][j].isOpen()){
}
else{
vflag=false;
break;
}
}
}
}
if(vflag){
pass();
}
}
//非雷全部展开自动获胜
boolean flag2=true;
for(int i=0;i<panelX;i++){
for(int j=0;j<panelY;j++){
if (!btn[i][j].isMine()){
if(!btn[i][j].isOpen()){
flag2=false;
break;
}
}
}
}
if((flag2)){
pass();
}
//更新雷显示屏
if(!pass){
showMineCount(mine_Count);
}
if (((MyButton)(e.getSource())).both>0){
((MyButton)(e.getSource())).both--;
}
// if (((MyButton)(e.getSource()))both>0){
// ((MyButton)(e.getSource())).both--;
// }
}
});
panelBody.add(btn[i][j]);
}
}
this.pack();
}
//布雷
private void setMine(int beginX,int beginY){
for(int i=0;i<mine_Count;i++){
int m,n=0;
m=(int)(Math.random()*panelX);
n=(int)(Math.random()*panelY);
if ((btn[m][n].isMine())||((beginX==m)&&(beginY==n))){
i--;
}
else{
btn[m][n].setMine(true);
}
}
}
//展示雷
private void showAllMine(){
for(int i=0;i<panelX;i++){
for(int j=0;j<panelY;j++)
{
btn[i][j].setBorder(BorderFactory.createEmptyBorder());
btn[i][j].showMine();
}
}
}
//判断周围的雷
private void countRoundMine(){
for(int i=0;i<panelX;i++){
for(int j=0;j<panelY;j++){
if (((i-1)>=0)&&((j-1)>=0)){
if (btn[i-1][j-1].isMine())
btn[i][j].upMine();
}
if ((j-1)>=0){
if (btn[i][j-1].isMine())
btn[i][j].upMine();
}
if (((i+1)<panelX)&&((j-1)>=0)){
if (btn[i+1][j-1].isMine())
btn[i][j].upMine();
}
if ((i-1)>=0){
if (btn[i-1][j].isMine())
btn[i][j].upMine();
}
if ((i+1)<panelX){
if (btn[i+1][j].isMine())
btn[i][j].upMine();
}
if (((i-1)>=0)&&((j+1)<panelY)){
if (btn[i-1][j+1].isMine())
btn[i][j].upMine();
}
if ((j+1)<panelY){
if (btn[i][j+1].isMine())
btn[i][j].upMine();
}
if (((i+1)<panelX)&&((j+1)<panelY)){
if (btn[i+1][j+1].isMine())
btn[i][j].upMine();
}
}
}
}
//开局
private void openGame(){
setLevel(panelX,panelY,mine_AllCount);
//showAllMine();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -