Java编写的扫雷小程序
java扫雷游戏开发文档

JAVA扫雷游戏开发文档一、程序思想扫雷是一款相当经典的小游戏,下面是我们的扫雷程序思想。
我们可以把整个雷区看成一个二维数组.首先我们在雷区上随机地放上雷,这可以用random类来实现。
当没有雷的地方被点击后就会显示一个数字表示它周围有几个雷,要实现这个功能,,如雷区a[i][j]:a[1][1] a[1][2] a[1][3] a[1][4] a[1][5] a[1][6] a[1][7] a[1][8] a[2][1] a[2][2] a[2][3] a[2][4] a[2][5] a[2][6] a[2][7] a[2][8] a[3][1] a[3][2] a[3][3] a[3][4] a[3][5] a[3][6] a[3][7] a[3][8] a[4][1] a[4][2] a[4][3] a[4][4] a[4][5] a[4][6] a[4][7] a[4][8] a[5][1] a[5][2] a[5][3] a[5][4] a[5][5] a[5][6] a[5][7] a[5][8] 我们可以发现a[i][j]周围存在着如下关系:a[i-1][j-1] a[i-1][j] a[i-1][j+1]a[i][j-1] a[i][j] a[i][j+1]a[i+1][j-1] a[i+1][j] a[i+1][j+1]于是,可以从a[i][j]的左上角顺时针开始检测。
当然,如果超出边界,要用约束条件再加以判断!扫雷程序还会自动展开已确定没有雷的雷区。
如果a[3][4]周围雷数为1,a[2][3]已被标示为地雷,那么a[2][4],a[2][5],a[3][3],a[3][5],a[4][3],a[4][4],a[4][5]将被展开,一直波及到不可确定的雷区。
这也是实现的关键!我们可以把数组的元素设定为一个类对象(类中定义:第几号方块,周围雷数,是否为雷,是否被点击,探雷标记,是否点击右键),它们所属的类设定这样的一个事件:在被展开时,检查周围的雷数是否与周围标示出来的雷数相等,如果相等则展开周围未标示的雷区。
Java课程设计扫雷小游戏

Java扫雷游戏设计报告1·设计内容及要求1.1·扫雷小游戏的基本要求扫雷小游戏主要采用Java语言编写,适合windows XP 以下的系统,以eclipse 为平台。
具体要求如下:<1> 扫雷小游戏分为初级、中级和高级三个级别,扫雷排行榜保存着每个级别的最好成绩,即挖出全部的地雷并且用时最少。
单机游戏菜单选择“初级”、“中级”和“高级”。
<2> 游戏默认的是初级级别,用户可以选择不同级别将出现对应级别的扫雷区域,单击扫雷区域任一方格以便启动计时器。
<3> 用户选择某个方格,单击它就行。
若所选择的放阁下有雷,这一局就结束了,若所选择方格下无雷,则会显示一个数字,该数字代表方格周围8个方格中共有几颗雷。
<4> 如果用户认为某个方格下有雷,单击右键可以在方格上标记一个用户认为是雷的图标(一个小旗子)。
<5> 用户可以选择标记为疑问的方格,可以选择游戏菜单下的标记,或者双击右键所选方格显示(?)图标。
<6> 扫雷完成后,程序弹出保存成绩的对话框,用户可以根据自身选择是否保存。
<7> 如果用户喜欢有提示音,可以选择游戏菜单中的声音选项,单击扫雷区域任一方格,就会听到吧嗒声。
当点中地雷时,将会有爆炸声音响起,胜利后,将播放凯旋的旋律。
1.2 需求实现的主要功能(1)该游戏具有计时功能,即扫完全部地雷所花费的时间。
(2)用户可以选择是否有音效。
(3)用户可以自定义级别,还可以输入任意地雷数。
(4)自动保存扫雷排行榜。
2·需求分析2.1 扫雷区域的布局设计系统的整体布局为:CardLayout 布局,采用菜单、按钮、面板……等组件,菜单项主要有开始,选择级别,自定义,标记,声音,扫雷排行榜,退出,按钮的功能是重新开始游戏(可以选择游戏菜单里的开局,也可以点击企鹅图标重新开始游戏)。
2.2 雷区的设计MineArea类是javax.swing 包中Jpanel容器的子类,实现了ActionListener 和MouseListener接口,所创建的对象:mineArea是MineGame类中最重要的成员之一,作为一个容器添加到MineGame窗口的中心。
教你怎么用Java开发扫雷游戏

教你怎么⽤Java开发扫雷游戏⽬录⼀、效果图⼆、实现思路三、代码实现3.1 设置头部3.2 设置游戏区域按钮3.3 设置雷3.4 计算周围雷的数量并显⽰3.5 添加点击事件3.6 打开指定按钮3.7 触雷爆炸3.8 递归打开周围3.9 ⿏标右键事件四、胜利判定⼀、效果图⼆、实现思路1.界⾯上可以点开的各种实际都是按钮,创建9⾏9列的⼆维数组,然后根据这个数组来创建JButton。
2.对应创建⼆维数组data,⽤来存取数据,0表⽰周围⽆雷,-1表⽰当前是雷,其他数字表⽰周围雷的数量。
3.对应创建⼆维数组state,⽤来存取按钮状态,0未打开,1 打开 2旗⼦ 3 未知(控制显⽰对应的图标)4.设置雷:随机⾏数 i 和列数 j,根据随机到 i、j 从⼆维数组data中取出对应的元素值,若值不为-1(不是雷),则将此元素data[i][j]设置为-1,若值是-1(已经是雷了),则跳过,不管是否跳过都进⾏递归,直到雷的数量达到设定的最⼤数量,跳出递归。
5.设置周围雷的数量:计算每个元素周围的雷数量(周围指的是左上、上、右上、右、右下、下、左下、左这8个位置),循环⼆维数组data,判断当前值不是-1,则需要计算周围雷的数量,等会细说。
6.有任⼀格⼦被揭开,则游戏开始并且计时,当格⼦被揭开的时候分3种情况(1)格⼦是雷,执⾏爆炸动画,游戏结束。
(2)当前格⼦周围有雷,则仅仅打开此格⼦,对应显⽰周围雷数量的数字图⽚。
(3)当前格⼦不是雷且周围没有雷(data取到的元素值为0),则依次打开周围,并且被打开的周围元素也没有雷的情况下,继续打开(递归)。
7.右键可以进⾏插⼩旗、打问号等操作(对数组state进⾏的操作)。
三、代码实现3.1 设置头部//设置头部private void setHeader() {Container container = new Container();container.setLayout(new GridLayout(1, 3));timeJLabel = new JLabel("时间:"+time,JLabel.CENTER);timeJLabel.setForeground(Color.DARK_GRAY);timeJLabel.setFont(new Font("微软雅⿊",Font.BOLD, 16));leiJLabel = new JLabel("雷:"+curLeiCount,JLabel.CENTER);leiJLabel.setForeground(Color.DARK_GRAY);leiJLabel.setFont(new Font("微软雅⿊",Font.BOLD, 16));reStart = new JButton((ImageIcon)imageMap.get(21));Dimension preferredSize = new Dimension(100,40);reStart.setPreferredSize(preferredSize);reStart.addActionListener(this);//注意添加顺序container.add(timeJLabel);container.add(reStart);container.add(leiJLabel);mainFrame.add(container,BorderLayout.NORTH);}3.2 设置游戏区域按钮1.创建容器,并采⽤GridLayout 布局。
扫雷的java程序

