版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、通信专业课程设计一(论文) 太原科技大学太原科技大学 课课 程程 设设 计(论计(论 文)文) 设计设计( (论文论文) )题目:基于题目:基于 javajava 的的 2121 点扑克牌点扑克牌 姓姓 名名 学学 号号 班班 级级 学学 院院 指导教师指导教师 2011 年 12 月 23 日 太原科技大学课程设计(论文)任务书 学院(直属系): 时间: 2011 年 月 日 学 生 姓 名指 导 教 师 设计(论文)题目基于 java 的 21 点扑克牌游戏设计 主要研 究内容 1.java 语言的初级编程。 2.java 语言的 21 点扑克牌的编程及设计。 3.java 平台软件 ec
2、lipse 的使用。 研究方法 使用软件 eclipse 对 21 点游戏进行编程,设计游戏算法,实现游 戏功能。 主要技术 指标(或研 究目标) 1. 21 点游戏的基本功能的实现。 2. 程序中胜负的判别方法。 3. 递归法的理解与使用。 教研室意 见 教研室(负责人)签字: 年 月 日 邸伟:基于 java 的 21 点设计 - 3 - 目 录 第一章 绪论 .- 4 - 1.1 java 工作平台的简介.- 4 - 1.2 本次设计的主要内容 .- 4 - 第二章 设计任务的分析 .- 5 - 2.1 二十一点游戏介绍.- 5 - 2.2 实现以下功能:.- 5 - 第四章 程序的图形
3、结果及分析 .- 10 - 第五章 小结 .- 16 - 参考文献 .- 17 - 附录 .- 18 - 邸伟:基于 java 的 21 点设计 - 4 - 基于 java 的点扑克牌设计 第一章 绪论 1.1 java 工作平台的简介 java 不依赖平台的特点使得它受到广泛的关注,java 已成为网络时代最重要的语言 之一。java 语言不仅是一门正在被广泛使用的编程语言,而且已成为软件设计开发者应 当掌握的一门基础语言。目前,很多新的技术领域都涉及 java 语言,国内外许多大学已 将 java 语言列入了本科教学计划,掌握 java 已经成为共识。java 是一种可以撰写跨平 台应用软
4、件的面向对象的程序设计语言,是由 sun microsystems 公司于 1995 年 5 月推 出的 java 程序设计语言和 java 平台(即 javase, javaee, javame)的总称。java 技术 具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人 pc、数据中心、游 戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。 在全球云计算和移动互联网的产业环境下,java 更具备了显著优势和广阔前景。 1.2 本次设计的主要内容 首先是 java 语言的初级编程。其次 java 语言的 21 点扑克牌的编程及设计。还有 java 平台软件
5、 eclipse 的使用。并且使用软件 eclipse 对 21 点游戏进行编程,设计游戏 算法,实现游戏功能。本次设计的主要难点 1. 21 点游戏的基本功能的实现。2. 程序中 胜负的判别方法。3. 递归法的理解与使用。 邸伟:基于 java 的 21 点设计 - 5 - 第二章 设计任务的分析 2.1 二十一点游戏介绍 21 点游戏是一个古老的扑克游戏,游戏的规则是:各个 参与者设法使自己的牌达到 总分 21 而不超过这个数值。扑克牌的分值取它们的面值,a 充当 1 或者 11 分,j,q 和 k 人头牌都是 10 分。 庄家 vs17 个玩家。在开局时,包括庄家在内的所有参与者都有两张
6、牌。玩家可以 看到他们的所有牌以及总分,而庄家有一张牌暂时是隐藏的。接下来,只要愿意,各个 玩家都有机会依次再拿一张牌。如果是玩家的总分超过了 21(称为引爆),那么这个玩家 就输了。在所有玩家都拿了额外的牌后,庄家将显示隐藏的牌。只要庄家的总分等于或 小于 16,那么他就必须再拿牌。如果庄家引爆了,那么还没有引爆的所有玩家都将获胜, 引爆的玩家打成平局。否则,将余下的各玩家的总分与庄家的总分做比较,如果玩家的 总分大于庄家的总分,则玩家获胜。如果二者的总分相同,则玩家与庄家打成平局中。 2.2 实现以下功能: 1) 洗牌; 2) 发牌; 3) 隐藏或显示牌; 4) 计算总分; 5) 判断胜负
7、。 邸伟:基于 java 的 21 点设计 - 6 - 第三章 本次设计的重点及难点 图 3.1 21 点流程图 给玩家发最初的三张牌,并显 示出来 向玩家发额外的 牌并显示牌和总分 显示电脑的牌 平局 给电脑发最初的三张牌 并显示牌和总分 玩家需要额外 的牌? 电脑需要额 外的牌? 向电脑发额外的 牌并显示牌和总分 电脑引爆? 玩家赢 玩家引爆? 玩家总分电 脑? 洗牌 n y y n y y n n 玩家引爆? 玩家输 yn 玩家赢 玩家输 邸伟:基于 java 的 21 点设计 - 7 - 游戏胜负的判别方法: 本方法考虑了鬼牌的因素,由于所用到的扑克牌为 54 张, 将他们存放在数组,
8、且通过数组的下标来保证牌的唯一。由于数组中的计数方式是从 0 开始的,所以第 0-12 号为 13 张 1 组牌,12-25 号为下一组.以此类推,共 4 组到 51 号牌,所以第 52 号和 53 号及为鬼牌,且他们的作用是一样的。 int judge(int a,int b,int num)/判断电脑和玩家谁的点数更接近 21,如果有鬼牌就另行判 断 int sum_a=0,sum_b=0; boolean joker_a=false,joker_b=false; for(int i=0;inum;i+) if(ai=14|ai=15)joker_a=true; else sum_a+=a
9、i; if(bi=14|bi=15)joker_b=true; else sum_b+=bi; if(joker_a)if(sum_a8)sum_a+=13;/鬼牌可以任意 1-13 else if(sum_a21)sum_a=21; if(joker_b)if(sum_b8)sum_b+=13; else if(sum_b21 if(sum_a21)return 1; if(math.abs(sum_a-21)math.abs(sum_b-21) return -1; if(judge(human,computer,n)=1) system.out.println(n 你赢了!); else
10、 if(judge(human,computer,n)=0) system.out.println(n 平局!); else if(judge(human,computer,n)=-1) system.out.println(n 你输了!); system.out.println(*); 邸伟:基于 java 的 21 点设计 - 8 - 当玩家抽到鬼牌时,鬼牌可以顶替 1-13 任意大小的牌,抽到鬼牌时的判别方法为, 鬼牌存在,并且其余牌总和小于 8,那么现在加上 13 就是总和,如果除了鬼牌其余牌大 于 8 小于 21,那么总和就是 21,电脑和人判断方法一样。最后判断大小,通过返回 1,
11、0,-1,分别表示人赢,平局,电脑赢;如:人的大于 21 并且电脑小于等于 21,则返 回-1,那么电脑赢,否则返回 1,即表示人嬴;当人和电脑的牌都大于 21 时,通过将人 和电脑的牌都减去 21 取绝对值的方法,然后比较得到的值,如果人得到的值小则返回 1,即人赢;相等则返回 0,即平局;电脑的值小则返回-1,即电脑赢。 递归法的使用: 本方法为了避免牌的重复而使用了递归法,其中的程序为: int nextone()/用递归确保返回的牌没有重复 int n=(int)(math.random()*54);/通过随机的方法产生数 if(cardsn=0)/如果产生的那个数字曾经没有用过那么就
12、用,否则重新产生 cardsn=1;/用过的赋值为 1 if(n=52)/如果 n 的值为 52 return 14;/返回的值为 14 else if(n=53)/如果 n 的值为 53 return 15;/返回的值为 15 else return n%13+1;/这个数对 13 取模然后加 1 就是产生的牌 else return nextone();/重新随机产生 所有牌的被定义在包含 54 个元素,且所有元素为 0 的数组中,即所有的牌的都通过 数组的下标 n 表示,且在数组中代表的元素被赋值为 0,当这张牌被使用时,通过元素的 下标,将此位置的元素从 0 改为 1。在调用本方法时,
13、首先 通过方法 int n=(int) (math.random()*54)获得元素的下标 n,然后通过 if(cardsn=0)判断,如果该位置的元 素为 0,则这个 n 代表的牌没有使用过的的,将它在数组所指的牌从 0 赋值为 1 后,将这 个牌的下标取模后返回;否则,这张牌是被使用过的, 通过 return nextone(); 返 回到本方法的开始位置,重新执行一遍本方法,直到随机出的 n 所代表的牌,没有被使 用过的牌 ,然后将 n 代表的牌返回后跳出本方法,继续程序的运行。 邸伟:基于 java 的 21 点设计 - 9 - 表 3.1 程序中方法和类的说明 类名方法名描述 pla
14、y21start() 游戏开始 play21clear() 数组清零开始计数 play21show() 显示玩家或电脑的牌 play21ask() 询问玩家或电脑是否要牌 play21nextone() 通过迭代的方式获得牌 play21judge() 对比玩家和电脑的牌的大小 testmain() 程序的入口方法,通过这里 开始游戏 邸伟:基于 java 的 21 点设计 - 10 - 第四章 程序的图形结果及分析 程序分析 本程序没有采用传统的 21 点的 52 张牌的规则,而是采用了 54 张牌全用的方法,大 小鬼牌也带了进去,但鬼牌可以表示 1-13 的任意大小具体情况可有玩家自己决定
15、,当玩 家手里牌的总分小于等于 8 时,若抽到鬼牌可以顶替 13,当玩家手中的牌大于 8 时,鬼 牌可以成为任意一个,并且大小鬼牌作用相同。在游戏中为了防止抽到重复的牌而采用 了将牌存放在数组中,把没用过的牌在数组中赋值为 0.用过的牌赋值为 1,且通过递归 方法来更好的避免了牌的重复。即所有牌的被定义在包含 54 个元素,且所有元素为 0 的 数组中,即所有的牌的都通过数组的下标 n 表示,且在数组中代表的元素被赋值为 0,当 这张牌被使用时,通过元素的下标,将此位置的元素从 0 改为 1。在调用本方法时,首先 通过方法 int n=(int)(math.random()*54)获得元素的下
16、标 n,然后通过 if(cardsn=0)判 断,如果该位置的元素为 0,则这个 n 代表的牌没有使用过的的,将它在数组所指的牌从 0 赋值为 1 后,将这个牌的下标取模后返回;否则,这张牌是被使用过的, 通过 return nextone(); 返回到本方法的开始位置,重新执行一遍本方法,直到随机出的 n 所代表的牌,没有被使用过的牌 ,然后将 n 代表的牌返回后跳出本方法,继续程序的 运行。本程序也运用了比较简单的数组结构。数组是在程序设计中,为了处理方便, 把 具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据 元素的集合称为数组。数组属于构造数据类型。一个数组
17、可以分解为多个数组元素,这 些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可 分为数值数组、字符数组、指针数组、结构数组等各种类别。一个数组中的所有元素具 有相同的数据类型。当然,当数据类型为 variant 时,各个元素能够包含不同种类的数 据(对象、 字符串 、数值等等) 。 邸伟:基于 java 的 21 点设计 - 11 - 图 4.1 程序运行结果 图 4.2 程序运行结果 邸伟:基于 java 的 21 点设计 - 12 - 程序中的部分注释: 1. public void start()/开始游戏 system.out.println(*); syst
18、em.out.println(开始游戏!); int n=3; for(int i=0;i3;i+)/电脑和玩家先各抽 3 张 computeri=nextone(); humani=nextone(); while(n5)/牌数小于 5 时询问是否再要牌 show(human,n,1);/显示现在玩家的牌面 if(ask(human,n) /如果玩家要牌 computern=nextone();/电脑获得一张牌 humann=nextone();/玩家获得一张牌 n+;/n 的值自动加 1 else break;/如果不选择加牌则跳出本循环 邸伟:基于 java 的 21 点设计 - 13
19、- 2. int nextone()/用递归确保返回的牌没有重复 int n=(int)(math.random()*54);/通过随机的方法产生数 if(cardsn=0)/如果产生的那个数字曾经没有用过那么就用,否则重新产生 cardsn=1;/用过的赋值为 1 if(n=52)/如果 n 的值为 52 return 14;/返回的值为 14 else if(n=53)/如果 n 的值为 53 return 15;/返回的值为 15 else return n%13+1;/这个数对 13 取模然后加 1 就是产生的牌,正常情况下,除 13 后剩下的牌就是牌的值 但数组是从 0 开始计数的
20、所以加 1 0-12 为 13 张 1 组牌,12-25 下一组. 以此类推,共 4 组到 51 号牌 else return nextone();/重新随机产生 邸伟:基于 java 的 21 点设计 - 14 - 3. int judge(int a,int b,int num)/判断电脑和玩家谁的点数更接近 21,如果有鬼牌就另行 判断 int sum_a=0,sum_b=0;/设置两个变量为了计数 boolean joker_a=false,joker_b=false;/分别代表人和电脑是否有鬼牌,true 代表有 for(int i=0;inum;i+)/这里把电脑和人的牌总和加起来
21、,如果有鬼牌就把 joker_a 或 joker_b 设为 true,再进一步判断 if(ai=14|ai=15)joker_a=true;/14 为小鬼、15 为大鬼 else sum_a+=ai;/取和 if(bi=14|bi=15)joker_b=true; else sum_b+=bi; if(joker_a)if(sum_a8)sum_a+=13;/鬼牌可以任意 1-13,如果鬼牌存在,并且其余牌总和 小于 8,那么现在加上 13 就是总和 else if(sum_a21)sum_a=21;/如果除了鬼牌其余牌大于 8 小于 21,那么总和就是 21 if(joker_b)if(su
22、m_b8)sum_b+=13;/电脑和人判断方法一样 else if(sum_b21/最后判断大小,如果人的大于 21 并且电脑小于等 于 21 那么电脑赢 if(sum_a21)return 1;/否则人赢 if(math.abs(sum_a-21)math.abs(sum_b-21) return -1;/否则电脑赢 邸伟:基于 java 的 21 点设计 - 16 - 第五章 小结 本次课程设计使我学会了许多的知识,首先就是本次设计所使用的数组结构,数组 是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的 一种形式。这些按序排列的同类数据元素的集合称为数组。数
23、组属于构造数据类型。其 次就是设计中的一些过程如利用递归法来使牌没有重复,还有牌的大小的判别方法等许 多内容。 在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂 得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心 理上的不良情绪。因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到 生活中,不畏艰难,勇往直前! 邸伟:基于 java 的 21 点设计 - 17 - 参考文献 1 谭浩强. java 程序设计教程m.北京:北京工业大学出版社,2001. 24-28 2 陈维新. java 面向对象程序设计m.北京:国防科技大学出版社,19
24、98. 33-35 3 林小茶. java 编程思想m.北京:北京航空学院出版社,2003. 105-108 4 王克宏. java 技术教程m.北京:中国信息科学出版社,1995. 63-66 5 吕志勇. java 核心技术m.北京:北京航空学院出版社,1996. 155-158 邸伟:基于 java 的 21 点设计 - 18 - 附录 import java.util.*; class play21 int cards,computer,human;/定义一副 54 张牌,电脑 5 张,玩家 5 张 scanner sr=new scanner(system.in); public p
25、lay21() cards=new int54; arrays.fill(cards,0);/54 张牌全赋值零,一旦某一张牌被用了就赋 1 computer=new int5; arrays.fill(computer,0); human=new int5; arrays.fill(human,0); public void clear() arrays.fill(cards,0); arrays.fill(computer,0); arrays.fill(human,0); public void start() system.out.println(*); system.out.prin
26、tln(开始游戏!); int n=3; for(int i=0;i3;i+)/电脑和玩家先各抽 3 张 computeri=nextone(); humani=nextone(); while(n5)/牌数小于 5 时询问是否再要牌 show(human,n,1);/显示现在玩家的牌面 if(ask(human,n) computern=nextone(); humann=nextone(); n+; else break; show(human,n,1); show(computer,n,0); if(judge(human,computer,n)=1) system.out.printl
27、n(n 你赢了!); else if(judge(human,computer,n)=0) 邸伟:基于 java 的 21 点设计 - 19 - system.out.println(n 平局!); else if(judge(human,computer,n)=-1) system.out.println(n 你输了!); system.out.println(*); void show(int a,int num,int c) if(c=1)system.out.println(n+(num-2)+:你现在的牌是:); else system.out.println(n+(num-2)+:
28、电脑现在的牌是:); for(int i=0;inum;i+) if(ai=1)system.out.print(a );continue; if(ai=11)system.out.print(j );continue; if(ai=12)system.out.print(q );continue; if(ai=13)system.out.print(k );continue; if(ai=14)system.out.print(小鬼 );continue; if(ai=15)system.out.print(大鬼 );continue; system.out.print(ai+ ); boolean ask(int a,int num)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论