X X X X 大学《Java语言程序设计》课程设计(论文)题目:21点游戏院(系):专业班级:学号:学生姓名:指导教师:教师职称:起止时间:课程设计(论文)任务及评语目录第1章课程设计目的与要求 (1)1.1设计目的 (1)1.2实验环境 (2)1.3预备知识 (2)1.4设计要求 (2)第2章课程设计内容 (2)2.1 课题描述 (2)2.2 系统设计 (3)2.2.1功能分析 (3)2.2.2面向对象设计 (4)2.2.2类成员描述 (6)2.3程序实现 (8)2.3.1源码分析 (8)2.3.2运行结果 (11)第3章总结 (12)参考文献 (14)第1章课程设计目的与要求1.1设计目的将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。
通过课程设计,学生在下述各方面的能力应该得到锻炼:(1)进一步巩固、加深学生所学专业课程《JAVA语言教程》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。
(2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。
(3)利用所学知识,开发小型应用系统,掌握运用JAVA语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。
(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。
(5)掌握面向对象程序设计的方法。
(6)熟练掌握JAVA语言的基本语法,灵活运用各种数据类型。
(7)进一步掌握在集成环境下如何调试程序和修改程序。
1.2实验环境硬件要求能运行Windows 操作系统的微机系统。
JAVA语言应用程序开发软件使用:VJAVA 系统,或其他JAVA语言应用程序开发软件。
1.3预备知识熟悉JAVA语言程序设计的基本知识及VJAVA编辑器的使用方法。
1.4设计要求1.仔细分析设计题目,画出程序流程图,编写程序源代码。
2.积极上机调试源程序,增强编程技巧与调程能力。
3.认真书写课程设计预习报告,课程设计说明书。
4.遵守课程设计要求和机房管理制度,服从指导教师的安排,确保课程设计的顺利完成课程设计内容。
第2章课程设计内容2.1 课题描述21点有着悠久的历史。
1700年左右法国赌场就有这种21点的纸牌游戏。
1931年,当美国内华达州宣布赌博为合法活动时,21点游戏第一次公开出现在内华达州的赌场俱乐部,15年内,它取代掷骰子游戏,而一举成为非常流行的赌场庄家参与的赌博游戏。
出现在亚洲是1957年在香港第一次出现,而后迅速的发展起来,五年不到的时间发展的与牌九,麻将一同成为中国人最喜欢的三大游戏。
拥有最高点数的玩家获胜,其点数必须等于或低于21点;超过21点的玩家称为爆牌。
2点至10点的牌以牌面的点数计算,J、Q、K 每张为10点。
A可记为1点或为11点,若玩家会因A而爆牌则A可算为1 点。
当一手牌中的A算为11点时,这手牌便称为“软牌”,因为除非玩者再拿另一张牌,否则不会出现爆牌。
庄家在取得17点之前必须要牌,因规则不同会有软17点或硬17点才停牌的具体区分。
每位玩家的目的是要取得最接近21点数的牌来击败庄家,但同时要避免爆牌。
要注意的是,若玩家爆牌在先即为输,就算随后庄家爆牌也是如此。
若玩家和庄家拥有同样点数,这样的状态称为“push”,玩家和庄家皆不算输赢。
每位玩者和庄家之间的游戏都是独立的,因此在同一局内,庄家有可能会输给某些玩家,但也同时击败另一些玩家。
两张牌点数相加为21(一张A再加一张价值10点的牌)称为“二十一点”(Blackjack),拥有这副牌的玩家即自动成为赢家(除非庄家也同时持有二十一点,这种点数相同的情形就称为push)。
拥有二十一点的玩家可赢得下注筹码的1.5倍。
部份的赌场仅付给1.2倍的金额;但通常是在仅使用一副牌游玩的赌局中。
通常每次以四至六副扑克牌游玩,直至玩剩一副或一半为止,再重新洗牌。
21点小游戏是一个非常流行的益智类游戏,它不仅能娱乐,还能在娱乐中锻炼人的反应能力、逻辑思维能力,是一款寓教于乐的小游戏。
游戏的规则是:各个参与者设法使自己的牌达到总分21而不超过这个数值。
扑克牌的分值取它们的面值,A充当1或者11分,J,Q和K人头牌都是10分。
庄家VS1~7个玩家。
在开局时,包括庄家在内的所有参与者都有两张牌。
玩家可以看到他们的所有牌以及总分,而庄家有一张牌暂时是隐藏的。
接下来,只要愿意,各个玩家都有机会依次再拿一张牌。
如果是玩家的总分超过了21(称为引爆),那么这个玩家就输了。
在所有玩家都拿了额外的牌后,庄家将显示隐藏的牌。
只要庄家的总分等于或小于16,那么他就必须再拿牌。
如果庄家引爆了,那么还没有引爆的所有玩家都将获胜,引爆的玩家打成平局。
否则,将余下的各玩家的总分与庄家的总分做比较,如果玩家的总分大于庄家的总分,则玩家获胜。
如果二者的总分相同,则玩家与庄家打成平局中。
2.2 系统设计2.2.1功能分析本系统完成了21点游戏所要求的所有功能,下面是功能模块分析:1)游戏规则模块本模块显示了,这个游戏的规则,基本就运用了System.out.println;语句,没有什么特别的。
2)下注模块可以让系统重新下注、输入赌注,并且记录该局已下的总赌注,当赌注小于0时乘-1,当资金不够,会提示重新下注,下注成功后,资金减少。
3)要牌模块系统会先发前两张牌,然后牌数值记为2,并且计算机随机产生牌点,如果牌点数大于10,记为0.5,然后记录总点数发牌,随即产生牌点当大于10点记为半点,最后记录总点数。
3)游戏过程模块发最初两张牌显示玩家牌点,电脑发前两牌并显示其中一张牌,计算机连续要牌,计算机在小于16点并少于5张牌是有权要牌,显示没次牌点,计算机要牌结束,玩家后几张要牌循环起点(小局),玩家要牌前可选择加注,玩家选择不再要牌时退出当盘比赛,比较当盘比赛结果,要派程序,根据返回值而定,返回值为1,进入普通玩家牌的张数加一,牌超过5张时将D=0,作为退出当盘比赛条件,满足普通玩家发牌条件时调用发牌函数发牌,返回值为2,高级玩家,满足高级玩家发牌条件,进入高级玩家函数,返回值为3,超级玩家,D=0,作为结束当盘比赛循环结束条件,调用结果统计函数,调用该函数询问是否再玩一盘,将全局变量变0,以进入下盘时用,返回值为Y时再玩一盘,否则退出,退出后打印出比赛最终结果。
4)玩家选择模块本系统分为三个级别的玩家,普通玩家、高级玩家和超级玩家,玩家第一次登陆的时候都是从普通玩家开始,然后根据玩家级别的提升和登陆的次数增多,玩家的等级不断升高从而转变为高级玩家和超级玩家,本且系统会有一定的资金的奖励。
每个玩家登陆后都会有500元的基础资金,然后就随着玩家自己对游戏的理解和熟练程度了。
每当一个玩家登陆的时候系统会根据以前的游戏记录,判定玩家的级别,从而对玩家归类,使玩家进入到自己适合的级别。
2.2.2面向对象设计此图表示了系统所含有的模块,粗略的展示了系统所能展现的游戏过程,使玩家一样就能看见游戏的大概的方向和结果。
2.1系统功能模块图图2.2UML类图此图是本系统21点游戏总体流程,它展现了这个游戏的过程,使用户直观的看出游戏的流程规范,在没有打开游戏的时候就能清楚地看清自己需要操作的具体步骤。
xxxx 大学课程设计说明书(论文)图2.3 21点游戏总体流程图2.2.3类成员描述1.类的数据成员本程序我声明了1个类,game21,在类中我定义了构造函数,构造函数定义了初始化变量。
构造函数是一种特殊的方法主要用来在创建对象时初始化对象即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中特别的一个类可以有多个构造函数可根据其参数个数的不同或参数类型的不同来区分它们即构造函数的重载。
Java语言为类提供的构造函数可自动完成对象的初始化任务,全局对象和静态对象的构造函数在main()函数执行之前就被调用,局部静态对象的构造函数是当程序第一次执行到相应语句时才被调用。
然而给出一个外部对象的引用性声明时,并不调用相应的构造函数,因为这个外部对象只是引用在其他地方声明的对象,并没有真正地创建一个对象。
2.函数成员描述1)延时函数wait()延时函数在本系统中是控制游戏开始的时间和结束的时间的,也是用来限制玩家与计算机的思考过程的限制,使游戏不至于由于思考的时间过长而影响,游戏的进度。
学过汇编的就会知道,每条指令都占一定的时间(或者机器周期)的,如果你让机器什么都不做,即空指令的话,机器就会延时,然后你在计算好每次延时到底有多长,外面套一个循环(或者多重循环),根据你想要的延时时间即可计算出来循环的次数,延时函数基本上都是这种原理,它的参数就是用来控制循环次数的。
2)暂停函数pause()本系统中设置了暂停函数,它是使玩家更好的控制系统的,玩家可以根据自己需要的思考时间来控制游戏的进度,本系统中设置了玩家可以按任意一个键使游戏继续或者停止,并且都有相应的中文语句提示。
3)显示比赛规则的函数rules()在比赛规则函数中主要是运用了System.out.println;这条语句主要是输出本游戏的规则要领,使第一玩这个游戏的玩家了解游戏规则。
4)下注函数Bet()在下注函数中主要分为两类,一是资金足够的情况,一是资金不够的情况。
资金足够的情况我定义了一个数学运算公式:all=all+a.nGamble;并且通过a.nGamble=a.nGamble*(-1);来控制下注资金在以有的资金控制范围内,来控制资金的输入,还有减少资金的语句“a.nRMB=a.nRMB-a.nGamble”。
资金不够的情况我定义了一个提示语“cout<<"\t对不起,您资金不够,请重新下注"<<endl;”来提示玩家资金不足。
5)高级玩家vipplayer()和超级玩家superplayer()本系统中分为普通玩家、超级玩家和高级玩家三种用户类型,随着用户对系统的使用程度和玩家自身的游戏技巧来限定权限。
图2.4函数流程图2.3程序实现2.3.1源码分析/*此程序是21点小游戏,下部分是程序的主代码部分由谢晶晶设计,完成时间是2013年06月13日。
*/import java.awt.Color;import java.awt.Font;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.SwingConstants;import javax.swing.border.LineBorder;public class game21 extends JFrame {private JLabel label_2;private int number;private int sum;final JLabel label = new JLabel();final JLabel label_1 = new JLabel();public static void main(String[] args) {new game21();}public game21() {super("21点?!");getContentPane().setLayout(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);final JButton button = new JButton();button.addActionListener(new ActionListener() {public void actionPerformed(final ActionEvent arg0) {onClick();}};button.setText("出牌");button.setBounds(170, 350, 106, 28); getContentPane().add(button);label.setBorder(new LineBorder(Color.black, 1, false)); label.setHorizontalAlignment(SwingConstants.CENTER); label.setFont(new Font("", Font.BOLD, 26));label.setText("背面");label.setBounds(158, 81, 137, 153);getContentPane().add(label);label_1.setText("你已经拥有的牌:");label_1.setBounds(109, 22, 270, 45);getContentPane().add(label_1);this.setBounds(200, 300, 501, 528);this.setVisible(true);getContentPane().add(getLabel_2());}public int randNumber() {try {Thread.sleep(10);}catch (InterruptedException e) {e.printStackTrace();}return (int) (Math.random() * 10 + 1);}public void onClick() {number = this.randNumber();this.sum += number;label.setText("" + number);String strTemp = bel_1.getText();strTemp += "" + number + " ";label_1.setText(strTemp);String temp = "合计:" + sum;label_2.setText(temp);isWin();}public void isWin() {if (sum > 21) {JOptionPane.showMessageDialog(this, "你输了");clear();return;}else if (sum == 21) {JOptionPane.showMessageDialog(this, "你赢了");clear();return;}else {int i = JOptionPane.showOptionDialog(this, "是否继续?", "提示", JOptionPane.OK_CANCEL_OPTION,RMATION_MESSAGE, null, null, null);if (i == JOptionPane.OK_OPTION) {onClick();}elsereturn;}}private void clear() {label_2.setText("合计:");sum = 0;number = 0;label_1.setText("你已经拥有的牌:");}/*** return*/protected JLabel getLabel_2() {if (label_2 == null) {label_2 = new JLabel();label_2.setText("合计:");label_2.setBounds(313, 35, 66, 18);}return label_2;}}2.3.2运行结果此界面为开始界面,玩家直接点出牌就可以了。