Java课程设计报告蜘蛛纸牌.docx
《Java课程设计报告蜘蛛纸牌.docx》由会员分享,可在线阅读,更多相关《Java课程设计报告蜘蛛纸牌.docx(20页珍藏版)》请在冰豆网上搜索。
Java课程设计报告蜘蛛纸牌
面向对象程序设计课程设计报告
JAVA程序设计
课程设计
之
蜘蛛纸牌
学院:
年级:
班级:
指导老师:
小组成员:
时间:
课程设计题目
JAVA课程设计——蜘蛛纸牌
学院
计算机学院
专业
网络工程
年级
2009
已知参数和设计要求:
蜘蛛纸牌的主要功能模块包括:
a、游戏界面的布局以及纸牌的设定;b、能够设定不同等级以实现游戏难易度的不同;c、实现游戏主功能;d、实现帮助功能;e、实现退出功能。
要求以小组为单位,用JAVA实现蜘蛛纸牌的主要功能模块;可以根据自己对蜘蛛纸牌游戏的理解,对实现的内容进行扩展最后需要提供的材料包括课程设计报告1份,程序拷贝1份(包括源代码和可执行程序)。
学生应完成的工作:
根据JAVA程序设计的思想和编程技术,设计实现蜘蛛纸牌游戏。
上机调试并能正确运行,并提交完整的设计报告和软件程序拷贝。
目前资料收集情况(含指定参考资料):
《Java程序设计》,朱庆生,古平等著,清华大学出版社,2011,1
《Java编程》,王伟平等著,清华大学出版社,2010,5
《Java课程设计案例精编》黄晓东编著,中国水利水电出版社出版
《Java程序设计实用教程》张永常主编,电子工业出版社出版
课程设计时间为一周,从15周星期一开始(2011年12月12日),到15周星期五结束(2011年12月16日)。
课程设计以组为单位进行。
每组3~4个人。
星期一进行蜘蛛纸牌游戏的内容和规则设计。
星期二查找资料解决具体的技术问题。
星期三用JAVA语言实现程序。
星期四精星课堂演示程序以及完成课程设计报告。
星期五提交程序和课程设计报告。
本组由组成
任务下达日期年月日
完成日期年月日
指导教师(签名)
学生(签名)
第一章课程设计要求
题目名称:
蜘蛛纸牌游戏
题目类型:
设计型
课程设计目的:
学会综合运用已学的JAVA知识,用面向对象的技术实现一个小型的应用程序。
实验原理:
面向对象程序分析及设计、类的灵活运用、继承技术、多态技术、异常处理、GUI程序设计等。
实验内容:
参照windows游戏蜘蛛纸牌,自己编写设计实现其功能,它具有如下一些功能:
(1)设计一个游戏界面,包括玩牌区、发牌区和回收区。
(2)纸牌以及其背景的设定。
(3)移动纸牌。
使用鼠标将较小的纸牌拖放到较大的纸牌下方,可以拖动一组纸牌,当要求这组纸牌是同一个花色,并且这一组纸牌从上到下是从大到小排列的,且不间断。
(4)回收纸牌。
当某列出现同一花色,从上到下依次是从K到A的不间组合时,这组纸牌将被回收到回收区中。
(5)发牌。
用鼠标单击发牌区,若发牌区还有剩余的纸牌,则将发出一叠纸牌共10张,依次添加到玩牌区的10列纸牌最下方,但要求这10列纸牌没有空白列。
(6)若玩家不了解游戏规则可以点击帮助获得游戏方法。
(7)级别设定。
点击“游戏”菜单中选取游戏难以级别,有3种级别,分别对应初级、中级、高级。
(8)退出游戏。
第二章设计概要
2.1功能设计
编写程序以实现游戏蜘蛛纸牌的功能。
1、设计游戏界面。
2、纸牌以及其背景的设定。
3、移动纸牌。
4、回收纸牌。
5、发牌。
6、若玩家不了解游戏规则可以点击帮助获得游戏方法。
7、级别设定。
8、退出游戏。
2.2程序流程
2.3功能分析
1.主要界面:
以下是主菜单界面的主要代码:
JMenujNewGame=newJMenu("游戏");
JMenujHelp=newJMenu("帮助");
JMenuItemjItemAbout=newJMenuItem("关于");
JMenuItemjItemOpen=newJMenuItem("开始新游戏");
JMenuItemjItemDeal=newJMenuItem("发牌");
JMenuItemjItemExit=newJMenuItem("退出");
JRadioButtonMenuItemjRMItemEasy=newJRadioButtonMenuItem("初级:
单花色");//菜单中的可选项按钮
JRadioButtonMenuItemjRMItemNormal=newJRadioButtonMenuItem("中级:
双花色");
JRadioButtonMenuItemjRMItemHard=newJRadioButtonMenuItem("高级:
四花色");
publicSpiderMenuBar(Spiderspider){
this.main=spider;
jNewGame.add(jItemOpen);
jNewGame.add(jItemDeal);
jNewGame.addSeparator();//添加划分线
jNewGame.add(jRMItemEasy);
jNewGame.add(jRMItemNormal);
jNewGame.add(jRMItemHard);
jNewGame.addSeparator();
jNewGame.add(jItemExit);
ButtonGroupgroup=newButtonGroup();//(用来获取JRadioButtonMenuItem的值)
group.add(jRMItemEasy);
group.add(jRMItemNormal);
group.add(jRMItemHard);
jHelp.add(jItemAbout);
this.add(jNewGame);
this.add(jHelp);//添加到菜单栏
以下是游戏窗口界面初始化的主要代码:
pane=this.getContentPane();//获得容器
pane.setBackground(newColor(0,112,26));//设置背景颜色
clickLabel=newJLabel();//发牌区的鼠标点击响应区域
clickLabel.setBounds(890,580,110,96);//设置响应区域大小及坐标
clickLabel.setBorder(javax.swing.BorderFactory
.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));
pane.add(clickLabel);//将响应区域添加到容器中
this.initCards();//纸牌初始化
this.randomCards();//随机分配纸牌
this.setCardsLocation();//为纸牌设置坐标位置
this.deal();//从右下角发出一叠纸牌。
游戏刚开始时,需要先发出一叠纸牌。
groundLabel=newJLabel[10];//创建背景框数组,一共有10个背景框。
intx=20;//背景框的x坐标,10个背景框是并排放置的,y坐标相等。
第一个背景框的x坐标为20。
for(inti=0;i<10;i++){//循环创建背景框,并设置其坐标大小等属性
groundLabel[i]=newJLabel();//创建背景框
groundLabel[i]
.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));//为Label设置边框
//,
//形成背景框
groundLabel[i].setBounds(x,25,71,96);//设置背景框的大小及坐标
x+=101;//相邻的背景框的x坐标差值为101。
this.pane.add(groundLabel[i]);//将背景框添加到容器中
}
this.setVisible(true);//显示窗口
2初始化纸牌及发牌操作:
初始化纸牌的主要代码(包括所有纸牌生成及存入数组,右下角发牌区纸牌初始化以及表面显示纸牌初始化):
所有纸牌的生成及存入数组代码:
publicvoidinitCards(){
//如果纸牌已被赋值,即将其从框架的面板中移去
if(cards[0]!
=null){
for(inti=0;i<104;i++){
pane.remove(cards[i]);
}
}
intn=0;
//通过难度等级,为n赋值
if(this.grade==Spider.EASY){
n=1;
}elseif(this.grade==Spider.NATURAL){
n=2;
}else{
n=4;
}
//为card赋值
for(inti=1;i<=8;i++){
for(intj=1;j<=13;j++){
cards[(i-1)*13+j-1]=newPKCard((i%n+1)+"-"+j,
this);//当n为1时,i%8的值永远是0,所以i%8+1的值永远是1,因此n为1时,创建的card的名称是1
//-1到1-13,全是黑桃。
其他等级类似。
}
}
}
//纸牌随机分配
publicvoidrandomCards(){//将纸牌的顺序打乱,否则牌号的将是从A到K的出现规律
PKCardtemp=null;
//随机生成牌号
for(inti=0;i<52;i++){
inta=(int)(Math.random()*104);
intb=(int)(Math.random()*104);
temp=cards[a];
cards[a]=cards[b];
cards[b]=temp;
}
}
右下角发牌区纸牌的初始化代码:
intx=883;//将坐标定位到右下角发牌区
inty=580;
for(inti=0;i<6;i++){//初始化右下角发牌区的纸牌,共6叠
for(intj=0;j<10;j++){
intn=i*10+j;
pane.add(cards[n]);
//将card转向背面
cards[n].turnRear();
//将card放在固定的位置上
cards[n].moveto(newPoint(x,y));
//将card的位置及相关信息存入
map.put(newPoint(x,y),cards[n]);
}
x+=10;//共6叠纸牌,最上面一叠纸牌的x坐标为883,再往下,x依次增加10
}
表面显示纸牌初始化:
x=20;//将坐标定位到上方玩牌区的左边起点,也就是第一个背景框的坐标位置
y=45;
/**初始化表面显示的纸牌*/
for(inti=10;i>5;i--){//初始化玩牌区的纸牌,共5行
for(intj=0;j<10;j++){//共10列
intn=i*10+j;//生成索引值
if(n>=104){//如果索引值超出数组下标
continue;//退出本次循环,执行外层循环
}
pane.add(cards[n]);//将索引处的纸牌添加到容器中
cards[n].turnRear();//将纸牌转向背面
cards[n].moveto(newPoint(x,y));//将纸牌放在固定的位置上
map.put(newPoint(x,y),cards[n]);//将纸牌及其坐标值存入map中
x+=101;//每两列之间的x坐标相距101个像素
}
x=20;//x坐标回到起点位置
y-=5;//主坐标向上移5个像素
}
发牌操作功能代码:
publicvoiddeal(){//发牌,指从右下角的发牌区发牌
this.setNA();
//判断10列中是否有空列
for(inti=0;i<10;i++){
if(this.getLastCardLocation(i)==null){
JOptionPane.showMessageDialog(this,"有空位不能发牌!
","提示",
JOptionPane.WARNING_MESSAGE);
return;
}
}
intx=20;
for(inti=0;i<10;i++){
PointlastPoint=this.getLastCardLocation(i);
//这张牌应“背面向上”
if(c==0){//当还没有发过牌时,玩牌区的纸牌列中,每两张纸牌之间的y坐标值相差5,
//指的是背面牌及背面牌之间以及背面牌及第一张正面牌之间的y距离
lastPoint.y+=5;
}
//这张牌应“正面向上”
else{//两张正面牌之间的y距离
lastPoint.y+=20;
}
map.remove(cards[c+i].getLocation());
cards[c+i].moveto(lastPoint);
map.put(newPoint(lastPoint),cards[c+i]);
cards[c+i].turnFront();
cards[c+i].setCanMove(true);
//将组件card移动到容器中指定的顺序索引。
this.pane.setComponentZOrder(cards[c+i],1);
Pointpoint=newPoint(lastPoint);
if(cards[c+i].getValue()==1){
intn=cards[c+i].whichColumnAvailable(point);
point.y-=240;
PKCardcard=(PKCard)this.map.get(point);
if(card!
=null&&card.isCanMove()){
this.haveFinish(n);
}
}
x+=101;
}
c+=10;
}
3纸牌移动放置操作:
//用鼠标拖动纸牌
publicvoidmouseDragged(MouseEventarg0){
if(canMove){
intx=0;
inty=0;
Pointp=arg0.getPoint();
x=p.x-point.x;
y=p.y-point.y;
this.moving(x,y);
}
}
/*
*方法:
放置纸牌
*/
publicvoidsetNextCardLocation(Pointpoint){
PKCardcard=main.getNextCard(this);
if(card!
=null){
if(point==null){
card.setNextCardLocation(null);
main.map.remove(card.getLocation());//先从HashMap中删除card
card.setLocation(card.initPoint);//为card设置新的坐标
main.map.put(card.initPoint,card);//再将card添加到HashMap中
}else{
point=newPoint(point);
point.y+=20;
card.setNextCardLocation(point);
point.y-=20;
main.map.remove(card.getLocation());
card.setLocation(point);
main.map.put(card.getLocation(),card);
card.initPoint=card.getLocation();
}
}
}
4.回收纸牌操作:
回收纸牌及过关判定功能主要代码:
publicvoidhaveFinish(intcolumn){
Pointpoint=this.getLastCardLocation(column);
PKCardcard=(PKCard)this.map.get(point);
do{
this.map.remove(point);
card.moveto(newPoint(20+finish*10,580));
//将组件移动到容器中指定的顺序索引。
pane.setComponentZOrder(card,1);
//将纸牌新的相关信息存入HashMap
this.map.put(card.getLocation(),card);
card.setCanMove(false);
point=this.getLastCardLocation(column);
if(point==null)
card=null;
else
card=this.map.get(point);
}while(card!
=null&&card.isCanMove());
finish++;
//如果8付牌全部组合成功,则显示成功的对话框
if(finish==8){
JOptionPane.showMessageDialog(this,"恭喜你,顺利通过!
","成功",
JOptionPane.PLAIN_MESSAGE);
}
if(card!
=null){
card.turnFront();
card.setCanMove(true);
}
}
}
5.帮助菜单功能的实现:
主要代码如下:
publicclassAboutDialogextendsJDialog{
JPaneljMainPanel=newJPanel();
JTabbedPanejTabbedPane=newJTabbedPane();
privateJPaneljPanel1=newJPanel();
privateJTextAreajt1=newJTextArea(
"将电脑多次分发给你的牌按照相同的花色由大至小排列起来。
直到桌面上的牌全都消失。
");
publicAboutDialog(){
setTitle("蜘蛛牌");
setSize(300,200);
setResizable(false);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
Containerc=this.getContentPane();
jt1.setSize(260,200);
jt1.setEditable(false);
jt1.setLineWrap(true);
jt1.setFont(newFont("楷体",java.awt.Font.BOLD,13));
jt1.setForeground(Color.BLUE);
jPanel1.add(jt1);
jTabbedPane.setSize(300,200);
jTabbedPane.addTab("游戏规则",null,jPanel1,null);
jMainPanel.add(jTabbedPane);
c.add(jMainPanel);
pack();
this.setVisible(true);
}
}
6.退出功能的实现:
主要代码如下:
//“退出”
jItemExit.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
main.dispose();
System.exit(0);
}
});
第三章调试分析及测试结果
通过对游戏的运行,包括移牌、发牌、开始游戏、选择等级等等。
未发现明显异常现象。
在这里:
我们将测试的结果图片贴在了下面:
进入游戏主界面:
游戏菜单:
打开帮助菜单:
拖动纸牌:
发牌以及收牌:
完成游戏:
选择难度(高级):
有空位不能发牌:
第四章设计总结
通过这次JAVA课程设计实验,我发现java作为一种面向对象的编程语言,具有可移植性高,安全,可靠等优点,最初设计时就是本着一次编写到处执行设计的。
可以开发各种应用程序和游戏。
在实验中开始我们遇到了很多问题,但小组成员一起努力查找资料,一起讨论提出各自的想法,最终把问题很好的解决掉了.这也让我们知道了团队在计算机编程小组中的重要性.它提醒着我们无论在生活中还是在以后的工作中都要记住团队的重要性。
第五章参考文献
《Java程序设计》,朱庆生,古平等著,清华大学出版社,2011,1
《Java编程》,王伟平等著,清华大学出版社,2010,5
《Java课程设计案例精编》黄晓东编著,中国水利水电出版社出版
《Java程序设计实用教程》张永常主编,电子工业出版社出版