扫雷不能不说一款非常经典的游戏,无聊时候可以打发时间,虽然玩了很久,但还不知道它是怎么写的,所以自己就尝试动手做了个。
众所周知,java的swing采用mvc模式,即模型-视图-控制器,所以如果真的了解了这个模式,较c++,用java做个游戏还是比较容易的。
下面是我写的扫雷的代码import java.awt.*;import java.io.*;import .URL;import java.awt.geom.*;import java.awt.event.*;import javax.swing.*;import java.util.ArrayDeque;import java.util.ArrayList;import java.util.concurrent.*;public class MineSweep{public static void main(String[] args){JFrame frame = new MineFrame();frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}}class MineFrame extends JFrame{private JPanel buttonPanel;private MinePanel mp;private int rn,cn;public static final int DEFAULT_WIDTH = 650; public static final int DEFAULT_HEIGHT = 450; public static final int DEFAULT_CN = 9;public static final int DEFAULT_RN = 9;public JLabel remainMine;public JLabel mes;private JComboBox cb;public MineFrame(){setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);setTitle("扫雷");mp = new MinePanel(DEFAULT_CN,DEFAULT_RN,this); mp.setMinenum(10);mp.setRC(9,9);buttonPanel = new JPanel();add(mp,BorderLayout.CENTER);mes = new JLabel("");mes.setEnabled(false);add(mes,BorderLayout.EAST);cb = new JComboBox();cb.setEditable(true);cb.addItem("初级");cb.addItem("中级");cb.addItem("高级");cb.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {int index = cb.getSelectedIndex(); System.out.println(index);switch(index){case 0:mp.setMinenum(10);mp.setRC(9,9);break;case 1:mp.setMinenum(40);mp.setRC(16,16);break;case 2:mp.setMinenum(99);mp.setRC(30,16);break;}}});JButton showAll = new JButton("显示所有地雷");showAll.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e){mp.showMines();}});buttonPanel.add(showAll);JButton replay = new JButton("重新开始");replay.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e){mp.updateMines();}});buttonPanel.add(replay);buttonPanel.add(cb);remainMine = new JLabel("剩余雷数:" +mp.getMinenum()); add(remainMine,BorderLayout.SOUTH);add(buttonPanel,BorderLayout.NORTH);}}class Pair{public Pair(int r,int c){this.r = r;this.c =c;}public int r;public int c;}class MinePanel extends JPanel implements MouseListener {private int cn,rn;private int minenum;private Mine[][] mines;private int hideMine = minenum;private int ableMn ;private MineFrame f;private boolean over ;private int w,h;private boolean win;public static ArrayList<Image> IMAGES = new ArrayList<Image>(12); public MinePanel(int rn,int cn,MineFrame f){IMAGES.add(new ImageIcon(getURL(".\\img\\0.gif")).getImage()); IMAGES.add(new ImageIcon(getURL(".\\img\\1.gif")).getImage()); IMAGES.add(new ImageIcon(getURL(".\\img\\2.gif")).getImage()); IMAGES.add(new ImageIcon(getURL(".\\img\\3.gif")).getImage()); IMAGES.add(new ImageIcon(getURL(".\\img\\4.gif")).getImage()); IMAGES.add(new ImageIcon(getURL(".\\img\\5.gif")).getImage()); IMAGES.add(new ImageIcon(getURL(".\\img\\6.gif")).getImage()); IMAGES.add(new ImageIcon(getURL(".\\img\\7.gif")).getImage()); IMAGES.add(new ImageIcon(getURL(".\\img\\8.gif")).getImage()); IMAGES.add(new ImageIcon(getURL(".\\img\\mine.gif")).getImage()); IMAGES.add(new ImageIcon(getURL(".\\img\\11.gif")).getImage()); IMAGES.add(new ImageIcon(getURL(".\\img\\12.gif")).getImage()); this.f = f;this.rn = rn; = cn;this.ableMn = rn * cn;addMouseListener(this);updateMines();}public URL getURL(String file){URL url =null;try{url = this.getClass().getResource(file); }catch(Exception e){e.printStackTrace();}return url;}public void decAbleMn(){ableMn --;}public int getAbleMn(){return ableMn;}public void decHideMine(){hideMine --;}public void incHideMine(){hideMine ++;}public int getHideMine(){return hideMine;}public void setMinenum(int n){minenum = n;}public int getMinenum(){return minenum;}public void mousePressed(MouseEvent e) {if(!over){int x = (int)e.getX();int y = (int)e.getY();int keyCode = e.getButton();int c,r;r = x/Mine.WIDTH;c = y/Mine.HEIGHT;switch(keyCode){case MouseEvent.BUTTON1:if(mines[r][c].getFlag() == false) {try{mines[r][c].setOpen();decAbleMn();if(mines[r][c].getImage() == 9){over = true;decHideMine();showMines();}else if(mines[r][c].getImage() == 0) {if(getAbleMn() == rn * cn - minenum) {win = true;}openNear(r,c);}}catch(Exception ex){//e.printStackTrace();}repaint();}break;case MouseEvent.BUTTON3:if( mines[r][c].isOpen() == false || mines[r][c].getFlag() == true) {if(mines[r][c].getFlag() == true){incHideMine();mines[r][c].setFlag();repaint();}else if(hideMine > 0){mines[r][c].setFlag();decHideMine();repaint();}}break;}}}public void mouseReleased(MouseEvent e){}public void mouseClicked(MouseEvent e){}public void mouseEntered(MouseEvent e){}public void mouseExited(MouseEvent e){}private ArrayDeque<Pair> queue = new ArrayDeque<Pair>(20); public void openNear(int r,int c){int i,j;i = r;j = c;for(int n = -1; n <= 1; n ++){r = i + n;if(r >= 0 && r <mines.length)for(int k = -1; k <=1; k ++){c = j + k;if(c >= 0 && c < mines[r].length){if(mines[r][c].isOpen() == false && mines[r][c].getImage() == 0) {mines[r][c].setOpen();queue.add(new Pair(r,c));}else{if(mines[r][c].getFlag() ==true){mines[r][c].setFlag();incHideMine();}mines[r][c].setOpen();}}}}for(i = 0 ;i < queue.size(); i ++){Pair p = queue.poll();openNear(p.r,p.c);}}public void setRC(int rn,int cn){this.rn = rn; = cn;updateMines();repaint();}public void updateMines(){removeAll();win = false;over = false;f.setSize((10 +rn) * 20,(cn + 10) * 20);setSize(rn * Mine.HEIGHT,cn * Mine.WIDTH);mines = new Mine[rn][cn];for(int i = 0;i < mines.length;i ++)for(int j = 0 ;j < mines[i].length; j ++){mines[i][j] = new Mine(i,j);}int mn = getMinenum();hideMine = mn;for(int i = 0; i <mn;i ++){int r,c;do{r = (int)(Math.random() * rn);c = (int)(Math.random() * cn);}while(mines[r][c].getImage() == 9); mines[r][c].setImage(9);}generateNum();repaint();}public void generateNum(){int r,c;for(int i = 0 ;i < mines.length;i ++)for(int j = 0 ;j < mines[i].length; j ++) if(mines[i][j].getImage() != 9){int cnum = 0 ;for(int n = -1; n <= 1; n ++){r = i + n;if(r >= 0 && r < mines.length)for(int k = -1 ;k <=1; k ++){c = j + k;if(c >= 0 && c < mines[i].length){if(mines[r][c].getImage() == 9)cnum ++;}}}mines[i][j].setImage(cnum);}}public void paintComponent(Graphics g) {super.paintComponent(g);int c = 0;Graphics2D g2 = (Graphics2D) g;for(int i = 0 ;i < mines.length; i ++)for(int j = 0 ;j < mines[i].length; j ++){g2.setColor(mines[i][j].getColor());g2.draw(mines[i][j].getShape());if(mines[i][j].getFlag() == true && mines[i][j].isOpen() == false)g.drawImage(IMAGES.get(10),mines[i][j].getW(),mines[i][j].getH(),Mine .HEIGHT,Mine.WIDTH,this);if(mines[i][j].isOpen()&& mines[i][j].getFlag() == false ){g.drawImage(IMAGES.get(mines[i][j].getImage()),mines[i][j].getW(),min es[i][j].getH() ,Mine.HEIGHT,Mine.WIDTH,this);c ++;}}f.remainMine.setText("剩余雷数:" + getHideMine() );}public void showMines(){removeAll();for(int i = 0 ;i <mines.length; i ++)for(int j = 0 ; j < mines[i].length; j ++){if(mines[i][j].getImage() == 9){if(mines[i][j].getFlag() == false)mines[i][j].setOpen();}else{if(mines[i][j].getFlag() == true){mines[i][j].setOpen();mines[i][j].setFlag();mines[i][j].setImage(11);}}}hideMine = 0;repaint();}}class Mine{private Rectangle2D rect = null;public static final ImageIcon IMAGE = new ImageIcon("mine.gif");public static final int HEIGHT = 20;public static final int WIDTH = 20;private boolean flag = false;private boolean open = false;public static final Color DEFAULT_COLOR = Color.BLACK;private int image = 0;private Color color;private boolean isMine = false;private int w,h;public Mine(int r,int c){this.w = r * HEIGHT;this.h = c * HEIGHT;rect = new Rectangle2D.Double(1.0D *r * HEIGHT,1.0D *c * WIDTH ,1.0D *HEIGHT,1.0D *WIDTH);setColor(DEFAULT_COLOR);}public void setMine(){isMine = true;}public boolean isMine(){return isMine;}public void setColor(Color c)this.color = c;}public Color getColor() {return color;}public void setOpen(){open = true;}public boolean isOpen() {return open;}public void setImage(int n) {image =n;}public int getImage(){return image;}public int getW()return w;}public int getH(){return h;}public void setFlag(){flag = !flag;}public boolean getFlag(){return flag;}public Shape getShape(){return rect;}}代码主要包含三个类,MineSweep,MinePanel和Mine类。
JAVA实现经典扫雷游戏的示例代码

JAVA实现经典扫雷游戏的⽰例代码⽬录前⾔主要设计功能截图代码实现总结前⾔windows⾃带的游戏《扫雷》是陪伴了⽆数⼈的经典游戏,本程序参考《扫雷》的规则进⾏了简化,⽤java语⾔实现,采⽤了swing技术进⾏了界⾯化处理,设计思路⽤了⾯向对象思想。
主要需求1、要有难度等级,初级,中级,⾼级2、由玩家逐个翻开⽅块,以找出所有地雷为最终游戏⽬标。
如果玩家翻开的⽅块有地雷,则游戏结束3、游戏主区域由很多个⽅格组成。
使⽤⿏标左键随机点击⼀个⽅格,⽅格即被打开并显⽰出⽅格中的数字;⽅格中数字则表⽰其周围的8个⽅格隐藏了⼏颗雷。
4、⽤户右键可标记雷的位置5、雷都被标记出来则胜利主要设计1、格⼦格数固定为10*10格2、难度等级,初级:12,中级:24,⾼级:363、点击格⼦时,产⽣没有引爆的地图效果;4、点击格⼦时,此格⼦是雷,则显⽰所有雷的位置,并递归清空⾮雷格⼦,结束游戏5、实现检查所有的雷是否都被标记出来了,如果是,则胜利算法。
6、实现计时器算法,⽤来计时显⽰游戏开始多少秒7、实现难度等级,雷数的显⽰8、实现⿏标左键的实现逻辑9、实现⿏标右键的标记逻辑功能截图开始界⾯左键选中格⼦效果左键选中雷效果右键标记雷效果胜利效果代码实现程序启动类public class JMine extends JFrame implements MouseListener, ActionListener {private JMineArth mine;private JMineButton[][] mineButton;private GridBagConstraints constraints;private JPanel pane;private GridBagLayout gridbag;private boolean gameStarted;private static JCounter mineCounter;private static JCounter timeCounter;private Timer timer;private Timer winTimer = new Timer();public int numMine;public int numFlaged;private JMenuBar mb;private JMenu mGame;private JMenuItem miEasy;private JMenuItem miMiddle;private JMenuItem miHard;private JMenuItem miExit;private JMenu mHelp;private JMenuItem miAbout;private JPanel controlPane;private JButton bTest;private AboutFrame about;private WinFrame winFrame;private ImageIcon[] mineNumIcon = { new ImageIcon(JMine.class.getClassLoader().getResource("blank1.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("1.gif")), new ImageIcon(JMine.class.getClassLoader().getResource("2.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("3.gif")), new ImageIcon(JMine.class.getClassLoader().getResource("4.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("5.gif")), new ImageIcon(JMine.class.getClassLoader().getResource("6.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("7.gif")), new ImageIcon(JMine.class.getClassLoader().getResource("8.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("0.gif"))};private ImageIcon[] mineStatus = { new ImageIcon(JMine.class.getClassLoader().getResource("blank1.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("flag.gif")), new ImageIcon(JMine.class.getClassLoader().getResource("question.gif")) }; private ImageIcon[] mineBombStatus = { new ImageIcon(JMine.class.getClassLoader().getResource("0.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("mine.gif")), new ImageIcon(JMine.class.getClassLoader().getResource("wrongmine.gif")), new ImageIcon(JMine.class.getClassLoader().getResource("bomb.gif")) };private ImageIcon[] faceIcon = { new ImageIcon(JMine.class.getClassLoader().getResource("smile.gif")),new ImageIcon(JMine.class.getClassLoader().getResource("Ooo.gif")) };// You loseprivate void bomb(int row, int col){try{//System.out.println("Bomb!");for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {mineButton[i][j].setIcon(mineBombStatus[0]);int toShow;toShow = mine.mine[i][j] != 9 ? 0 : 1;mineButton[i][j].setClickFlag(true);if (toShow == 1 && (i != row || j != col)) {mineButton[i][j].setIcon(mineBombStatus[toShow]);mineButton[i][j].setClickFlag(true);} else if (toShow == 1 && (i == row && j == col)) {mineButton[i][j].setIcon(mineBombStatus[3]);mineButton[i][j].setClickFlag(true);} else if (toShow == 0 && mineButton[i][j].getFlag() != 1) { mineButton[i][j].setEnabled(false);} else if (toShow == 0 && mineButton[i][j].getFlag() == 1) { mineButton[i][j].setIcon(mineBombStatus[2]);mineButton[i][j].setClickFlag(true);}}}timer.cancel();}catch (Exception e){}}// check if you win() {private boolean isWin() {for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {if (mine.mine[i][j] == 9 && mineButton[i][j].getFlag() != 1) { return (false);}if (mine.mine[i][j] != 9 && mineButton[i][j].getFlag() == 1) { return (false);}if (mine.mine[i][j] != 9&& mineButton[i][j].getClickFlag() == false) {return (false);}}}return (true);}// You Winprivate void win(){timer.cancel();winFrame.setVisible(true);winTimer.schedule(new TimerTask(){public void run() {while(!winFrame.getWinOk()){}numMine = winFrame.getMineNum();winFrame.setVisible(false);setNewGame(numMine);//System.out.println("Jerry Debug:"+numMine);this.cancel();winFrame.setWinOk(false);}},0L);}// Constructor of the gamepublic JMine() {super("JMine Game");setSize(250, 350);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);Insets space = new Insets(0, 0, 0, 0);// Game varsgameStarted = false;numMine = 12;numFlaged = 0;ImageIcon myIcon = new ImageIcon(JMine.class.getClassLoader().getResource("blank1.gif")); gridbag = new GridBagLayout();constraints = new GridBagConstraints();pane = new JPanel();pane.setLayout(gridbag);constraints.fill = GridBagConstraints.BOTH;constraints.anchor = GridBagConstraints.CENTER;// Begin Menu Setmb = new JMenuBar();mGame = new JMenu("Game");miEasy = new JMenuItem("Easy");miEasy.addActionListener(this);miMiddle = new JMenuItem("Middle");miMiddle.addActionListener(this);miHard = new JMenuItem("Hard");miHard.addActionListener(this);miExit = new JMenuItem("Exit");miExit.addActionListener(this);mGame.add(miEasy);mGame.add(miMiddle);mGame.add(miHard);mGame.addSeparator();mGame.add(miExit);mb.add(mGame);mHelp = new JMenu("Help");miAbout = new JMenuItem("About...");mHelp.add(miAbout);miAbout.addActionListener(this);mb.add(mHelp);this.setJMenuBar(mb);// end of Menu Set// Control PanelcontrolPane = new JPanel();bTest = new JButton(faceIcon[0]);bTest.setSize(26, 27);bTest.setMargin(space);bTest.addMouseListener(this);bTest.setPressedIcon(faceIcon[1]);mineCounter = new JCounter(numMine);timeCounter = new JCounter();controlPane.add(mineCounter);controlPane.add(bTest);controlPane.add(timeCounter);buildConstraints(constraints, 0, 0, 10, 2, 100, 100);gridbag.setConstraints(controlPane, constraints);pane.add(controlPane);// BottonsmineButton = new JMineButton[10][10];for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {mineButton[i][j] = new JMineButton(i, j, myIcon);mineButton[i][j].addMouseListener(this);mineButton[i][j].setMargin(space);buildConstraints(constraints, j, i + 3, 1, 1, 100, 100);gridbag.setConstraints(mineButton[i][j], constraints);pane.add(mineButton[i][j]);}}// Content PanesetContentPane(pane);setLocation(200, 150);setVisible(true);// About Frameabout = new AboutFrame("JMine About");winFrame = new WinFrame("You win!");}// Set the GUI objects positionsvoid buildConstraints(GridBagConstraints gbc, int gx, int gy, int gw, int gh, int wx, int wy) {gbc.gridx = gx;gbc.gridy = gy;gbc.gridwidth = gw;gbc.gridheight = gh;gbc.weightx = wx;gbc.weighty = wy;}// the methods to check if there were mines, to be nestedvoid checkMine(int row, int col){int i, j;i = row < 0 ? 0 : row;i = i > 9 ? 9 : i;j = col < 0 ? 0 : col;j = j > 9 ? 9 : j;//System.out.println("Check Mine row:"+i + ",col:" +j);if (mine.mine[i][j] == 9) {bomb(i, j);} else if (mine.mine[i][j] == 0&& mineButton[i][j].getClickFlag() == false) {mineButton[i][j].setClickFlag(true);showLabel(i, j);for (int ii = i - 1; ii <= i + 1; ii++)for (int jj = j - 1; jj <= j + 1; jj++)checkMine(ii, jj);} else {showLabel(i, j);mineButton[i][j].setClickFlag(true);}if (isWin()) {win();}}private void clearAll(int row, int col){int top, bottom, left, right;top = row - 1 > 0 ? row - 1 : 0;bottom = row + 1 < 10 ? row + 1 : 9;left = col - 1 > 0 ? col - 1 : 0;right = col + 1 < 10 ? col + 1 : 9;for (int i = top; i <= bottom; i++) {for (int j = left; j <= right; j++) {if (mineButton[i][j].getFlag() != 1)checkMine(i, j);}}}private void resetAll() {for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {mineButton[i][j].setFlag(0);mineButton[i][j].setClickFlag(false);mineButton[i][j].setIcon(mineStatus[0]);mineButton[i][j].setEnabled(true);mineButton[i][j].setVisible(true);}}}// to flag the mine you want to flag outvoid flagMine(int row, int col) {//System.out.println("Jerry Arrives here!");int i, j;i = row < 0 ? 0 : row;i = i > 9 ? 9 : i;j = col < 0 ? 0 : col;j = j > 9 ? 9 : j;if (mineButton[i][j].getFlag() == 0) {numFlaged++;} else if (mineButton[i][j].getFlag() == 1) {numFlaged--;}mineCounter.resetCounter(numMine - numFlaged >= 0 ? numMine - numFlaged: 0);mineButton[i][j].setFlag((mineButton[i][j].getFlag() + 1) % 3);showFlag(i, j);if (isWin()) {win();}}// show the numbers of the nearby minesvoid showLabel(int row, int col) {//System.out.println("ShowLabel row:" + row + ",col:" + col);int toShow;toShow = mine.mine[row][col];if (toShow != 0) {mineButton[row][col].setIcon(mineNumIcon[toShow]);mineButton[row][col].setClickFlag(true);//mineButton[row][col].setEnabled(false);} else {//mineButton[row][col].setIcon(mineNumIcon[0]);//mineButton[row][col].setClickFlag(true);mineButton[row][col].setEnabled(false);}}// circle the flag with blank, flaged, questionedvoid showFlag(int row, int col) {mineButton[row][col].setIcon(mineStatus[mineButton[row][col].getFlag()]);}// the mouse events listener methodspublic void mouseEntered(MouseEvent e) {//System.out.println("Jerry Test");}// method to start the new gameprivate void startNewGame(int num, int row, int col){mine = new JMineArth(num, row, col);//mine.printMine();gameStarted = true;timer = new Timer();timer.scheduleAtFixedRate(new TimerTask(){public void run() {timeCounter.counterAdd();//System.out.println(timeCounter.getCounterNum());}},1000,1000);}public void setNewGame(int num) {resetAll();numMine = num;numFlaged = 0;gameStarted = false;mineCounter.resetCounter(numMine);timeCounter.resetCounter(0);}// the event handle to deal with the mouse clickpublic void mouseClicked(MouseEvent e) {if (e.getSource() == bTest) {setNewGame(numMine);return;}int row, col;row = ((JMineButton) e.getSource()).getRow();col = ((JMineButton) e.getSource()).getCol();if (!gameStarted) {startNewGame(numMine, row, col);}if (e.getModifiers() == (InputEvent.BUTTON1_MASK + InputEvent.BUTTON3_MASK)) { //System.out.println("HA");clearAll(row, col);}if (!mineButton[row][col].getClickFlag()) {if (e.getModifiers() == InputEvent.BUTTON1_MASK) {//System.out.println("LeftButton");if (mineButton[row][col].getFlag() == 1) {return;} else {checkMine(row, col);}} else if (e.getModifiers() == InputEvent.BUTTON3_MASK) { //System.out.println("RightButton");flagMine(row, col);} else {//System.out.println("MiddleButton");}}}public void mousePressed(MouseEvent e) {//System.out.println("Jerry Press");}public void mouseReleased(MouseEvent e) {//System.out.println("Jerry Release");}public void mouseExited(MouseEvent e) {//System.out.println("Jerry Exited");}public void actionPerformed(ActionEvent e) {try {if (e.getSource() == miEasy) {setNewGame(12);return;}if (e.getSource() == miMiddle) {setNewGame(24);return;}if (e.getSource() == miHard) {setNewGame(36);return;}if (e.getSource() == miExit) {System.exit(0);}if (e.getSource() == miAbout) {about.setVisible(true);}} catch (Exception ie) {}}public static void main(String [] args) {JMine jmine = new JMine();jmine.setVisible(true);}}地雷分布图算法类public class JMineArth {public int [][] mine;private boolean fMineSet;JMineArth(int mineNum, int row, int col) {mine = new int[10][10];setMine(mineNum, row, col);setMineNum();}private void setMine(int mineNum, int Outrow, int Outcol) {int col=0, row = 0, i=0;//Math.srand(now);while (i < mineNum) {col = (int)(Math.random()*100)%10;row = (int)(Math.random()*100)%10;if (mine[col][row]==0 && (row!=Outrow || col!=Outcol || Outrow==10 )) {mine[row][col]=9;i++;}}}private void setMineNum() {for ( int i=0 ; i <10; i++) {for (int j=0; j < 10; j++) {mine[i][j]=mine[i][j]==9?9:checkMineNum(i,j);}}fMineSet = true;}private int checkMineNum(int ii,int jj) {int top,bottom, left, right, count=0;top=ii-1>0?ii-1:0;bottom=ii+1<10?ii+1:9;left=jj-1>0?jj-1:0;right=jj+1<10?jj+1:9;for (int i=top; i<=bottom; i++) {for(int j=left; j<= right; j++) {if (mine[i][j]==9) count++;}}return(count);}public void printMine() {for (int i = 0; i < 10; i++) {for (int j=0; j < 10; j++) {System.out.print(this.mine[i][j] + " ");}System.out.println();}}public static void main(String[] args) {JMineArth mine = new JMineArth(Integer.parseInt(args[0]),Integer.parseInt(args[1]),Integer.parseInt(args[2]));mine.printMine();}}总结通过此次的《扫雷》游戏实现,让我对swing的相关知识有了进⼀步的了解,对java这门语⾔也有了⽐以前更深刻的认识。
Java编写的扫雷小程序

J a v a编写的扫雷小程序 The document was finally revised on 2021整个程序使用了4个类:Game 用于启动程序, 界面的布置,各种行列的算法。
ExtendButton 继承了Jbutton 用于新建button的各种属性ShowNum 监听到某个button后,计算出此button周围有几个雷,不同的雷对应不通的图片,类得到button上应加载的图片地址ViewReSet 此类用于新建一个窗口,用户输入自己想要的行、列、雷数,然后用新的行列雷数new一个新的Gamebiaose dise1 dise2 dise3dise4 dise5 dise6 dise7dise8 dise lei biaoji/****************************************************************运行类创建游戏主窗体*/package class Game extends JFrame implements ActionListener{private Container myContainer;private GridLayout myLayout;private JPanel myPanelMain;private JPanel myPanel;private JToolBar myTool;private JLabel time;private JLabel labelTime;private JLabel bombNum;private JLabel labelBombNum;private JMenuBar menuBar;private JMenu menuE, menuH;private JMenuItem menuItemCZ, menuItemSZ;private int numBomb, countTime, leaveBomb, numEnd;private int myRows, myColumns;private int xis, yis;private Timer timer;private ExtendButton[] myButton = null;etPostion(i);[i].setIcon((newShowNum(10)).getImageIcon());[i].setButton_num(0);[i].SetVisited(false);[i].SetStatus(false);ddMouseListener(new MouseAdapter() {public void mouseClicked(MouseEvent evt) {if (() == ) {int n =((ExtendButton)()).getButton_num();if(n == 1) {if(!((ExtendButton)()).GetVisited()) {((ExtendButton)()).setButton_num(0);((ExtendButton)()).setIcon((newShowNum(10)).getImageIcon());leaveBomb++;(leaveBomb));}} else {if(!((ExtendButton)()).GetVisited()) {((ExtendButton)()).setButton_num(1);((ExtendButton)()).setIcon((newShowNum(11)).getImageIcon());leaveBomb--;(leaveBomb));}}}}});[i].addActionListener(this);}();;show();etVisited(false);[i].SetStatus(false);[i].setText(null);[i].setIcon((newShowNum(10)).getImageIcon());}(numBomb);= numBomb;= * - leaveBomb;}etStatus()) {[tempint].SetStatus(true);counter++;}}}etStatus()) {[i].setIcon((newShowNum(9)).getImageIcon());}}}etStatus() && !myButton[CircleNum[i]].GetVisited()) {temp++;}}}etImageIcon());temp = 0;} else if(temp == 0) {(true);((new ShowNum(0)).getImageIcon());for (int i = 0; i < 8; i++) {if(CircleNum[i] != -1&& !myButton[CircleNum[i]].GetVisited()) {CheckButton(myButton[CircleNum[i]]);}}};if == 0) {(this, "恭喜你!", "消息", ;ShowBomb();}}}etScreenSize();int x = (int) (() - 400) / 2);int y = (int) (() - 500) / 2);= 300;= 400;(x, y, , ;("扫雷");= 10;= 9;= 9;();();;}public Game(int row, int column, int numbomb) {Dimension dimension = ().getScreenSize();int x = (int) (() - 400) / 2);int y = (int) (() - 500) / 2);= 310 * column /9;= 300 * row / 9 + 100;(x, y, , ;("扫雷");= row;= column;= numbomb;();();;}class/images/");break;case 1:imageIcon = new ImageIcon("./class/images/");break;case 2:imageIcon = new ImageIcon("./class/images/");break;case 3:imageIcon = new ImageIcon("./class/images/");break;imageIcon = new ImageIcon("./class/images/");break;case 5:imageIcon = new ImageIcon("./class/images/");break;case 6:imageIcon = new ImageIcon("./class/images/");break;case 7:imageIcon = new ImageIcon("./class/images/");break;case 8:imageIcon = new ImageIcon("./class/images/");break;case 9:imageIcon = new ImageIcon("./class/images/");break;case 10:imageIcon = new ImageIcon("./class/images/");break;case 11:imageIcon = new ImageIcon("./class/images/");break;default:imageIcon = newImageIcon("./class/images/");break;}return imageIcon;}}/********************************************************************创建一个新窗口,输入新的行、列、雷数,然后用新数据重新new一个Game窗口*/package class ViewReSet extends JDialog implements ActionListener{private JFrame frame = null;private JPanel myPanel = null;private JLabel myLabel = null;private JLabel myLabelRow = null;private JLabel myLabelColum = null;private JLabel myLabelBombNum = null;private JTextField myFieldRow = null;private JTextField myFieldColum = null;private JTextField myFieldBombNum = null;private JButton buttonOK = null;private JButton buttonReset = null;private int row;private int column;private int bombNum;private int [] myrcb = new int [3];private void createView(){Container container = ();= new JPanel(new GridBagLayout());;GridBagConstraints gbc = new GridBagConstraints();= 1;= 0;= new JLabel("窗口行列设置");gbc);= 0;= 1;= new JLabel("行数:");gbc);= 1;= 1;= new JTextField(10);gbc);= 0;= 2;= new JLabel("列数:");gbc);= 1;= 2;= new JTextField(10);gbc);= 0;= 3;= new JLabel("雷数:");gbc);= 1;= 3;= new JTextField(10);gbc);JPanel btnPanel = new JPanel();(false);= new JButton("确定");;= new JButton("重置");;= 1;= 4;gbc);("设置");;}public ViewReSet(int r, int c, int b) { Dimension dimension = ().getScreenSize();int xAxis = (int) (() - 300) / 2);int yAyis = (int) (() - 200) / 2);(xAxis, yAyis, 300, 200);[0] = r;[1] = c;[2] = b;();(true);}public void actionPerformed(ActionEvent e) {if() == {} else if() == {String r, c, b;r = if() > 0) {= (r);} else {= [0];}c = if() > 0) {= (c);} else {= [1];}b = if() > 0) {= } else {= [2];}new Game, , ;();}}}。
Java小游戏—扫雷

