软件综合实验报告21点游戏.docx
《软件综合实验报告21点游戏.docx》由会员分享,可在线阅读,更多相关《软件综合实验报告21点游戏.docx(19页珍藏版)》请在冰点文库上搜索。
软件综合实验报告21点游戏
综合实验报告
(2008--2009年度第1学期)
实验名称:
软件综合实验
题目:
21点游戏
院系:
计算机科学与技术系
班级:
计算0701班
组长学号:
1071220103
组长姓名:
丁炳淼
指导教师:
石敏
设计周数:
2周
成绩:
日期:
2009年1月9日
一、综合实验的目的与要求
㈠实验目的:
掌握用图解决实际问题的方法。
培养综合运用已经学过的程序设计知识,针对实际问题建立相应的数据模型的能力。
综合运用所学过的知识分析实际问题和解决问题的能力,熟练掌握一种开发平台并编写出高效、完整的实用程序。
进一步提高编程能力。
㈡实验要求:
图形用户界面包含一个含“开始”、“要牌”、“结束”三个按钮和分别代表“当前分数”和“历史最高分数”的两个标签的Panel对象,以及一个使用CardLayout布局策略的Panel对象,设其中叠放了一幅52张的扑克牌(有“红心”、“黑桃”、“草花”、“方片”四种花色,每种花色有A到K共13张牌)。
当用户点击“开始”按钮时,当前分数清零,“要牌”按钮被激活;当用户点击“要牌”按钮时,计算机在52张牌中随机跳出一张显示给用户,并将其分数添加在“当前分数”的标签中显示出来;如果当前分数超过21,则用户输掉了一局,“要牌”按钮变灰,用户不能再要牌;如果用户点击“结束”按钮,结束当前一局游戏,查看当前分数是否超过历史最高分数,是则更新历史最高分数。
二、设计正文
⑴实验题目
21点游戏
⑵程序总体结构
在同一个文件夹下由文件夹cards,存放了名为0.gif~52.gif,代表扑克的图
1、图形界面(构造函数以及布局设置,图片的加入及初始)
2、事件监听器(ActionListener和WindowListener)
3、事件处理的设计(Actionperformed和窗口时间处理)
4、main方法
⑶界面设计
用边布局管理器BorderLayout():
north设置为电脑庄家的面板comcards,作边布局BorderLayout(),从左到右面板包括标签“电脑庄家”,文本区拿到牌点数和当前总分数;south设置为玩家的面板mycards,也作作边布局BorderLayout(),从左到右面板包括标签“玩家”,文本区各次拿到牌的点数和当前总分数;west设置了介绍面板introduce,作网格布局GridLayout(3,1)放入3各文本区:
2个为介绍,最下面的为用户输入name用;east为设置分数的面版rank,作网格布局GridLayout(3,1),包含1个标签wager,作提示信息,然后为玩家当前分数和历史最高分数的文本区;中央区为一个GridLayout(1,2)网格布局,其左边再加入一个按钮面板作GridLayout(3,2),放入6个按钮,实现5个,另一个作空。
网格右边为一个CardLayout布局的cardpanel面板,初始为一张扑克的背面。
其中,文本区除introduce的text_name外都为不可写,且text_name在按钮开始后也变为不可写。
按钮有各自的用处而相互制约,部分按钮在一定时间内为不可用。
如图
⑷重要数据的数据结构设计
publicstaticintmysum=0,comsum=0,myscore=200,bestscore=200,temp;牌的点数和得分
publicstaticStringname1="";用户自定义名字
publicstaticbooleanvictory=false;是否“胜”
publicTextFieldtext_name,text_mywords1,text_mywords2,com2,com3,me2,me3,score1,
highestscore1;各种各样的文本
publicPanelcomcards,mycards,centerpanel,introduce,rank,cardpanel;面板
publicLabelwager;注释标签
publicButtonstart,onemore,next,wash,stop,over;主要按钮
publicCardLayoutcl;卡片布局
publicJButtoncard[];按钮组
⑸函数设计详细设计
publicvoidactionPerformed(ActionEvente)
包括5各按钮的事件处理,所有的操作都已经划分进按钮中:
开始按钮:
①输入名字后保存,以便在最后处理;
②初始化电脑和玩家的当前分数和牌的点数;
③初始化玩家得分;
④设置要牌、停、结束按钮可用,开始按钮不可用;
⑤名字文本区不可写入;
要牌按钮:
①随即产生一个0~51的随机数,声明一个字符串strt,将随机数转化为字符串格式给strt,用CardLayout输出这个随机数代表的扑克图;
②当牌为JQK时,点数以10输出;
③输出各张扑克点数和当前点数;
④用IF定义当当前点数大于21时,返回一个false的Boolean的victory;
⑤按钮变化
停(牌)按钮:
①设置电脑的要牌模式为当电脑分数小于玩家就要牌;
②其余近似要牌
③按钮变化;
下一轮按钮:
①初始化;
②判断victory,若true,则在“当前得分”中加10,false则减10,并显示;
③最后赋值victory为false,出去游戏bug;
④按钮变化
结束按钮:
①结束化,同最初界面;
②显示玩家当前得分
③比较得分与最高分数,输出更高者,以及游戏者名字
publicvoidwindowClosing(WindowEvente)
publicvoidwindowOpened(WindowEvente){}
publicvoidwindowActivated(WindowEvente){}
publicvoidwindowDeactivated(WindowEvente){}
publicvoidwindowClosed(WindowEvente){}
publicvoidwindowIconified(WindowEvente){}
publicvoidwindowDeiconified(WindowEvente){}
⑹难点及关键技术分析
难点:
将扑克图片装进程序中;
随机取一张扑克牌,并将其点数输出;
游戏可玩性
关键技术:
在同一个文件夹下由文件夹cards,存放了名为0.gif~52.gif,代表扑克的图,利用自定义的classResource(把图片赋值给按钮用到到的类),用card[i]=newJButton(newImageIcon(Resource.getImgResource("/cards/"+i+".gif")))把图片赋值给JButton组;并且将i转化为一个字符串stri,用cardpanel.add(card[i],stri)添加到CardLayout的卡片组中,用stri可直接调用这张牌。
随机取,用到了temp=(int)(Math.random()*100)%51,产生的0~51的数对应扑克调用CardLayout中的show(),即cl.show(cardpanel,strt)(cl为CardLayout的对象,cardpanel为放牌的面板,strt为一个字符串)再声明一个temp,用ten=temp/4+1得卡片的值(如13为k),则能输出了
注:
图片在同一个文件夹中的cards中,且黑桃A0.gif红桃A1.gif草花A2.gif方片A3.gif黑桃24.gif………………扑克背面52.gif
⑺测试结论
经过测试要求的各种功能均已实现,解决已知bug
三、综合实验总结或结论
1.实验完成的工作:
设计题目所给出的功能都已实现,并美化了用户界面
2.实验所需做的改进:
(1)因为21点游戏在各个地区都要不同的规则,而且21点游戏的电脑庄家的AI只是一个简单的方式,并非很智能化;
(2)21点游戏还存在各种赔率(普通的21点为2倍,5张牌俗称“五老虎”为3倍等等),但本程序并没实现。
四、小组详细分工
都由自己完成。
五、参考文献
叶核亚java2程序设计使用教程电子工业出版社
附录(设计流程图、程序、测试数据等)
设计流程图
程序
注:
图片在同一个文件夹中的cards中,且黑桃A0.gif红桃A1.gif草花A2.gif方片A3.gif
黑桃24.gif………………扑克背面52.gif
importjava.awt.*;
importjava.awt.event.*;
importjava.util.*;
importjavax.swing.*;
import.URL;
publicclassgame21pointextendsFrameimplementsActionListener,WindowListener
{
publicstaticintmysum=0,comsum=0,myscore=200,bestscore=200,temp;
publicstaticStringname1="";
publicstaticbooleanvictory=false;
publicTextFieldtext_name,text_mywords1,text_mywords2,com2,com3,me2,me3,score1,highestscore1;
publicPanelcomcards,mycards,centerpanel,introduce,rank,cardpanel;
publicLabelwager,nocardlabel;
publicButtonstart,onemore,next,wash,stop,over;
publicCardLayoutcl;
publicJButtoncard[];
publicgame21point()
{
super("21点游戏(无赔率版)");
cl=newCardLayout();
card=newJButton[53];
this.setSize(600,350);
this.setResizable(false);
this.setLocation(200,200);
this.setBackground(java.awt.Color.lightGray);
comcards=newPanel(newBorderLayout());
this.add(comcards,"North");
introduce=newPanel(newGridLayout(3,1));
this.add(introduce,"West");
centerpanel=newPanel(newGridLayout(1,2));
this.add(centerpanel,BorderLayout.CENTER);
rank=newPanel(newGridLayout(3,1));
this.add(rank,"East");
mycards=newPanel(newBorderLayout());
this.add(mycards,"South");
Labelcom1=newLabel("电脑庄家");
comcards.add(com1,"West");
com2=newTextField("0");
com2.setEditable(false);
comcards.add(com2);
com3=newTextField("当前分数",20);
com3.setEditable(false);
comcards.add(com3,"East");
text_mywords1=newTextField("请在开始前:
写入名字",20);
text_mywords1.setEditable(false);
introduce.add(text_mywords1);
text_mywords2=newTextField("一组多幅扑克,没有赔率");
text_mywords2.setEditable(false);
introduce.add(text_mywords2);
text_name=newTextField("name");
introduce.add(text_name);
Paneleast=newPanel(newGridLayout(3,2));
centerpanel.add(east,"Eest");
start=newButton("开始");
east.add(start);
onemore=newButton("要牌");
onemore.setEnabled(false);
east.add(onemore);
stop=newButton("停");
stop.setEnabled(false);
east.add(stop);
next=newButton("下一轮");
next.setEnabled(false);
east.add(next);
wash=newButton("");
wash.setEnabled(false);
east.add(wash);
over=newButton("结束");
over.setEnabled(false);
east.add(over);
cardpanel=newPanel(cl);
centerpanel.add(cardpanel);
card[52]=newJButton(newImageIcon(Resource.getImgResource("/cards/52.gif")));
cardpanel.add(card[52],"52");
for(inti=0;i<52;i++)
{
Stringstri;
stri=String.valueOf(i);
card[i]=newJButton(newImageIcon(Resource.getImgResource("/cards/"+i+".gif")));
cardpanel.add(card[i],stri);
}
wager=newLabel("每次下注为10分");
rank.add(wager);
Panelscore=newPanel(newFlowLayout());
rank.add(score);
score1=newTextField("当前得分:
"+200,20);
score1.setEditable(false);
score.add(score1);
Panelhighestscore=newPanel(newFlowLayout());
rank.add(highestscore);
highestscore1=newTextField("历史最高分数:
"+200+"BY"+"name",20);
highestscore1.setEditable(false);
highestscore.add(highestscore1);
Labelme1=newLabel("玩家");
mycards.add(me1,"West");
me2=newTextField("0");
me2.setEditable(false);
mycards.add(me2);
me3=newTextField("当前分数",20);
me3.setEditable(false);
mycards.add(me3,"East");
start.addActionListener(this);
onemore.addActionListener(this);
stop.addActionListener(this);
next.addActionListener(this);
over.addActionListener(this);
text_name.addActionListener(this);
this.addWindowListener(this);
this.setVisible(true);
}
publicvoidactionPerformed(ActionEvente)
{
if(e.getSource()==start)
{
name1=text_name.getText();
com2.setText("0");
com3.setText("当前分数");
me2.setText("0");
me3.setText("当前分数");
score1.setText("当前得分:
"+200);
onemore.setEnabled(true);
stop.setEnabled(true);
over.setEnabled(true);
start.setEnabled(false);
text_name.setEditable(false);
}
if(e.getSource()==onemore)
{
temp=(int)(Math.random()*100)%51;
Stringstrt;
strt=String.valueOf(temp);
cl.show(cardpanel,strt);
intten;
ten=temp/4+1;
if(ten>=10)
ten=10;
mysum+=ten;
me2.setText(me2.getText()+"+"+ten);
me3.setText("当前分数"+mysum);
if(mysum>21)
{
onemore.setEnabled(false);
stop.setEnabled(false);
next.setEnabled(true);
victory=false;
}
}
if(e.getSource()==stop)
{
while(comsum{
temp=(int)(Math.random()*100)%51;
Stringstrt;
strt=String.valueOf(temp);
cl.show(cardpanel,strt);
intten;
ten=temp/4+1;
if(ten>=10)
ten=10;
comsum+=ten;
com2.setText(com2.getText()+"+"+ten);
com3.setText("当前分数"+comsum);
if(comsum>21)
{
victory=true;
}
}
next.setEnabled(true);
onemore.setEnabled(false);
}
if(e.getSource()==next)
{
mysum=comsum=0;
com2.setText("0");
com3.setText("当前分数");
me2.setText("0");
me3.setText("当前分数");
score1.setText("0");
onemore.setEnabled(true);
stop.setEnabled(true);
over.setEnabled(true);
wash.setEnabled(true);
if(victory==true)
myscore+=10;
if(victory==false)
myscore-=10;
score1.setText("当前得分:
"+myscore);
next.setEnabled(false);
victory=false;
}
if(e.getSource()==over)
{
mysum=comsum=0;
start.setEnabled(true);
over.setEnabled(false);
onemore.setEnabled(false);
stop.setEnabled(false);
over.setEnabled(false);
wash.setEnabled(false);
score1.setText("当前得分:
"+myscore);
if(myscore>bestscore)
highestscore1.setText("历史最高分数"+myscore+"BY"+name1);
text_name.setEditable(true);
}
}
publicvoidwindowClosing(WindowEvente)
{
if(e.getSource()==nocard)
nocard.setVisible(false);
elseSystem.exit(0);
}
publicvoidwindowOpened(WindowEvente){}
publicvoidwindowActivated(WindowEvente){}
publicvoidwindowDeactivated(WindowEvente){}
publicvoidwindowClosed(WindowEvente){}
publicvoidwindowIconified(WindowEvente){}
publicvoidwindowDeiconified(WindowEvente){}
publicstaticvoidmain(String[]args)
{
newgame21p