软件综合实验报告21点游戏.docx

上传人:b****4 文档编号:6316553 上传时间:2023-05-09 格式:DOCX 页数:19 大小:161.95KB
下载 相关 举报
软件综合实验报告21点游戏.docx_第1页
第1页 / 共19页
软件综合实验报告21点游戏.docx_第2页
第2页 / 共19页
软件综合实验报告21点游戏.docx_第3页
第3页 / 共19页
软件综合实验报告21点游戏.docx_第4页
第4页 / 共19页
软件综合实验报告21点游戏.docx_第5页
第5页 / 共19页
软件综合实验报告21点游戏.docx_第6页
第6页 / 共19页
软件综合实验报告21点游戏.docx_第7页
第7页 / 共19页
软件综合实验报告21点游戏.docx_第8页
第8页 / 共19页
软件综合实验报告21点游戏.docx_第9页
第9页 / 共19页
软件综合实验报告21点游戏.docx_第10页
第10页 / 共19页
软件综合实验报告21点游戏.docx_第11页
第11页 / 共19页
软件综合实验报告21点游戏.docx_第12页
第12页 / 共19页
软件综合实验报告21点游戏.docx_第13页
第13页 / 共19页
软件综合实验报告21点游戏.docx_第14页
第14页 / 共19页
软件综合实验报告21点游戏.docx_第15页
第15页 / 共19页
软件综合实验报告21点游戏.docx_第16页
第16页 / 共19页
软件综合实验报告21点游戏.docx_第17页
第17页 / 共19页
软件综合实验报告21点游戏.docx_第18页
第18页 / 共19页
软件综合实验报告21点游戏.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

软件综合实验报告21点游戏.docx

《软件综合实验报告21点游戏.docx》由会员分享,可在线阅读,更多相关《软件综合实验报告21点游戏.docx(19页珍藏版)》请在冰点文库上搜索。

软件综合实验报告21点游戏.docx

软件综合实验报告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

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

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2