Java应用技术课程设计实训报告-Java扫雷游戏的设计与实现.doc_第1页
Java应用技术课程设计实训报告-Java扫雷游戏的设计与实现.doc_第2页
Java应用技术课程设计实训报告-Java扫雷游戏的设计与实现.doc_第3页
Java应用技术课程设计实训报告-Java扫雷游戏的设计与实现.doc_第4页
Java应用技术课程设计实训报告-Java扫雷游戏的设计与实现.doc_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

XXX大学Java应用技术实训报告题 目 起讫日期 所在院系 学生姓名 专 业 班 级 学 号 指导教师 职称 所在单位 年 月 日一总体设计本系统共包括14个java源文件和6个图象文件。1类之间的关系如图1所示。2java源文件及其功能如表1所示。3.图象文件地雷.gif:地雷方块上的图标。无雷.gif:无雷方块上的图标。触雷.gif:触雷时方块上的图标。探雷错误.gif:游戏结束时,指出标雷错误的图标。微笑脸.gif:按钮上的通常图标。哭脸.gif:触雷时按钮上图标。二、详细设计1主类Game(1)成员变量(见表2.11)(2)方法(见表2.12)(3)源代码见文件Game.java2方块Block(1)成员变量(见表2.21)(2)方法(见表2.22)(3)源代码见文件Block.java3雷区 MineSquare(1)成员变量(见表2.31)(2)方法(见表2.32)(3)源代码见文件MineSquare.java4雷标数目 FindAroundMineMarkNumber.java(1)方法(见表2.41)(2)源代码见文件FindAroundMineMarkNumber.java5雷标判断 DetermineMineMarkIsRightOrWrong(1)成员变量(见表2.51)(2)方法(见表2.52)(3)源代码见文件DetermineMineMarkIsRightOrWrong.java6成片挖开区域 DetermineDigArea(1)成员变量(见表2.61)(2)方法(见表2.62)(3)源代码见文件DetermineDigArea.java7无雷连通区 FindSafeArea(1)方法(见表2.71)(2)源代码见文件FindSafeArea.java8随机布雷 RandomSetMine(1)成员变量(见表2.81)(2)方法(见表2.82)(3)源代码见文件RandomSetMine.java9周围地雷个数 FindAroundMineNumber(1)方法见表(见表2.91) (2)源代码见文件FindAroundMineNumber.java10显示剩余雷数 CountMine(1)成员变量(见表2.101)(2)方法(见表2.102)(3)源代码见文件CountMine.java11计时器 TimeCount(1)成员变量(见表2.111)(2)方法(见表2.112)(3)源代码见文件TimeCount.java12英雄榜录入对话框 Record(1)成员变量(见表2.121)(2)方法(见表2.122)(3)源代码见文件Record.java13显示英雄榜对话框 ShowRecord(1)成员变量(见表2.131)(2)方法(见表2.132)(3)源代码见文件ShowRecord.java14挖雷成功 DecideWinner(1)方法见表(见表2.141)(2)源代码见文件DecideWinner.java源代码Game.javaimport java.awt.event.*;import java.awt.*;import javax.swing.*;import javax.swing.border.*;import java.util.*;import java.io.*;public class Game extends JFrame implements ActionListener JMenuBar bar; JMenu fileMenu; JMenuItem 初级,中级,高级,扫雷英雄榜; int grade=2; MineSquare 雷阵; JButton buttonPerson; Container con; JPanel box; File 英雄榜=new File(英雄榜.txt); Hashtable hashtable=null; Record 记录对话框=null; ShowRecord 显示英雄榜对话框=null; Game() buttonPerson=new JButton(new ImageIcon(微笑脸.gif); 雷阵=new MineSquare(中级,40,16,16,buttonPerson,记录对话框); buttonPerson.addActionListener(this); con=getContentPane(); con.add(雷阵,BorderLayout.CENTER); box=new JPanel(); box.setLayout(new GridLayout(1,3); box.add(雷阵.count.textShowMine); box.add(buttonPerson); box.add(雷阵.time.textShowTime); con.add(box,BorderLayout.NORTH); setVisible(true); addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0); ); setBounds(100,50,360,380); bar=new JMenuBar(); fileMenu=new JMenu(游戏); 初级=new JMenuItem(初级); 中级=new JMenuItem(中级); 高级=new JMenuItem(高级); fileMenu.setMnemonic(G); 初级.setMnemonic(B); 中级.setMnemonic(I); 高级.setMnemonic(E); 扫雷英雄榜=new JMenuItem(扫雷英雄榜); 初级.setMnemonic(T); fileMenu.add(初级); fileMenu.add(中级); fileMenu.add(高级); fileMenu.add(扫雷英雄榜); bar.add(fileMenu); setJMenuBar(bar); 初级.addActionListener(this); 中级.addActionListener(this); 高级.addActionListener(this); 扫雷英雄榜.addActionListener(this); hashtable=new Hashtable(); hashtable.put(初级,初级#+999+#匿名); hashtable.put(中级,中级#+999+#匿名); hashtable.put(高级,高级#+999+#匿名); 记录对话框=new Record(this,hashtable); 记录对话框.setGrade(高级); if(!英雄榜.exists() try FileOutputStream out=new FileOutputStream(英雄榜); ObjectOutputStream object_out=new ObjectOutputStream(out); object_out.writeObject(hashtable); object_out.close(); out.close(); catch(IOException e) 显示英雄榜对话框=new ShowRecord(this,hashtable); validate(); public void newGame(String grade,int number,int rows,int cols,int w,int h) buttonPerson.setIcon(new ImageIcon(微笑脸.gif); 记录对话框.setGrade(grade); 雷阵=new MineSquare(grade,number,rows,cols,buttonPerson,记录对话框); con.removeAll(); box.removeAll(); box.add(雷阵.count.textShowMine); box.add(buttonPerson); box.add(雷阵.time.textShowTime); con.add(box,BorderLayout.NORTH); con.add(雷阵,BorderLayout.CENTER); setBounds(10,10,w,h); validate(); public void actionPerformed(ActionEvent e) if(e.getSource()=初级) grade=1; newGame(初级,10,8,8,180,220); if(e.getSource()=中级) grade=2; newGame(中级,40,16,16,360,380); if(e.getSource()=高级) grade=3; newGame(高级,99,22,22,500,520); if(e.getSource()=扫雷英雄榜) 显示英雄榜对话框.显示记录(); 显示英雄榜对话框.setVisible(true); if(e.getSource()=buttonPerson) if(grade=1) newGame(初级,10,8,8,180,220); if(grade=2) newGame(中级,40,16,16,360,380); if(grade=3) newGame(高级,99,22,22,500,520); public static void main(String args) new Game(); Block.javaimport java.awt.event.*;import java.awt.*;import javax.swing.*;import javax.swing.border.*;public class Block extends JButton implements MouseListener boolean 雷=false, 周围无雷=true; int 周围的雷数=0; int 探雷标记=-1; JLabel label; Point p; public Block() label=new JLabel(); setBorder(BorderFactory.createMatteBorder(1, 1, 0, 0, Color.lightGray); label.setBorder(BorderFactory.createMatteBorder(1, 1, 0, 0, Color.lightGray); label.setHorizontalAlignment(JLabel.CENTER); label.setLayout(new BorderLayout(); label.add(this,BorderLayout.CENTER); p=new Point(0,0);addMouseListener(this); public void 设置是否是雷(boolean b) 雷=b; public boolean 判断是否是雷() return 雷; public void 设置是雷时的图标(Icon icon) label.setIcon(icon); public void 设置周围无雷时的图标(Icon icon) label.setIcon(icon); public void 设置周围有雷时的名字(String name) label.setText(name); public String 获取名字() return label.getText(); public void 设置周围的雷数(int n) 周围的雷数=n; public int 获取周围的雷数() return 周围的雷数; public void 设置在雷区中的位置(int i,int j) p=new Point(i,j); public Point 获取在雷区中的位置() return p; public int 获取探雷标记() return 探雷标记; public void mousePressed(MouseEvent e) boolean right=SwingUtilities.isRightMouseButton(e); if(right=true)&(this.isOpaque()=true) 探雷标记=(探雷标记+1)%3; repaint(); public void paintComponent(Graphics g) super.paintComponent(g); if(探雷标记=0) g.setColor(Color.red); g.fillRect(6,4,8,6); g.drawLine(13,10,14,18); if(探雷标记=1) g.setColor(Color.blue); g.drawString(?,6,15); public void mouseEntered(MouseEvent e) public void mouseReleased(MouseEvent e) public void mouseExited(MouseEvent e) public void mouseClicked(MouseEvent e) MineSquare.javaimport java.awt.event.*;import java.awt.*;import javax.swing.*;import java.util.*;import java.io.*;public class MineSquare extends JPanel implements MouseListener int rows=10,cols=10,雷数=10; JButton buttonFace=null; Block block; TimeCount time; CountMine count; String grade=null; RandomSetMine 随机布雷者; FindAroundMineNumber 确定周围雷数者; FindSafeArea 找出无雷连通区者; DetermineDigArea 成片挖开者; DetermineMineMarkIsRightOrWrong 确定雷标记是否正确者; FindAroundMineMarkNumber 确定周围雷标数目者; DecideWinner 判断是否胜利者; Record 记录对话框=null; public MineSquare(String grade,int mineNumber,int rows, int cols,JButton b,JDialog dialog) this.grade=grade; this.rows=rows; this.cols=cols; 雷数=mineNumber; 判断是否胜利者=new DecideWinner(); 记录对话框=(Record)dialog; block=new Blockrows+1cols+1; buttonFace=b; time=new TimeCount(); count=new CountMine(雷数); count.textShowMine.setText(+雷数); setLayout(new GridLayout(rows,cols); for(int i=1;i=rows;i+) for(int j=1;j=cols;j+) blockij=new Block(); blockij.设置在雷区中的位置(i,j); for(int i=1;i=rows;i+) for(int j=1;j=cols;j+) add(blockij.label); blockij.addMouseListener(this); 随机布雷者=new RandomSetMine(); 随机布雷者.随机布雷(雷数,block,rows,cols); 确定周围雷数者=new FindAroundMineNumber(); for(int i=1;i=rows;i+) for(int j=1;j=cols;j+) 确定周围雷数者.设置周围的雷数(i,j,block,rows,cols); public void gameOver() errupt(); buttonFace.setIcon(new ImageIcon(哭脸.gif); for(int i=1;i=rows;i+) for(int j=1;j=cols;j+) blockij.removeMouseListener(this); if(blockij.判断是否是雷()&blockij.isOpaque()&blockij.探雷标记!=0) blockij.requestFocus(); blockij.setOpaque(false); if(blockij.探雷标记=0&!blockij.判断是否是雷() blockij.requestFocus(); blockij.探雷标记=-1; blockij.repaint(); blockij.setIcon(new ImageIcon(探雷错误.gif); public void mousePressed(MouseEvent e) boolean left=SwingUtilities.isLeftMouseButton(e); boolean right=SwingUtilities.isRightMouseButton(e); Block blockSource=(Block)e.getSource(); boolean 雷=blockSource.判断是否是雷(); if(left=true&blockSource.isOpaque()=true&blockSource.获取探雷标记()!=0) trytime.start(); catch(Exception ee) if(雷=true) blockSource.requestFocus(); blockSource.setOpaque(false); blockSource.探雷标记=-1; blockSource.repaint(); blockSource.setIcon(new ImageIcon(触雷.gif); gameOver(); else buttonFace.setIcon(new ImageIcon(微笑脸.gif); if(blockSource.周围无雷=false&blockSource.获取探雷标记()!=0) blockSource.setOpaque(false); blockSource.探雷标记=-1; blockSource.repaint(); if(blockSource.周围无雷=true&blockSource.isOpaque() blockSource.setOpaque(false); Point blockPoint=(Point)blockSource.获取在雷区中的位置(); int i=blockPoint.x; int j=blockPoint.y; 找出无雷连通区者=new FindSafeArea(); Vector tree=找出无雷连通区者.确定无雷连通区(i,j,block,rows,cols); for(int index=0;indextree.size();index+) Point p=(Point)tree.elementAt(index); int m=p.x,n=p.y; for(int k=Math.max(m-1,1);k=Math.min(m+1,rows);k+) for(int t=Math.max(n-1,1);t=Math.min(n+1,cols);t+) if(blockkt.探雷标记=0) gameOver(); else blockkt.requestFocus(); blockkt.setOpaque(false); blockkt.探雷标记=-1; blockkt.repaint(); tree.removeAllElements(); if(right) if(blockSource.探雷标记=0&blockSource.isOpaque() count.countMineSub(); if(blockSource.探雷标记=1&blockSource.isOpaque() count.countMineAdd(); public void mouseEntered(MouseEvent e) public void mouseReleased(MouseEvent e) boolean success=判断是否胜利者.判断是否成功(雷数,block,rows,cols); if(success=true) errupt(); 记录对话框.setGrade(grade); int spendTime=Integer.parseInt(time.textShowTime.getText(); 记录对话框.setTime(spendTime); File f=new File(英雄榜.txt); tryFileInputStream in=new FileInputStream(f); ObjectInputStream object_in=new ObjectInputStream(in); Hashtable hashtable=(Hashtable)object_in.readObject(); object_in.close(); in.close(); String temp=(String)hashtable.get(grade); StringTokenizer fenxi=new StringTokenizer(temp,#); fenxi.nextToken(); int recordTime=Integer.parseInt(fenxi.nextToken(); if(spendTime0&correct) 成片挖开者=new DetermineDigArea(); Vector tree=成片挖开者.确定成片挖开区域(i,j,block,rows,cols); for(int index=0;indextree.size();index+) Point p=(Point)tree.elementAt(index); int m=p.x,n=p.y; for(int k=Math.max(m-1,1);k=Math.min(m+1,rows);k+) for(int t=Math.max(n-1,1);t=Math.min(n+1,cols);t+) if(blockkt.isOpaque()&!blockkt.判断是否是雷()& blockkt.探雷标记!=0) blockkt.requestFocus(); blockkt.setOpaque(false); blockkt.探雷标记=-1; blockkt.repaint(); repaint(); tree.removeAllElements(); if(blockSource.isOpaque()=false&周围雷标数=周围雷数&!correct) gameOver(); if(blockSource.isOpaque()=false&(周围雷标数!=周围雷数) FindAroundMineNumber.javaimport java.awt.Color;import javax.swing.Icon;import javax.swing.ImageIcon;public class FindAroundMineNumberIcon 周围无雷的图标; public FindAroundMineNumber() 周围无雷的图标=new ImageIcon(无雷.gif); public void 设置周围的雷数(int i,int j,Block block,int 行数, int 列数) int 雷数=0; if(blockij.判断是否是雷()=false) for(int k=Math.max(i-1,1);k=Math.min(i+1,行数);k+) for(int t=Math.max(j-1,1);t0) blockij.周围无雷=false; blockij.设置周围有雷时的名字(+雷数); blockij.设置周围的雷数(雷数); if(雷数=1) blockij.label.setForeground(Color.blue); if(雷数=2) blockij.label.setForeground(new Color(0,100,0); if(雷数=3) blockij.label.setForeground(Color.red); if(雷数=4) blockij.label.setForeground(new Color(0,0,100); else blockij.周围无雷=true; blockij.设置周围有雷时的名字(); blockij.设置周围的雷数(0); blockij.设置周围无雷时的图标(周围无雷的图标); DetermineMineMarkIsRightOrWrong.javapublic class DetermineMineMarkIsRightOrWrongFindAroundMineMarkNumber 确定周围雷标数目者=new FindAroundMineMarkNumber(); int 周围雷标数=0; int 周围雷数=0; public DetermineMineMarkIsRightOrWrong() public boolean 判断雷标记是否正确(int i,int j,Block block,int 行数, int 列数) int 错误=0; boolean correct=false; 周围雷标数=确定周围雷标数目者.获取周围雷标记的数目(i,j,block,行数,列数); 周围雷数=blockij.获取周围的雷数(); for(int k=Math.max(i-1,1);k=Math.min(i+1,行数);k+) for(int t=Math.max(j-1,1);t0) correct=false; else if(错误=0&周围雷标数=周围雷数) correct=true; return correct; DetermineDigArea.javaimport java.awt.Point;import java.util.Vector;public class Determin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论