HeyWeGo小组《Java程序设计》2015—2016年学期团队项目总结

小组《Java程序设计》 2015—2016年学期团队项目总结 题目简介
一个简单的扫雷小游戏,在12*12的方格盘上,首先可以设定雷的个数,然后点击开始程序就会随机布雷,开始游戏后如果点到雷就会显示游戏结束,如果没有 , 会出现数字表示周围一圈雷的个数,以此推理当扫出所有雷将显示游戏胜利 。
游戏项目规划:
确定游戏中方块格子的个数确定游戏中地雷的个数(初始10个),完成布雷计算每个方块周围的雷数,在方块周围本身没有地雷的情况下,统计周围地雷的个数若周围没有地雷则翻开周围的空白方格,直到周围有附近地雷的格子设计一个检测是否挖完所有的雷的方法设定左键点击为翻开设定右键点开为标记 团队分工代码实现及注释:
1 import java.awt.*;2 import java.awt.event.*;3 import javax.swing.*;4 public class Frame5extends JFrame {6JTextField text;7JLabel nowBomb, setBomb;8int BombNum, BlockNum; //当前雷数,当前方块数9int rightBomb, restBomb, restBlock; //找到的地雷数,剩余雷数 , 剩余方块数 1011JButton start = new JButton(" 开始 ");//初始化一个开始的按钮 12JPanel MenuPanel = new JPanel();//新建一个区域,作为菜单 13JPanel bombPanel = new JPanel();//新建一个区域,作为雷区 14Bomb[][] bombButton;//2维数组 , 防地雷 1516JPanel c; 17BorderLayout borderLayout1 = new BorderLayout();//布局管理器边界布局 18GridLayout gridLayout1 = new GridLayout();//布局一个网格布局 19public Frame() { 20try { 21setDefaultCloseOperation(EXIT_ON_CLOSE);//关闭操作并结束进程 22jbInit();//一般用于对程序进行初始化 23} 24catch (Exception exception) {//异常处理 25exception.printStackTrace(); 26} 27} 2829private void jbInit() throws Exception { 30c = (JPanel) getContentPane();//设定一个空间 31setTitle("扫雷");//标题为扫雷 32c.setBackground(Color.WHITE);//背景颜色为白色 33MenuPanel.setBackground(Color.GRAY);//菜单颜色为灰色 34c.setLayout(borderLayout1); 35setSize(new Dimension(700, 700));//界面大小700*700 36setResizable(false); 3738BlockNum = 144;//设定方块数144个 39BombNum = 10;//设定初始地雷数10个 40text = new JTextField("10 ", 3);//设定一个字符框长度为3 41nowBomb = new JLabel("当前雷数" + ":" + BombNum); 42setBomb = new JLabel("设置地雷数");//标明解释 43start.addActionListener(new Frame1_start_actionAdapter(this)); 4445MenuPanel.add(setBomb); 46MenuPanel.add(text); 47MenuPanel.add(start); 48MenuPanel.add(nowBomb);//添加菜单元素 49c.add(MenuPanel, java.awt.BorderLayout.SOUTH);//给界面下方的界面设定布局 5051bombPanel.setLayout(gridLayout1); 52gridLayout1.setColumns( (int) Math.sqrt(BlockNum));//纵列设定 53gridLayout1.setRows( (int) Math.sqrt(BlockNum));//横排设定 54bombButton = new Bomb[ (int) Math.sqrt(BlockNum)][ (int) Math.sqrt(BlockNum)]; 55for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) { 56for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) {//嵌套for循环表示所有的格子 57bombButton[i][j] = new Bomb(i, j); 5859bombButton[i][j].setFont(new Font("", Font.PLAIN, 14));//设计字体显示效果 6061bombButton[i][j].setForeground(Color.white);//背景颜色为白色 62bombButton[i][j].addMouseListener(new Bomb_mouseAdapter(this)); 63bombButton[i][j].addActionListener(new Bomb_actionAdapter(this)); 64bombPanel.add(bombButton[i][j]); 65} 66} 67c.add(bombPanel, java.awt.BorderLayout.CENTER);//给界面中间的界面设定布局 6869startBomb(); 70} 7172 /* 开始按钮 */ 7374public void start_actionPerformed(ActionEvent e) { 75int num=Integer.parseInt(text.getText().trim());//调用Integer.parseInt()把一个String转换成一个Double基本类型的值并赋值给了num 76if (num >= 5 && num < 50) { 77BombNum = num;//如果当前雷数在5-50之间 78startBomb();//可以开始布雷 。79} 80else if (num < 5) {//如果当前雷数在5以下 81JOptionPane.showMessageDialog(null, "您设置的地雷数太少了,请重设!", "错误", 82JOptionPane.ERROR_MESSAGE);//消息提示框显示错误 。83num=10; 84BombNum = num;//自动将雷数改为10. 85} 86else { 87JOptionPane.showMessageDialog(null, "您设置的地雷数太多了,请重设!", "错误", 88JOptionPane.ERROR_MESSAGE);//同上,消息提示框提醒输入有误 。89num=10; 90BombNum = num; 91} 92} 93/* 开始,布雷 */ 949596public void startBomb() { 97nowBomb.setText("当前雷数" + ":" + BombNum);//利用setText设置现在的雷数 。98for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) {//由按钮组成的二维数组,i表示行,j表示列,构成了一个方形网格 99for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) {//循环条件判断isRight的值,如果为false循环否则退出100bombButton[i][j].isBomb = false;//当前按钮是否为雷101bombButton[i][j].isClicked = false;//是否已被点击102bombButton[i][j].isRight = false;//是否被(标注)正确103bombButton[i][j].BombFlag = 0;//是否被标注为雷104bombButton[i][j].BombRoundCount = 9;//周围105bombButton[i][j].setEnabled(true);106bombButton[i][j].setText("");107bombButton[i][j].setFont(new Font("", Font.PLAIN, 14));//设置字体大小108bombButton[i][j].setForeground(Color.BLUE);//设置颜色为蓝色109rightBomb = 0;//正确标出的雷数为0110restBomb = BombNum;111restBlock = BlockNum - BombNum;112}113}114 115for (int i = 0; i < BombNum; ) {116int x = (int) (Math.random() * (int) (Math.sqrt(BlockNum) - 1));117int y = (int) (Math.random() * (int) (Math.sqrt(BlockNum) - 1));118 119if (bombButton[x][y].isBomb != true) {120bombButton[x][y].isBomb = true;121i++;122}123}124CountRoundBomb();125}126 127/* 计算方块周围雷数 */128 129public void CountRoundBomb() {130for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) {//开方 障碍数131for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) {132int count = 0;//当需要检测的单元格本身无雷的情况下,统计周围的地雷个数133 134if (bombButton[i][j].isBomb != true) {//如果不是雷135for (int x = i - 1; x < i + 2; x++) {//从左边到右,一个三个136for (int y = j - 1; y < j + 2; y++) {137if ( (x >= 0) && (y >= 0)138&& (x < ( (int) Math.sqrt(BlockNum)))139&& (y < ( (int) Math.sqrt(BlockNum)))) {//因前面x=i-1,所以排除超出边界的情况140if (bombButton[x][y].isBomb == true) {//如果是雷141count++;//加一142}143}144}145}146bombButton[i][j].BombRoundCount = count;//设置该Bomb环绕数的值147}148}149}150}151 152/* 是否挖完了所有的雷 */153 154public void isWin() {155restBlock = BlockNum - BombNum;156for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) {157for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) {158if (bombButton[i][j].isClicked == true) {159restBlock--;160}161}162}163 164if (rightBomb == BombNum || restBlock == 0) {165JOptionPane.showMessageDialog(this, "您挖完了所有的雷,您胜利了!", "胜利",166JOptionPane.INFORMATION_MESSAGE);167startBomb();168}169}170 171/** 当选中的位置为空,则翻开周围的地图* */172 173public void isNull(Bomb ClickedButton) {174int i, j;175i = ClickedButton.num_x;//点击的方块,周围地图176j = ClickedButton.num_y;177 178for (int x = i - 1; x < i + 2; x++) {//从左边到右边,一至三个179for (int y = j - 1; y < j + 2; y++) {180if ( ( (x != i) || (y != j)) && (x >= 0) && (y >= 0)181&& (x < ( (int) Math.sqrt(BlockNum)))//因为设定x=i-1,所以排除超出边界的情况182&& (y < ( (int) Math.sqrt(BlockNum)))) {183if (bombButton[x][y].isBomb == false//如果方块中不是雷184&& bombButton[x][y].isClicked == false//如果方块未被点击185&& bombButton[x][y].isRight == false) {//如果方块未被标记186turn(bombButton[x][y]);187}//当前位置为空,周围地图被翻开188}189}190}191}192 193/* 翻开 */194 195public void turn(Bomb ClickedButton) {196ClickedButton.setEnabled(false);197ClickedButton.isClicked = true;//点击方块为空,不是地雷198if (ClickedButton.BombRoundCount > 0) {//如果方块地雷环绕数>0199ClickedButton.setText(ClickedButton.BombRoundCount + ""); //标记数目200}201else {202isNull(ClickedButton);//否则,代替Null203}204}205 206 207/* 左键点击 */208public void actionPerformed(ActionEvent e) {209if ( ( (Bomb) e.getSource()).isClicked == false//如果方块未被点击210&& ( (Bomb) e.getSource()).isRight == false) {//如果方块标未被记211if ( ( (Bomb) e.getSource()).isBomb == false) {//如果方块不是地雷212turn( ( (Bomb) e.getSource()));213isWin();//当挖完雷,胜利214}215 216else {217for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) {218for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) {219if (bombButton[i][j].isBomb == true) {//如果踩到雷220bombButton[i][j].setText("b");//地雷方块上显示“b”221}222}223}224( (Bomb) e.getSource()).setForeground(Color.RED);//显示红色225( (Bomb) e.getSource()).setFont(new Font("", Font.BOLD, 20));226( (Bomb) e.getSource()).setText("X");//显示符号“X”227JOptionPane.showMessageDialog(this, "你踩到地雷了 , 按确定重来", "踩到地雷", 2);228startBomb();229}230}231}232 233 234/* 右键点击 */235public void mouseClicked(MouseEvent e) {236Bomb bombSource = (Bomb) e.getSource();237boolean right = SwingUtilities.isRightMouseButton(e);238 239if ( (right == true) && (bombSource.isClicked == false)) {240bombSource.BombFlag = (bombSource.BombFlag + 1) % 3;//计算右键标记数及对应得出符号241if (bombSource.BombFlag == 1) {//如果计算得1 , 标记显示F242if (restBomb > 0) {243bombSource.setForeground(Color.RED);//标记显示红色244bombSource.setText("F");//标记符号“F”245bombSource.isRight = true;//如果方块被标记246restBomb--;//那么当前地雷数减1247}248else {249bombSource.BombFlag = 0;250}251}252else if (bombSource.BombFlag == 2) {//如果计算得2,标记显示Q253restBomb++;//在F减1的基础上地雷数加1254bombSource.setText("Q");//标记符号“Q”255bombSource.isRight = false;//方块未被标记地雷256}257else {258bombSource.setText("");259}260 261if (bombSource.isBomb == true) {//如果方块是雷262if (bombSource.BombFlag == 1) {//如果所在方块计算得1,即标记F263rightBomb++;264}265else if (bombSource.BombFlag == 2) {//如果所在方块计算得2,即标记Q266rightBomb--;267}268}269nowBomb.setText("当前雷数" + ":" + restBomb);270isWin();271}272}273 274public static void main(String[] args) {275Frame frame = new Frame();276frame.setVisible(true);277}278 }279 280 class Frame1_start_actionAdapter281implements ActionListener {282private Frame adaptee;283Frame1_start_actionAdapter(Frame adaptee) {284this.adaptee = adaptee;285}286 287public void actionPerformed(ActionEvent e) {288adaptee.start_actionPerformed(e);289}290 }291 292 293 class Bomb294extends JButton {295int num_x, num_y; //第几号方块296int BombRoundCount; //周围雷数297boolean isBomb; //是否为雷298boolean isClicked; //是否被点击299int BombFlag; //测试雷标记300boolean isRight; //是否点击右键301 302public Bomb(int x, int y) {303num_x = x;304num_y = y;//累的位置,获得是参数值,嵌套了两个for循环305BombFlag = 0;//是否已经插旗了306BombRoundCount = 9;//环绕数307isBomb = false;//是雷308isClicked = false;//被点击309isRight = false;//是真的310}311 }312 313 class Bomb_actionAdapter314implements ActionListener {315private Frame adaptee;316Bomb_actionAdapter(Frame adaptee) {317this.adaptee = adaptee;318}319 320public void actionPerformed(ActionEvent e) {321adaptee.actionPerformed(e);322}323 }324 325 class Bomb_mouseAdapter326extends MouseAdapter {327private Frame adaptee;328Bomb_mouseAdapter(Frame adaptee) {329this.adaptee = adaptee;330}331 332public void mouseClicked(MouseEvent e) {333adaptee.mouseClicked(e);334}335 }
运行结果截图:
初始界面:

HeyWeGo小组《Java程序设计》2015—2016年学期团队项目总结

文章插图
设置雷数为10,开始游戏,会显示数字:
HeyWeGo小组《Java程序设计》2015—2016年学期团队项目总结

文章插图

HeyWeGo小组《Java程序设计》2015—2016年学期团队项目总结

文章插图
踩到雷 , 游戏结束:
HeyWeGo小组《Java程序设计》2015—2016年学期团队项目总结

文章插图
两种标记:
HeyWeGo小组《Java程序设计》2015—2016年学期团队项目总结

文章插图
扫完雷,游戏胜利:
HeyWeGo小组《Java程序设计》2015—2016年学期团队项目总结

文章插图
分数的分配
张子扬 30分
方浩南 27分
HeyWeGo小组《Java程序设计》2015—2016年学期团队项目总结

文章插图
唐振远 23分
曾子誉 20分
团队贡献
张子扬:小组组长,负责给组员分配任务,掌握代码进度 。对代码的架构进行划分,并协助方浩南完成部分代码 。并完成图形界面和雷数的布控 。
方浩南:负责编写部分前期代码,完成对周围雷数的计算、剩余雷数的计算和翻开的操作 。
唐振远:负责编写后期代码,完成左右键的点击操作,并完成代码的检查,更正 。
曾子誉:查阅相关资料,协助唐振远同学完成相关代码 。并对代码进行后期完善 , 改善用户体验 。
代码托管链接
总结
【HeyWeGo小组《Java程序设计》2015—2016年学期团队项目总结】通过团队项目,我们认识到了合作的重要性 , 紧密的合作能够提高我们的能力 。代码测试过程中出现很多错误 , 但经过互相的合作和探讨 , 加以改进,便可以成功运行 。小组各组员的课程总结已发到个人博客 。