Java课程设计报告-扫雷游戏.doc

上传人:来看看 文档编号:3258282 上传时间:2019-08-06 格式:DOC 页数:45 大小:242.53KB
返回 下载 相关 举报
Java课程设计报告-扫雷游戏.doc_第1页
第1页 / 共45页
Java课程设计报告-扫雷游戏.doc_第2页
第2页 / 共45页
Java课程设计报告-扫雷游戏.doc_第3页
第3页 / 共45页
Java课程设计报告-扫雷游戏.doc_第4页
第4页 / 共45页
Java课程设计报告-扫雷游戏.doc_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《Java课程设计报告-扫雷游戏.doc》由会员分享,可在线阅读,更多相关《Java课程设计报告-扫雷游戏.doc(45页珍藏版)》请在三一文库上搜索。

1、Java课程设计课程名称:扫雷姓 名: 学 号: 专 业:电子信息工程 摘要Windows 2000/XP系统提供的扫雷游戏是一个很有趣的游戏。本章的课程设计使用Java语言编写一个与其类似的扫雷游戏。具体要求如下:(1) 扫雷游戏分为初级、中级和高级三个级别,扫雷英雄榜存储每个级别的最好成绩,即挖出全部的地雷且用时最少者。单击游戏菜单可以选择“初级”、“中级”和“高级”或“查看英雄版”。(2) 选择级别后将出现相应级别的扫雷区域,这是用户使用鼠标左键单击雷区中任何一个方块便启动计时器。(3) 用户要揭开某个方块,可单击它。若所揭方块下有泪,用户便输了这一局,若所揭方块下五雷,则显示一个数字,

2、该数字代表方块的周围的8个方块中共有多少颗雷。(4) 如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。(5) 扫雷胜利后(用时最少者),程序弹出保存成绩的对话框。(6)用户可以选择标记疑问的方块,用可以勾选游戏菜单下的标记即可,此时双击右键并可出现“?”标记。另有颜色选项,当用户勾选此项时,游戏将以最低图像像素来显示。正文一设计目的: 本次课程设计的主要目的是为了通过具体的程序来加深对Java语言的掌握,提高自己的编程水平。选择的题目来自Java课程设计(第二版)

3、中的扫雷游戏,这是一个综合性的题目,可以对Java中的各项功能有更好的理解和使用,同时也为以后的工作打下一定的基础。二总体设计: (1)用户可以自定义级别并且可以任意输入雷数;(2)具有计时功能,即显示用户完成移动盘子所花费的时间;(3)用户可以选择是否有音效;(4)自动保存扫雷英雄榜。三关键技术:四程序流程: 五 主要源代码:import javax.swing.ImageIcon;public class Block String name; /名字,比如雷或数字 int aroundMineNumber; /周围雷的数目 ImageIcon mineIcon; /雷的图标 boolean

4、 isMine=false; /是否是雷 boolean isMark=false; /是否被标记 boolean isOpen=false; /是否被挖开 public void setName(String name) this.name=name; public void setAroundMineNumber(int n) aroundMineNumber=n; public int getAroundMineNumber() return aroundMineNumber; public String getName() return name; public boolean isM

5、ine() return isMine; public void setIsMine(boolean b) isMine=b; public void setMineIcon(ImageIcon icon) mineIcon=icon; public ImageIcon getMineicon() return mineIcon; public boolean getIsOpen() return isOpen; public void setIsOpen(boolean p) isOpen=p; public boolean getIsMark() return isMark; public

6、 void setIsMark(boolean m) isMark=m; import javax.swing.*;import java.awt.*;public class BlockView extends JPanel JLabel blockNameOrIcon; /用来显示Block对象的name、number和mineIcon属性 JButton blockCover; /用来遮挡blockNameOrIcon. CardLayout card; /卡片式布局 BlockView() card=new CardLayout(); setLayout(card); blockNam

7、eOrIcon=new JLabel(,JLabel.CENTER); blockNameOrIcon.setHorizontalTextPosition(AbstractButton.CENTER); blockNameOrIcon.setVerticalTextPosition(AbstractButton.CENTER); blockCover=new JButton(); add(cover,blockCover); add(view,blockNameOrIcon); public void giveView(Block block) if(block.isMine) blockNa

