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

HeyWeGo小组《Java程序设计》

2015—2016年学期团队项目总结

题目简介

一个简单的扫雷小游戏,在12*12的方格盘上,首先可以设定雷的个数,然后点击开始程序就会随机布雷,开始游戏后如果点到雷就会显示游戏结束,如果没有,会出现数字表示周围一圈雷的个数,以此推理当扫出所有雷将显示游戏胜利。

游戏项目规划:

  1. 确定游戏中方块格子的个数
  2. 确定游戏中地雷的个数(初始10个),完成布雷
  3. 计算每个方块周围的雷数,在方块周围本身没有地雷的情况下,统计周围地雷的个数
  4. 若周围没有地雷则翻开周围的空白方格,直到周围有附近地雷的格子
  5. 设计一个检测是否挖完所有的雷的方法
  6. 设定左键点击为翻开
  7. 设定右键点开为标记

团队分工

  • 20145336 张子扬(对代码的进度进行策划,实现代码的运行,对主程序和模块进行划分)
  • 20145321 曾子誉(收集资料,实现程序界面,对一些分支进行细节处理)
  • 20145235 方浩南(进行代码的编写)
  • 20145225 唐振远(实验代码检查错误,并对代码进行下一步的完善)
  • 20145331魏澍琛(发现不足,查找资料,改善体验)

代码实现及注释:

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

运行结果截图:

初始界面:

设置雷数为10,开始游戏,会显示数字:

踩到雷,游戏结束:

扫完雷,游戏胜利:

总结

通过团队项目,我们认识到了合作的重要性,紧密的合作能够提高我们的能力。代码测试过程中出现很多错误,但经过互相的合作和探讨,加以改进,便可以成功运行。 小组各组员的课程总结已发到个人博客。

时间: 2024-12-10 11:56:31

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

20145225《Java程序设计》 2015—2016年学期课程总结

20145225<Java程序设计> 2015—2016年学期课程总结 读书笔记链接汇总 1.2016年2月25日 <Java程序设计>课程准备之问卷调查 摘要: 一.你对自己的未来有什么规划?做了哪些准备? 答:未来就是找个好工作,在保证自己与父母生活条件良好的基础上,进一步的提高精神上的需求...... 2.2016年3月6日 <Java程序设计>第1周学习总结——小试牛刀 摘要: 教材学习内容总结 1.java语言概述:一门高级编程语言. 2.java语言的三种技

2016年1月编程语言排行榜:Java荣获2015年度冠军

Java因于2015年人气增幅最大(+ 5.94%),故获得2015年的TIOBE指数的编程语言奖,同时成为15年年度冠军, Visual Basic.NET(+ 1.51%)和Python(+ 1.24%)紧随其后.猛然一看,Java这个古老的语言赢得这个奖项很令人惊艳,特别是考虑到Java获得同一奖项是在整整10年以前.退一步 讲,Java是目前在企业后端市场排名第一的仍然在增长的移动应用开发市场(Android).此外,Java具有现代语言的常见特性,如lambda表 达式和流等语言.Ja

201671010126 2016-2017-2《JAVA程序设计》学习心得

通过这两周对JAVA程序设计的学习,我对这门课程有了新的认识,每门学科都有其精髓,想要对JAVA有更深的了解,对于初学者的我来说还需付出很多努力. 两周以来尽管伴随着许多疑惑,还是完成了对前三章的学习,通过这短短半个月的时间,发现JAVA的基础知识太过繁多,知识点相对较为零碎,许多东西理解起来有一定难度.所幸JAVA程序设计与上学期所学的C语言有着许多的相似之处,所以就可以借鉴对C语言的学习经验来学习JAVA,尽管能学好C语言不意味着就能学好JAVA,不过相信以前C语言的学习对JAVA这门新课程

201671010111 2016-2017-2《Java程序设计》新学期一门新语言的新学习

大学第三个学期的学习开始了,一门新的语言--java列进了本学期的学习任务当中.带着一份憧憬却又难免有点惧怕,课本是从未有过的厚大,老师说带着我们将它读薄.似乎有了征服的力量. 第一节理论课老师告诉大家这学期的课程将施行"反转课堂教学法".对于从来都是以上课老师在讲,我们学的上课方式进行学习的我们而言.前期难免是有点困难的,但是我们会努力地去做到这些并追求做得更好.这样的上课方式可以提升我们自主学习的能力,培养我们的自学兴趣,使得我们在学习上处于主动方,而不只是被动的在学,在接受.&q

2017-2018-2学期 20172324《Java程序设计》第六周学习总结

20172324<Java程序设计>第六周学习总结 教材学习内容总结 如何创建数组以及int[] X与int X[]的区别(编译时是没有差别的,只是前者与其他类型的声明方式有一致性) 每一个java数组都是一个迭代器. 数组是作为参数传递给一个方法的,实际上传递的是原始数组引用的副本. 对象数组(基本数据类型+对象) 二维数组中前一个索引值代表行,另一个索引值代表列. 可变长度参数用... 教材学习中的问题和解决过程 问题1: Family代码中String...name中的...是什么意思.

20145331《Java程序设计》课程总结

20145331<Java程序设计>课程总结 每周读书笔记链接汇总 •20145331<Java程序设计>第一周学习总结 •20145331<Java程序设计>第二周学习总结 •20145331<Java程序设计>第三周学习总结 •20145331<Java程序设计>第四周学习总结 •20145331<Java程序设计>第五周学习总结 •20145331<Java程序设计>第六周学习总结 •20145331<Java

Java程序设计第四次实验报告

北京电子科技学院(BESTI) 实     验    报     告 课程:java程序设计 班级:1352  姓名:何伟钦  学号:20135223 成绩:            指导教师:娄嘉鹏      实验日期:2015.6.10 实验密级:       预习程度:           实验时间:15:30---17:20 仪器组次:23       必修/选修:选修   实验序号:05 实验名称:网络编程(简单的服务器与客户端) 实验目的与要求: 1.掌握Socket的基本使用方法,学

Java程序设计 实验三

北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计   班级:1353       姓名:郭皓  学号:20135327 成绩:             指导教师:娄嘉鹏      实验日期: 实验密级:         预习程度:             实验时间: 仪器组次:          必修/选修:选修       实验序号:3 实验名称:                敏捷开发与XP实践 实验目的与要求: 完成实验.撰写实验报告,实验报告以

Java程序设计实验 实验五

课程:Java程序设计实验   班级:1353  姓名:符余佳源  学号:20135321 成绩:                           指导教师:娄嘉鹏      实验日期:2015.6.9 实验密级:无            预习程度:                   实验时间:15:30~18:00 仪器组次:  21                    必修/选修: 选修                  实验序号:5 实验名称:TCP传输及加解密 产品托管地址:ht