Java课程设计报告扫雷小游戏.docx
《Java课程设计报告扫雷小游戏.docx》由会员分享,可在线阅读,更多相关《Java课程设计报告扫雷小游戏.docx(24页珍藏版)》请在冰豆网上搜索。
![Java课程设计报告扫雷小游戏.docx](https://file1.bdocx.com/fileroot1/2022-11/25/b9a91e11-c417-4aa4-a1a7-3a345ed720e8/b9a91e11-c417-4aa4-a1a7-3a345ed720e81.gif)
Java课程设计报告扫雷小游戏
JAVA语言课程设计报告
题目:
扫雷小游戏
设计者:
专业班级:
学号:
指导教师:
2011年12月12日
计算机学院
目录:
1·设计内容及要求…………………………………………………..1
1.1·扫雷小游戏的基本要求……………………………………….1
1.2需求实现的主要功能…………………………………………...1
2·需求分析…………………………………………………………..1
2.1扫雷区域的布局设计…………………………………………...1
2.2雷区的设计………………………………………………………1
2.3音效的设计…………………………………………………….1
3·总体设计………………………………………………………..2
3.1总体功能图……………………………………………………..2
3.2游戏设计流程图…………………………………………………2
4·主要功能设计……………………………………………………3
4.1雷区设计流程图…………………………………………………3
4.2音效设计流程图…………………………………………………4
4.3排行榜设计流程图………………………………………………5
5·代码实现………………………………………………………….6
5.1类之间的关系图…………………………………………………6
5.2各界面图及代码:
………………………………………………6
5.2.1游戏菜单界面………………………………………………6
5.2.2游戏登录界面(初级、中级、高级)…………………….8
5.2.3自定义扫雷界面……………………………………………..15
6·扫雷总结……………………………………………………………18
7·参考文献…………………………………………………………18
1·设计内容及要求
1.1·扫雷小游戏的基本要求
扫雷小游戏主要采用Java语言编写,适合windowsXP以下的系统,以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窗口的中心。
2.3音效的设计
music类是java.awt包中Frame的子类,通过构造音效声音方法,在MainFrame主类中,通过ActionListener来监视是否已开始游戏,来决定播放计时声,之后又通过ActionListener来监视是否踩到雷和是否完成来决定,播放相应的音乐。
2.4排行榜设计
LogDialog是javax.swing包中Jdialog对话框的子类,并实现了ActiongListener接口。
LogDialog创建的对象dialog是MainFrame类(主类)的成员之一,当用户选择查看“英雄榜”菜单项时,该对话框可见,提供了查看扫雷的最好成绩的界面。
3·总体设计
3.1总体功能图
图1-1总体功能图
3.2游戏设计流程图
图1-2游戏设计流程图
4·主要功能设计
4.1雷区设计流程图
图1-3雷区设计流程图
4.2音效设计流程图
图1-4音效设计流程图
4.3排行榜设计流程图
图1-5排行榜设计流程图
5·代码实现
5.1类之间的关系图
图1-6类之间的关系图
5.2各界面图及代码:
5.2.1游戏菜单界面
图1-7游戏菜单界面
其主要代码为:
privatevoidsetMenuBar(){//设置菜单项
JMenuBarmenuBar=newJMenuBar();
menuBar.setBorder(BorderFactory.createLineBorder(Color.WHITE,2));
JMenugameMenu=newJMenu("游戏(G)");
JMenuhelpMenu=newJMenu("帮助(H)");
gameMenu.setMnemonic('G');
helpMenu.setMnemonic('H');
声音=newVoice();
startItem=newJMenuItem("开局(N)");
startItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F2,0));
logItem=newJMenuItem("扫雷英雄榜(T)...");
markCheckItem=newJCheckBoxMenuItem("标记(?
)(M)");
soundItem=newJCheckBoxMenuItem("声音(S)");
exitItem=newJMenuItem("退出(X)");
aboutItem=newJMenuItem("关于扫雷(A)...");
startItem.setMnemonic('N');
exitItem.setMnemonic('X');
aboutItem.setMnemonic('A');
aboutItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1,0));
logItem.setMnemonic('T');
soundItem.setMnemonic('S');
soundItem.setSelected(sound);
markCheckItem.setMnemonic('M');
markCheckItem.setSelected(markCheck);
gameMenu.add(startItem);
gameMenu.addSeparator();
//radiogroup
levelItem=newJRadioButtonMenuItem[4];
ButtonGrouplevelGroup=newButtonGroup();
levelItem[0]=newJRadioButtonMenuItem("初级(B)");
levelItem[1]=newJRadioButtonMenuItem("中级(I)");
levelItem[2]=newJRadioButtonMenuItem("高级(E)");
levelItem[3]=newJRadioButtonMenuItem("自定义(C)...");
levelItem[0].setMnemonic('B');
levelItem[1].setMnemonic('I');
levelItem[2].setMnemonic('E');
levelItem[3].setMnemonic('C');
for(inti=0;i<4;i++){
levelGroup.add(levelItem[i]);
levelItem[i].addActionListener(this);
gameMenu.add(levelItem[i]);
}
levelItem[currentLevel].setSelected(true);
gameMenu.addSeparator();
gameMenu.add(markCheckItem);
gameMenu.addSeparator();
gameMenu.add(soundItem);
gameMenu.addSeparator();
gameMenu.add(logItem);
gameMenu.addSeparator();
gameMenu.add(exitItem);
helpMenu.add(aboutItem);
startItem.addActionListener(this);
markCheckItem.addActionListener(this);
soundItem.addActionListener(this);
logItem.addActionListener(this);
exitItem.addActionListener(this);
aboutItem.addActionListener(this);
menuBar.add(gameMenu);
menuBar.add(helpMenu);
setJMenuBar(menuBar);
}
5.2.2游戏登录界面(初级、中级、高级)
图1-8初级扫雷界面图1-9中级扫雷界面
图2.0高级扫雷界面
其主要代码为:
privateLevelLoglevelLog[];
privateJTextArealogArea;
privateJButtonresetButton;
privateJButtonconfirmButton;
publicLogDialog(JFrameframe,LevelLoglog[]){
super(frame,"扫雷英雄榜",true);
getContentPane().setLayout(null);
levelLog=log;
logArea=newJTextArea();
logArea.setEditable(false);
logArea.setBackground(UIManager.getColor("CheckBox.background"));
logArea.setBounds(10,10,160,60);
getContentPane().add(logArea,null);
resetButton=newJButton("重新计分");
resetButton.setBounds(10,70,90,25);
resetButton.addActionListener(this);
getContentPane().add(resetButton,null);
setTextArea();
confirmButton=newJButton("确定");
confirmButton.setBounds(105,70,60,25);
confirmButton.addActionListener(this);
getContentPane().add(confirmButton,null);
setSize(180,140);
setLocationRelativeTo(frame);
setResizable(false);
show();
}
privatevoidsetTextArea(){
logArea.setText("初级:
"+levelLog[0].toString()
+"中级:
"+levelLog[1].toString()
+"高级:
"+levelLog[2].toString());
}
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==resetButton){
for(inti=0;i<3;i++){
levelLog[i].setDefault();
}
setTextArea();
}else{
dispose();
}
}
雷区界面设计代码:
privatePolygonsegmentPolygon[];
privateintnumberSegment[][]={
{0,1,2,3,4,5},//0
{1,2},//1
{0,1,3,4,6},//2
{0,1,2,3,6},//3
{1,2,5,6},//4
{0,2,3,5,6},//5
{0,2,3,4,5,6},//6
{0,1,2},//7
{0,1,2,3,4,5,6},//8
{0,1,2,3,5,6}//9
};
privateintdiv[]={1,10,100,1000,10000,100000};
privateImagenumberImage[];
privateColorfontColor=Color.red;//thecolorofnumber
privateColorbgColor=Color.black;
privateColormaskColor=Color.darkGray;
privateintdWidth=12;
privateintdHeight=21;
publicLedNumber(){
init();
}
publicLedNumber(Colorfc){
fontColor=fc;
init();
}
publicLedNumber(Colorfc,Colorbgc){
bgColor=bgc;
fontColor=fc;
init();
}
publicLedNumber(Colorfc,Colorbgc,Colormc){
bgColor=bgc;
fontColor=fc;
maskColor=mc;
init();
}
publicImagegetLedImage(intdg,intbound){
dg%=div[bound];
Imageimage=newBufferedImage(dWidth*bound,dHeight,BufferedImage.TYPE_INT_RGB);
Graphicsg=image.getGraphics();
bound--;
for(inti=bound;i>=0;i--){
g.drawImage(numberImage[dg/div[i]],(bound-i)*dWidth,0,this);
dg%=div[i];
}
returnimage;
}
publicvoidinit(){
segmentPolygon=newPolygon[7];
numberImage=newImage[10];
//setuppolygons
setNumberPolygon();
setNumberImage();
}
publicvoidsetBackGround(Colorbgc){
bgColor=bgc;
}
publicvoidsetFontColor(Colorfc){
fontColor=fc;
}
publicvoidsetMaskColor(Colormkc){
maskColor=mkc;
}
publicvoidsetDigitWidth(intw){
dWidth=w;
init();
}
publicvoidsetDigitHeight(inth){
dHeight=h;
init();
}
publicvoidsetDigitSize(intw,inth){
dWidth=w;
dHeight=h;
init();
}
privatevoidsetNumberImage(){
inti=0;
intj=0;
intk;
Graphicsg;
while(i<10){
numberImage[i]=newBufferedImage(15,20,BufferedImage.TYPE_INT_RGB);
g=numberImage[i].getGraphics();
g.setColor(bgColor);
g.fillRect(0,0,15,20);
g.setColor(Color.DARK_GRAY);
j=0;
while(jk=numberSegment[8][j];
g.fillPolygon(segmentPolygon[k]);
j++;
}
g.setColor(fontColor);
j=0;
while(jk=numberSegment[i][j];
g.fillPolygon(segmentPolygon[k]);
j++;
}
i++;
}
}
publicvoidsetNumberPolygon(){
intmid=dHeight/2+1;
segmentPolygon[0]=newPolygon();
segmentPolygon[0].addPoint(2,1);
segmentPolygon[0].addPoint(dWidth-2,1);
segmentPolygon[0].addPoint(dWidth-5,4);
segmentPolygon[0].addPoint(4,4);
segmentPolygon[1]=newPolygon();
segmentPolygon[1].addPoint(dWidth-1,1);
segmentPolygon[1].addPoint(dWidth-1,mid-1);
segmentPolygon[1].addPoint(dWidth-2,mid-1);
segmentPolygon[1].addPoint(dWidth-4,mid-3);
segmentPolygon[1].addPoint(dWidth-4,4);
segmentPolygon[2]=newPolygon();
segmentPolygon[2].addPoint(dWidth-1,mid);
segmentPolygon[2].addPoint(dWidth-1,dHeight-2);
segmentPolygon[2].addPoint(dWidth-4,dHeight-5);
segmentPolygon[2].addPoint(dWidth-4,mid+1);
segmentPolygon[2].addPoint(dWidth-3,mid);
segmentPolygon[3]=newPolygon();
segmentPolygon[3].addPoint(dWidth-2,dHeight-1);
segmentPolygon[3].addPoint(1,dHeight-1);
segmentPolygon[3].addPoint(4,dHeight-4);
segmentPolygon[3].addPoint(dWidth-4,dHeight-4);
segmentPolygon[4]=newPolygon();
segmentPolygon[4].addPoint(1,dHeight-2);
segmentPolygon[4].addPoint(1,mid);
segmentPolygon[4].addPoint(3,mid);
segmentPolygon[4].addPoint(4,mid+1);
segmentPolygon[4].addPoint(4,dHeight-5);
segmentPolygon[5]=newPolygon();
segmentPolygon[5].addPoint(1,mid-1);
segmentPolygon[5].addPoint(1,1);
segmentPolygon[5].addPoint(4,4);
segmentPolygon[5].addPoint(4,mid-3);
segmentPolygon[5].addPoint(2,mid-1);
segmentPolygon[6]=newPolygon();
segmentPolygon[6].addPoint(3,mid-1);
segmentPolygon[6].addPoint(4,mid-2);
segmentPolygon[6].addPoint(dWidth-4,mid-2);
segment