importjava.util.Scanner;public class SL {public static void main(String[] args) {Scanner s = new Scanner(System.in);int[][] square = null;String[][] draw = null;boolean flag = true;while(flag){System.out.println("请选择游戏难度");System.out.println("1:简单");System.out.println("2: 一般");System.out.println("3: 困难");intuserselect = s.nextInt();if(userselect!=1 &&userselect!=2 &&userselect!=3){System.out.println("您的输入有误,请重新输入");continue;}switch(userselect){case 1: square = new int[3][3];draw = new String[3][3];break;case 2: square = new int[6][6];draw= new String[6][6];break;case 3: square = new int[9][9];draw= new String[9][9];break;}for(int i =0;i<square.length;i++){for(int j=0;j<square[i].length;j++){square[i][j] = (int)(Math.random()*10/5);draw[i][j] = "*";System.out.print(square[i][j]+" ");}System.out.println("");}for(int i =0;i<square.length;i++){for(int j=0;j<square[i].length;j++){System.out.print("* ");}System.out.println("");}System.out.println("游戏开始");System.out.println("如果您觉得有雷,请输入:1"); System.out.println("如果您觉得没雷,请输入:0");R1:for(int i=0;i<square.length;i++){for(int j=0;j<square[i].length;j++){byte input = -1;while(flag){System.out.println("您觉得"+(i+1)+"-"+(j+1)+"位置上是否有雷"); input = s.nextByte();if(input!=0 && input!=1){System.out.println("您的输入有误,请重新输入");continue;}break;}if(input==square[i][j]){System.out.println("排除成功");draw[i][j] = String.valueOf(square[i][j]);for(int a =0;a<draw.length;a++){for(int b=0;b<draw[i].length;b++){System.out.print(draw[a][b]+" ");}System.out.println();}int x = i;int y = j;int counter =0;while(true){if(x-1>=0 && y-1>=0){counter += square[(x-1)][(y-1)];System.out.println("周围有"+counter+"颗雷");break;}else if(x-1<0){System.out.println("2");x++;}else if(y-1<0){System.out.println("3");y++;}}}else{System.out.println("游戏结束");break R1;}}}System.out.println("恭喜您过关成功");byteuserchoose = -1;while(flag){System.out.println("是否继续");System.out.println("继续请按:1");System.out.println("退出请按:0");userchoose = s.nextByte();if(userchoose!=0 &&userchoose!=1){System.out.println("您的输入有误请重新输入");continue;}break;}if(userchoose==0){break;}}}}。
Java课程设计扫雷游戏