8、meOrIcon.setText(block.getName(); blockNameOrIcon.setIcon(block.getMineicon(); else int n=block.getAroundMineNumber(); if(n=1) blockNameOrIcon.setText(+n); else blockNameOrIcon.setText( ); public void seeBlockNameOrIcon() card.show(this,view); validate(); public void seeBlockCover() card.show(this,c

9、over); validate(); public JButton getBlockCover() return blockCover; import java.util.*;import javax.swing.*;public class LayMines ImageIcon mineIcon; LayMines() mineIcon=new ImageIcon(mine.gif); public void layMinesForBlock(Block block,int mineCount) int row=block.length; int column=block0.length;

10、LinkedList list=new LinkedList(); for(int i=0;irow;i+) for(int j=0;j0) int size=list.size(); / list返回节点的个数 int randomIndex=(int)(Math.random()*size); Block b=list.get(randomIndex); b.setIsMine(true); b.setName(雷); b.setMineIcon(mineIcon); list.remove(randomIndex); /list删除索引值为randomIndex的节点 mineCount

11、-; for(int i=0;irow;i+) for(int j=0;jcolumn;j+) if(blockij.isMine() blockij.setIsOpen(false); blockij.setIsMark(false); else int mineNumber=0; for(int k=Math.max(i-1,0);k=Math.min(i+1,row-1);k+) for(int t=Math.max(j-1,0);t=Math.min(j+1,column-1);t+) if(blockkt.isMine() mineNumber+; blockij.setIsOpen

12、(false); blockij.setIsMark(false); blockij.setName(+mineNumber); blockij.setAroundMineNumber(mineNumber); import java.awt.*;import java.awt.event.*;import javax.swing.*;public class MineArea extends JPanel implements ActionListener,MouseListener JButton reStart; Block block; BlockView blockView; Lay

13、Mines lay; int row,colum,mineCount,markMount;/雷区的行数、列数以及地雷个数和用户给出的标记数 ImageIcon mark; int grade; JPanel pCenter,pNorth; JTextField showTime,showMarkedMineCount; /显示用时以及标记数 Timer time; /计时器 int spendTime=0; Record record; public MineArea(int row,int colum,int mineCount,int grade) reStart=new JButton(

14、重新开始); mark=new ImageIcon(mark.gif); /探雷标记 time=new Timer(1000,this); showTime=new JTextField(5); showMarkedMineCount=new JTextField(5); showTime.setHorizontalAlignment(JTextField.CENTER); showMarkedMineCount.setHorizontalAlignment(JTextField.CENTER); showMarkedMineCount.setFont(new Font(Arial,Font.

15、BOLD,16); showTime.setFont(new Font(Arial,Font.BOLD,16); pCenter=new JPanel(); pNorth=new JPanel(); lay=new LayMines(); initMineArea(row,colum,mineCount,grade); /初始化雷区,见下面的LayMines() reStart.addActionListener(this); pNorth.add(showMarkedMineCount); pNorth.add(reStart); pNorth.add(showTime); setLayou

16、t(new BorderLayout(); add(pNorth,BorderLayout.NORTH); add(pCenter,BorderLayout.CENTER); public void initMineArea(int row,int colum,int mineCount,int grade) pCenter.removeAll(); spendTime=0; markMount=mineCount; this.row=row; this.colum=colum; this.mineCount=mineCount; this.grade=grade; block=new Blo

17、ckrowcolum; for(int i=0;irow;i+) for(int j=0;jcolum;j+) blockij=new Block(); lay.layMinesForBlock(block,mineCount); blockView=new BlockViewrowcolum; pCenter.setLayout(new GridLayout(row,colum); for(int i=0;irow;i+) for(int j=0;jcolum;j+) blockViewij=new BlockView(); blockViewij.giveView(blockij); /给

18、blockij提供视图 pCenter.add(blockViewij); blockViewij.getBlockCover().addActionListener(this); blockViewij.getBlockCover().addMouseListener(this); blockViewij.seeBlockCover(); blockViewij.getBlockCover().setEnabled(true); blockViewij.getBlockCover().setIcon(null); showMarkedMineCount.setText(+markMount)

19、; validate(); public void setRow(int row) this.row=row; public void setColum(int colum) this.colum=colum; public void setMineCount(int mineCount) this.mineCount=mineCount; public void setGrade(int grade) this.grade=grade; public void actionPerformed(ActionEvent e) if(e.getSource()!=reStart&e.getSour

20、ce()!=time) time.start(); int m=-1,n=-1; for(int i=0;irow;i+) for(int j=0;jcolum;j+) if(e.getSource()=blockViewij.getBlockCover() m=i; n=j; break; if(blockmn.isMine() for(int i=0;irow;i+) for(int j=0;j0&blockmn.getIsOpen()=false) blockViewmn.seeBlockNameOrIcon(); blockmn.setIsOpen(true); return; els

21、e if(blockmn.getAroundMineNumber()=0&blockmn.getIsOpen()=false) blockViewmn.seeBlockNameOrIcon(); blockmn.setIsOpen(true); for(int k=Math.max(m-1,0);k=Math.min(m+1,row-1);k+) for(int t=Math.max(n-1,0);t=Math.min(n+1,colum-1);t+) show(k,t); public void mousePressed(MouseEvent e) JButton source=(JButt

22、on)e.getSource(); for(int i=0;irow;i+) for(int j=0;jcolum;j+) if(e.getModifiers()=InputEvent.BUTTON3_MASK& source=blockViewij.getBlockCover() if(blockij.getIsMark() source.setIcon(null); blockij.setIsMark(false); markMount=markMount+1; showMarkedMineCount.setText(+markMount); else source.setIcon(mar

23、k); blockij.setIsMark(true); markMount=markMount-1; showMarkedMineCount.setText(+markMount); public void inquireWin() int number=0; for(int i=0;irow;i+) for(int j=0;jcolum;j+) if(blockij.getIsOpen()=false) number+; if(number=mineCount) time.stop(); record=new Record(); switch(grade) case 1: record.s

24、etGrade(初级); break; case 2: record.setGrade(中级); break; case 3: record.setGrade(高级); break; record.setTime(spendTime); record.setVisible(true); public void mouseReleased(MouseEvent e) public void mouseEntered(MouseEvent e) public void mouseExited(MouseEvent e) public void mouseClicked(MouseEvent e)i

25、mport java.awt.event.*;import java.awt.*;import javax.swing.*;import javax.swing.border.*;import java.util.*;import java.io.*;public class MineGame extends JFrame implements ActionListener JMenuBar bar; JMenu fileMenu; JMenuItem 初级,中级,高级,扫雷英雄榜; MineArea mineArea=null; File 英雄榜=new File(英雄榜.txt); Has

26、htable hashtable=null; ShowRecord showHeroRecord=null; MineGame() mineArea=new MineArea(16,16,40,1); add(mineArea,BorderLayout.CENTER); bar=new JMenuBar(); fileMenu=new JMenu(游戏); 初级=new JMenuItem(初级); 中级=new JMenuItem(中级); 高级=new JMenuItem(高级); 扫雷英雄榜=new JMenuItem(扫雷英雄榜); fileMenu.add(初级); fileMenu

27、.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.

28、put(高级,高级#+999+#匿名); if(!英雄榜.exists() try FileOutputStream out=new FileOutputStream(英雄榜); ObjectOutputStream objectOut=new ObjectOutputStream(out); objectOut.writeObject(hashtable); objectOut.close(); out.close(); catch(IOException e) showHeroRecord=new ShowRecord(this,hashtable); setBounds(100,100,

29、280,380); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); validate(); public void actionPerformed(ActionEvent e) if(e.getSource()=初级) mineArea.initMineArea(8,8,10,1); setBounds(100,100,200,280); if(e.getSource()=中级) mineArea.initMineArea(16,16,40,2); setBounds(100,100,280,380); if(

30、e.getSource()=高级) mineArea.initMineArea(22,22,99,3); setBounds(100,100,350,390); if(e.getSource()=扫雷英雄榜) if(showHeroRecord!=null) showHeroRecord.setVisible(true); validate(); public static void main(String args) new MineGame(); import java.io.*;import java.util.*;import javax.swing.*;import java.awt

31、.event.*;import java.awt.*;public class Record extends JDialog implements ActionListener int time=0; String grade=null; String key=null; String message=null; JTextField textName; JLabel label=null; JButton 确定,取消; public Record() setTitle(记录你的成绩); this.time=time; this.grade=grade; setBounds(100,100,240,160); setResizable(false); setModal(true); 确定=new JButton(确定); 取消=new JButton(取消); textName=new JTextField(8); textName.setText(匿名); 确定.addActionListener(this); 取消.addActionListener(this); setLayout(new GridLayout(2,1); label=new JLa

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 信息产业


经营许可证编号:宁ICP备18001539号-1