Java课程设计报告蜘蛛纸牌游戏.docx
《Java课程设计报告蜘蛛纸牌游戏.docx》由会员分享,可在线阅读,更多相关《Java课程设计报告蜘蛛纸牌游戏.docx(42页珍藏版)》请在冰豆网上搜索。
Java课程设计报告蜘蛛纸牌游戏
1.选题目的与系统概述…………………………………………2
2.系统可行性分析与相关技术背景分析………………………3
2.1系统可行性分析…………………………………………………3
2.2相关技术背景分析………………………………………………3
3.系统设计与关键技术…………………………………………4
3.1系统设计…………………………………………………………4
3.2关键技术…………………………………………………………5
4.系统测试与操作实施方法……………………………………9
4.1进入游戏运行界面………………………………………………9
4.2游戏的具体的操作过程…………………………………………9
4.3进入“帮助”菜单………………………………………………10
4.4游戏中的异常处理情况…………………………………………11
5.系统设计总结与回顾………………………………………12
6.附录……………………………………………………………13
6.1AboutDialog.java……………………………………………13
6.2PKCard.java……………………………………………………14
6.3Spider.java………………………………………………………20
6.4SpiderMenuBar.java……………………………………………29
1.选题目的与系统概述
随着经济全球一体化的逐步加剧,人们的生活节奏越来越快。
蜘蛛纸牌游戏的一种,旨在让工作学习之后疲惫的玩家有一个轻愉快的放松方式。
与普通的纸牌相比,降低了一点难度。
游戏简单级别由8组A-K的清一色黑桃牌面组成,取消了红黑相间的游戏规则,更突然出强化了玩家在安排事物方面的能力。
蜘蛛纸牌游戏实现了与Windows系列操作系统中自带的蜘蛛纸牌游戏类似的功能。
该游戏程序中采用Windows系列中游戏的图片,运用Java语言设计了线程、鼠标事件、纸牌的装载、图形界面的构造、组件监听接口的实现、生成蜘蛛纸牌游戏的框架、实现游戏中的方法,是一种休闲益智游戏。
2.系统可行性分析与相关技术背景分析
2.1系统可行性分析
蜘蛛纸牌游戏规则是:
(1)将电脑分发给你的牌按照相同的花色又打至小排列起来,直到桌面上的牌全都消失。
(2)可执行的牌必须为明牌
(3)单牌移动规则
(4)多拍移动规则
游戏分三个等级:
(1)简答:
单一花色;
(2)中级:
双花色;(3)四花色。
2.2相关技术背景分析
2.2.1蜘蛛纸牌游戏是基于Eclipse平台的Java程序。
Eclipse的背景如下:
Eclipse最初是IBM公司的一个软件产品。
2001年11月7日发布Eclipse1.0版本,以后几乎每年都更新一次版本,到2011年6月22日,发布最新版本Eclipse3.7(INDIGO)。
尽管Eclipse是使用Java语言开发的,但它的用途并不仅限于Java语言。
例如,支持诸如C/C++、COBOL和Eiffel等编程语言的插件已经可用。
Eclipse平台的主要任务是为开发者提供能够使用各种工具无缝集成的机制和需要遵守的规则。
Eclipse的特点是:
(1)基于Java、开发源码的可扩展平台;
(2)一个免费得JavaIDE(Java集成开发环境)。
2.2.2本课程设计是在最新版本Eclipse3.7(INDIGO)下运行,进入界面如下:
3.系统设计与关键技术
3.1系统设计
3.1.1蜘蛛游戏可以分为四个模块,它们之间的关系如下:
(1)Spider.Java游戏开始的主函数,调用中及实现游戏中的方法,即调用SpiderMenuBar.java
(2)SpiderMenuBar调用游戏框架和游戏菜单,即调用PKCard.java和AboutDialog.Java
(3)PKCard.java纸牌的调用和移动位置及纸牌属性,即调用Spider.Java
3.1.2蜘蛛游戏的流程图如图3-1所示。
图3-1
3.1.3蜘蛛游戏可以分为四个模块各项功能如下:
(1)AboutDialog.java其作用是生成游戏的“帮助”下拉菜单
(2)PKCard.java其作用是定义纸牌属性,包括名称、位置等相关信息。
并管理所有可执行操作,如启动Flash线程、点击鼠标、释放鼠标、放置纸牌、判断可用列、用鼠标拖动纸牌、移动(x,y)个位置、令纸牌显示正面、令纸牌显示背面、将纸牌移动到点point、判断纸牌是否移动、判断card是否是正面等。
(3)Spider.java其作用是设置游戏等级、框架属性、纸牌初始化、异常及成功处理等
(4)SpiderMenuBar.java其作用是添加“游戏”下拉列表所有菜单选项,实现各组件的事件侦听。
主要包括三个模块:
图形用户界面的构建、组件监听接口的实现、显示可执行操作的线程。
3.2关键技术
3.2.1AboutDialog.java中的“关于”窗口
privateJTextAreajt1=newJTextArea("将电脑多次分发给你的牌按照相同的花色由大至小排列起来。
直到桌面上的牌全都消失。
");//用来显示“游戏规则”对应的文本框
privateJTextAreajt2=newJTextArea("该游戏中,纸牌的图片来自于WindowsXP的纸牌游戏,图片权属于原作者所有!
");//用来显示“声明”对应的文本框
3.2.2PKCard.java当有空位的时候,启动Flash线程,继续进行发牌。
publicvoidflashCard(PKCardcard){
newFlash(card).start();//不停的获得下一张牌,直到完成
if(main.getNextCard(card)!
=null){
card.flashCard(main.getNextCard(card));}}
classFlashextendsThread{
privatePKCardcard=null;
publicFlash(PKCardcard){
this.card=card;
}
3.2.3PKCard.java中点击“游戏”->“显示可行操作”后,可以连续的纸牌会闪烁一下,即一张是图片本身一张是白色图片。
这里有线程的run()方法来实现。
publicvoidrun(){
booleanis=false;
ImageIconicon=newImageIcon("images/white.gif");
for(inti=0;i<4;i++){
try{
Thread.sleep(200);
}
catch(InterruptedExceptione){
e.printStackTrace();
}
if(is){this.card.turnFront();
is=!
is;}
else{this.card.setIcon(icon);
is=!
is;
}//根据当前外观将card的UI属性重置
card.updateUI();}}}
3.2.4PKCard.java放置纸牌
publicvoidsetNextCardLocation(Pointpoint){
PKCardcard=main.getNextCard(this);
if(card!
=null){
if(point==null){
card.setNextCardLocation(null);
main.table.remove(card.getLocation());
card.setLocation(card.initPoint);
main.table.put(card.initPoint,card);
}
else{
point=newPoint(point);
point.y+=20;
card.setNextCardLocation(point);
point.y-=20;
main.table.remove(card.getLocation());
card.setLocation(point);
main.table.put(card.getLocation(),card);
card.initPoint=card.getLocation();}}}
3.2.5PKCard.java判断可用列
publicintwhichColumnAvailable(Pointpoint){
intx=point.x;
inty=point.y;
inta=(x-20)/101;
intb=(x-20)%101;
if(a!
=9){
if(b>30&&b<=71){
a=-1;}
elseif(b>71){
a++;}}
elseif(b>71){
a=-1;}
if(a!
=-1){
Pointp=main.getLastCardLocation(a);
if(p==null)p=main.getGroundLabelLocation(a);
b=y-p.y;
if(b<=-96||b>=96){
a=-1;}}
returna;}
3.2.6Spider.java中对鼠标事件监听程序进行初始布局
clickLabel.addMouseListener(newMouseAdapter(){
publicvoidmouseReleased(MouseEventme){
if(c<60){
Spider.this.deal();
}}});
3.2.7SpiderMenuBar.java“游戏”下拉菜单中游戏级别设置
jRMItemEasy.addActionListener(newjava.awt.event.ActionListener(){
publicvoidactionPerformed(java.awt.event.ActionEvente){
main.setGrade(Spider.EASY);
main.initCards();
main.newGame();
}});//“简单级别”默认设置
jRMItemNormal.addActionListener(newjava.awt.event.ActionListener(){
publicvoidactionPerformed(java.awt.event.ActionEvente){
main.setGrade(Spider.NATURAL);
main.initCards();
main.newGame();
}});//“中级”
jRMItemHard.addActionListener(newjava.awt.event.ActionListener(){
publicvoidactionPerformed(java.awt.event.ActionEvente){
main.setGrade(Spider.HARD);
main.initCards();
main.newGame();
}
});//“高级”
jNewGame.addMenuListener(newjavax.swing.event.MenuListener(){
publicvoidmenuSelected(javax.swing.event.MenuEvente){
if(main.getC()<60){
jItemPlayAgain.setEnabled(true);
}
else{
jItemPlayAgain.setEnabled(false);}}
publicvoidmenuDeselected(javax.swing.event.MenuEvente){}
publicvoidmenuCanceled(javax.swing.event.MenuEvente){}});
3.2.8SpiderMenuBar.java"中显示可行操作"功能控制
jItemValid.addActionListener(newjava.awt.event.ActionListener(){
publicvoidactionPerformed(java.awt.event.ActionEvente){
newShow().start();
}});
3.2.9为组件添加事件监听addActionListener并实现
jItemOpen.addActionListener(newjava.awt.event.ActionListener(){
publicvoidactionPerformed(java.awt.event.ActionEvente){
main.newGame();
}
});//“开局”
3.2.10“重新发牌”功能控制
jItemPlayAgain.addActionListener(newjava.awt.event.ActionListener(){
publicvoidactionPerformed(java.awt.event.ActionEvente){
if(main.getC()<60){
main.deal();
}}});
4.系统测试与操作实施方法
4.1进入游戏运行界面。
如图4-1所示。
图4-1“游戏”下拉菜单列表
4.2游戏的具体的操作过程
(1)开始时,为“简单”级别,花色为黑桃,如图4-2所示。
(2)将纸牌从大到小将纸牌排列,当从K到A排好序后,游戏将所有牌归并到界面的左下方,如图4-2到图4-5所示。
(3)当第八次归并完毕后,游戏自动弹出“成功”对话框,如图4-6所示。
(4)设置为“中级”的开局后的界面,如图4-7所示。
(5)设置为“高级”的开局后的界面,如图4-8所示。
图4-2进入“开局”初始化界面图4-3将纸牌从大到小排好后,归并到
左下角
图4-4第二次归并后图4-5第三次归并后
图4-6第八次归并完毕后,游戏自动弹出“成功”对话框
图4-7设置为“中级”的开局后界面图4-8设置为“高级”的开局后界面
4.3进入“帮助”菜单
点击“帮助”下拉菜单的“关于”会弹出“蜘蛛牌”对话框,如图4-9所示。
单击“游戏规则”如图4-10所示。
单击“声明”图4-11所示。
图4-9“帮助”下拉菜单“关于”图4-10“游戏规则”下的编辑框
图4-11“声明”下的编辑框
4.4游戏中的异常处理情况
游戏过程中,如果移动纸牌时,中间有空位时,单击发牌,会弹出“提示对话框”。
如图4-12所示。
图4-12纸牌的异常处理
5.系统设计总结与回顾
蜘蛛纸牌游戏实现了与Windows系列操作系统中自带的蜘蛛纸牌游戏类似的功能。
该游戏程序中采用Windows系列中游戏的图片,运用Java语言设计了线程、鼠标事件、纸牌的装载、图形界面的构造、组件监听接口的实现、生成蜘蛛纸牌游戏的框架、实现游戏中的方法,是一种休闲益智游戏。
通过本次课程设计对蜘蛛纸牌游戏的深入研究和分析,对于Eclipse3.7有了深入的学习和了解,并对其应用有了一定的掌握。
对Java语言在实际中的应用有了切身的体会,并将所学的知识在实践中得到应用,同时也巩固了Java中所学的理论知识,对于不了解的知识,又有了新的学习。
同学们对于不懂的内容同学查阅相关资料以及老师们的帮助,还有同学间的相互讨论,增加了团队合作的能力。
在分析源码的过程中,有些不熟悉的代码,参考了相关资料,以及老师和同学们的帮助,使得问题得以解决,在此向向帮助过我们的老师和同学表示感谢!
6.附录
源代码:
6.1AboutDialog.java
importjavax.swing.*;
importjava.awt.*;
/*“关于”窗口*/
publicclassAboutDialogextendsJDialog
{
privatestaticfinallongserialVersionUID=1L;//AdddefaultserialversionID
JPaneljMainPane=newJPanel();
JTabbedPanejTabbedPane=newJTabbedPane();
privateJPaneljPanel1=newJPanel();
privateJPaneljPanel2=newJPanel();
privateJTextAreajt1=newJTextArea("将电脑多次分发给你的牌按照相同的花色由大至小排列起来。
直到桌面上的牌全都消失。
");//用来显示“游戏规则”对应的文本框
privateJTextAreajt2=newJTextArea("该游戏中,纸牌的图片来自于WindowsXP的纸牌游戏,图片权属于原作者所有!
");//用来显示“声明”对应的文本框
/*构造函数*/
publicAboutDialog()
{
setTitle("蜘蛛牌");
setSize(300,200);
setResizable(false);//设置是否可调整大小,初始值设为false
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);//setDefaultCloseOperation()是用来设定窗口被关闭时候(比如点击了右上角的"x")的行为的。
Containerc=this.getContentPane();
jt1.setSize(300,300);//设置“游戏规则”下文本框大小
jt2.setSize(300,300);//设置“声明”下文本框的大小
jt1.setEditable(false);//设置文本框是否可以编辑,这里设置为false
jt2.setEditable(false);
jt1.setLineWrap(true);
jt2.setLineWrap(true);
jt1.setFont(newFont("楷体",java.awt.Font.BOLD,20));//中文字体:
楷体,字形:
黑体,字号:
13
jt1.setForeground(Color.blue);//设置“游戏规则”下文本的字体颜色,可以设置为black(黑)、blue(蓝)、cyan(蓝绿)、darkGray(深灰)、gray(灰)、green(绿)、lightGray(浅灰)、orange(橘黄)、pink(粉红)、red(红)、white(白)、yellow(黄)等java.awt.Color中13中标准颜色之一
jt2.setFont(newFont("楷体",java.awt.Font.BOLD,20));
jt2.setForeground(Color.red);
jPanel1.add(jt1);
jPanel2.add(jt2);
jTabbedPane.setSize(300,200);
jTabbedPane.addTab("游戏规则",null,jPanel1,null);
jTabbedPane.addTab("声明",null,jPanel2,null);
jMainPane.add(jTabbedPane);
c.add(jMainPane);
pack();
this.setVisible(true);
}}
6.2PKCard.java
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
publicclassPKCardextendsJLabelimplementsMouseListener,
MouseMotionListener{
privatestaticfinallongserialVersionUID=1L;//AdddefaultserialversionID
//纸牌的位置
Pointpoint=null;
PointinitPoint=null;
intvalue=0;
inttype=0;
Stringname=null;
Containerpane=null;
Spidermain=null;
booleancanMove=false;
booleanisFront=false;
PKCardpreviousCard=null;
publicvoidmouseClicked(MouseEventarg0){
}
publicvoidflashCard(PKCardcard){//启动Flash线程
newFlash(card).start();//不停的获得下一张牌,直到完成
if(main.getNextCard(card)!
=null){
card.flashCard(main.getNextCard(card));
}
}
classFlashextendsThread{
privatePKCardcard=null;
publicFlash(PKCardcard){
this.card=card;
}
/*线程的run()方法--为纸牌的正面设置白色图片*/
publicvoidrun(){
booleanis=false;
ImageIconicon=newImageIcon("images/white.gif");
for(inti=0;i<4;i++){
try{
Thread.s