界面布局:合理规 划界面元素,提高 用户体验
色彩搭配:选择合 适的色彩搭配,增 强视觉效果
图标设计:设计简 洁明了的图标,便 于用户识别
动画效果:适当添 加动画效果,增加 游戏趣味性
游戏逻辑优化
优化界面:提高用户体验, 增加游戏趣味性
优化算法:提高游戏运行效 率,减少内存占用
优化规则:增加游戏难度, 提高挑战性
游戏控制逻辑实现
游戏开始:点击开始按钮, 进入游戏界面
游戏进行:鼠标点击格子, 显示数字或地雷
游戏结束:所有地雷被标 记或踩到,游戏结束
游戏重置:重新开始游戏, 重新生成地雷布局
游戏控制逻辑测试
游戏开始:点击开始按钮,游戏开始
游戏结束:点击结束按钮,游戏结束
游戏操作:鼠标点击,选择要翻开的格 子
游戏音效实现方式
音效播放:通过调用音效库 或音效文件进行播放
音效文件:使用MP3、 WAV 等 格 式 的 音 效 文 件
音效库:使用音效库如 S o u ndPool 、 Audi oTr ac k 等
音效控制:通过设置音量、 音调、音速等参数进行音效
控制
音效同步:与游戏场景、动 作等同步播放音效
音效优化:优化音效加载、 播放、控制等过程,提高游
戏性能
游戏音效逻辑实现
音效分类:背景音乐、音效、语音等 音效触发条件:点击、移动、爆炸等 音效播放:循环播放、单次播放、随机播放等 音效管理:音效音量、音效开关、音效选择等
游戏音效测试与调整
音效测试:在开发过程中,对音效进行测试,确保音效与游戏场景相匹配 音效调整:根据测试结果,对音效进行适当调整,提高音效质量 音效优化:对音效进行优化,提高音效的流畅性和清晰度 音效反馈:收集玩家对音效的反馈,根据反馈进行音效调整和优化
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
J a v a编写的扫雷小程序Prepared on 21 November 2021整个程序使用了4个类:Game 用于启动程序, 界面的布置,各种行列的算法。
ExtendButton 继承了Jbutton 用于新建button的各种属性ShowNum 监听到某个button后,计算出此button周围有几个雷,不同的雷对应不通的图片,类得到button上应加载的图片地址ViewReSet 此类用于新建一个窗口,用户输入自己想要的行、列、雷数,然后用新的行列雷数new 一个新的Gamebiaose dise1 dise2 dise3dise4 dise5 dise6 dise7dise8 dise lei biaoji/****************************************************************运行类创建游戏主窗体*/package class Game extends JFrame implements ActionListener{private Container myContainer;private GridLayout myLayout;private JPanel myPanelMain;private JPanel myPanel;private JToolBar myTool;private JLabel time;private JLabel labelTime;private JLabel bombNum;private JLabel labelBombNum;private JMenuBar menuBar;private JMenu menuE, menuH;private JMenuItem menuItemCZ, menuItemSZ;private int numBomb, countTime, leaveBomb, numEnd;private int myRows, myColumns;private int xis, yis;private Timer timer;private ExtendButton[] myButton = null;etPostion(i);[i].setIcon((new ShowNum(10)).getImageIcon());[i].setButton_num(0);[i].SetVisited(false);[i].SetStatus(false);ddMouseListener(new MouseAdapter() {public void mouseClicked(MouseEvent evt) {if (() == ) {int n =((ExtendButton)()).getButton_num();if(n == 1) {if(!((ExtendButton)()).GetVisited()) {((ExtendButton)()).setButton_num(0);((ExtendButton)()).setIcon((new ShowNum(10)).getImageIcon());leaveBomb++;(leaveBomb));}} else {if(!((ExtendButton)()).GetVisited()) {((ExtendButton)()).setButton_num(1);((ExtendButton)()).setIcon((new ShowNum(11)).getImageIcon());leaveBomb--;(leaveBomb));}}}}});[i].addActionListener(this);}();;show();etVisited(false);[i].SetStatus(false);[i].setText(null);[i].setIcon((new ShowNum(10)).getImageIcon());}(numBomb);= 0;= numBomb;= * - leaveBomb;}etStatus()) {[tempint].SetStatus(true);counter++;}}}etStatus()) {[i].setIcon((new ShowNum(9)).getImageIcon());}}}etStatus() && !myButton[CircleNum[i]].GetVisited()) {temp++;}}}etImageIcon());temp = 0;} else if(temp == 0) {(true);((new ShowNum(0)).getImageIcon());for (int i = 0; i < 8; i++) {if(CircleNum[i] != -1&& !myButton[CircleNum[i]].GetVisited()) {CheckButton(myButton[CircleNum[i]]);}}};if == 0) {(this, "恭喜你!", "消息", ;ShowBomb();}}}etScreenSize();int x = (int) (() - 400) / 2);int y = (int) (() - 500) / 2);= 300;= 400;(x, y, , ;("扫雷");= 10;= 9;= 9;();();;}public Game(int row, int column, int numbomb) {Dimension dimension = ().getScreenSize();int x = (int) (() - 400) / 2);int y = (int) (() - 500) / 2);= 310 * column /9;= 300 * row / 9 + 100;(x, y, , ;("扫雷");= row;= column;= numbomb;();();;}class/images/");break;case 1:imageIcon = new ImageIcon("./class/images/");break;case 2:imageIcon = new ImageIcon("./class/images/");break;case 3:imageIcon = new ImageIcon("./class/images/");break;case 4:imageIcon = new ImageIcon("./class/images/");break;case 5:imageIcon = new ImageIcon("./class/images/");break;case 6:imageIcon = new ImageIcon("./class/images/");break;case 7:imageIcon = new ImageIcon("./class/images/");break;case 8:imageIcon = new ImageIcon("./class/images/");break;case 9:imageIcon = new ImageIcon("./class/images/");break;case 10:imageIcon = new ImageIcon("./class/images/");break;case 11:imageIcon = new ImageIcon("./class/images/");break;default:imageIcon = new ImageIcon("./class/images/");break;}return imageIcon;}}/********************************************************************创建一个新窗口,输入新的行、列、雷数,然后用新数据重新new一个Game窗口*/package class ViewReSet extends JDialog implements ActionListener{private JFrame frame = null;private JPanel myPanel = null;private JLabel myLabel = null;private JLabel myLabelRow = null;private JLabel myLabelColum = null;private JLabel myLabelBombNum = null;private JTextField myFieldRow = null;private JTextField myFieldColum = null;private JTextField myFieldBombNum = null;private JButton buttonOK = null;private JButton buttonReset = null;private int row;private int column;private int bombNum;private int [] myrcb = new int [3];private void createView(){Container container = ();= new JPanel(new GridBagLayout());;GridBagConstraints gbc = new GridBagConstraints();= 1;= 0;= new JLabel("窗口行列设置"); gbc);= 0;= 1;= new JLabel("行数:");gbc);= 1;= 1;= new JTextField(10);gbc);= 0;= 2;= new JLabel("列数:");gbc);= 1;= 2;= new JTextField(10);gbc);= 0;= 3;= new JLabel("雷数:");gbc);= 1;= 3;= new JTextField(10);gbc);JPanel btnPanel = new JPanel(); (false);= new JButton("确定");;= new JButton("重置");;= 1;= 4;gbc);("设置");;}public ViewReSet(int r, int c, int b) {Dimension dimension = ().getScreenSize();int xAxis = (int) (() - 300) / 2);int yAyis = (int) (() - 200) / 2);(xAxis, yAyis, 300, 200);[0] = r;[1] = c;[2] = b;();(true);}public void actionPerformed(ActionEvent e) {if() == {} else if() == { String r, c, b;r = if() > 0) {= (r);} else {= [0];}c = if() > 0) {= (c);} else {= [1];}b = if() > 0) {= } else {= [2];}new Game, , ;();}}}。