JAVA课程设计21点扑克牌
更新时间:2023-06-06 22:57:01 阅读量:1 实用文档 文档下载
- JAVA课程设计总结推荐度:
- 相关推荐
基于JAVA的21点扑克牌游戏的课程设计
通信专业课程设计一(论文)
太原科技大学
课 程 设 计(论 文)
设计(论文)题目:基于JAVA的21点扑克牌
姓 名 学 号 班 级 学 院 指导教师
2011年 12 月 23日
基于JAVA的21点扑克牌游戏的课程设计
太原科技大学课程设计(论文)任务书
学院(直属系): 时间: 2011年 月 日
基于JAVA的21点扑克牌游戏的课程设计
目 录
第一章 绪论 ............................................................. - 4 - 1.1 JAVA工作平台的简介 ................................................. - 4 - 1.2 本次设计的主要内容 ................................................. - 4 - 第二章 设计任务的分析 .................................................. - 5 - 2.1 二十一点游戏介绍 .................................................. - 5 - 2.2 实现以下功能: .................................................... - 5 - 第四章 程序的图形结果及分析 ............................................ - 10 - 第五章 小结 ........................................................... - 16 - 参考文献 ............................................................... - 17 - 附录 ................................................................... - 18 -
基于JAVA的21点扑克牌游戏的课程设计
基于JAVA的点扑克牌设计
第一章 绪论
1.1 JAVA工作平台的简介
Java不依赖平台的特点使得它受到广泛的关注,Java已成为网络时代最重要的语言之一。Java 语言不仅是一门正在被广泛使用的编程语言,而且已成为软件设计开发者应当掌握的一门基础语言。目前,很多新的技术领域都涉及Java语言,国内外许多大学已将Java语言列入了本科教学计划,掌握Java已经成为共识。Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
1.2 本次设计的主要内容
首先是JAVA语言的初级编程。其次JAVA语言的21点扑克牌的编程及设计。还有JAVA平台软件eclipse的使用。并且使用软件eclipse对21点游戏进行编程,设计游戏算法,实现游戏功能。本次设计的主要难点1. 21点游戏的基本功能的实现。2. 程序中胜负的判别方法。3. 递归法的理解与使用。
基于JAVA的21点扑克牌游戏的课程设计
第二章 设计任务的分析
2.1 二十一点游戏介绍
21点游戏是一个古老的扑克游戏,游戏的规则是:各个 参与者设法使自己的牌达到总分21而不超过这个数值。扑克牌的分值取它们的面值,A充当1或者11分,J,Q和K人头牌都是10分。
庄家VS1~7个玩家。在开局时,包括庄家在内的所有参与者都有两张牌。玩家可以看到他们的所有牌以及总分,而庄家有一张牌暂时是隐藏的。接下来,只要愿意,各个玩家都有机会依次再拿一张牌。如果是玩家的总分超过了21(称为引爆),那么这个玩家就输了。在所有玩家都拿了额外的牌后,庄家将显示隐藏的牌。只要庄家的总分等于或小于16,那么他就必须再拿牌。如果庄家引爆了,那么还没有引爆的所有玩家都将获胜,引爆的玩家打成平局。否则,将余下的各玩家的总分与庄家的总分做比较,如果玩家的总分大于庄家的总分,则玩家获胜。如果二者的总分相同,则玩家与庄家打成平局中。
2.2 实现以下功能:
1) 洗牌; 2) 发牌;
3) 隐藏或显示牌; 4) 计算总分; 5) 判断胜负。
基于JAVA的21点扑克牌游戏的课程设计
第三章 本次设计的重点及难点
图3.1 21点流程图
基于JAVA的21点扑克牌游戏的课程设计
游戏胜负的判别方法: 本方法考虑了鬼牌的因素,由于所用到的扑克牌为54张,将他们存放在数组,且通过数组的下标来保证牌的唯一。由于数组中的计数方式是从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;i<num;i++){
if(a[i]==14||a[i]==15)joker_a=true;
else sum_a+=a[i];
if(b[i]==14||b[i]==15)joker_b=true; else sum_b+=b[i]; }
if(joker_a)if(sum_a<8)sum_a+=13;//鬼牌可以任意1-13 else if(sum_a<21)sum_a=21;
if(joker_b)if(sum_b<8)sum_b+=13; else if(sum_b<21)sum_b=21;
if(sum_a>21&&sum_b<=21)return -1; if(sum_a<=21&&sum_b>21)return 1;
if(Math.abs(sum_a-21)<Math.abs(sum_b-21)) return 1;
else if(Math.abs(sum_a-21)==Math.abs(sum_b-21)) return 0;
else //if(Math.abs(sum_a-21)>Math.abs(sum_b-21)) return -1; } }
if(judge(human,computer,n)==1) System.out.println("\n你赢了!"); else 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点扑克牌游戏的课程设计
当玩家抽到鬼牌时,鬼牌可以顶替1-13任意大小的牌,抽到鬼牌时的判别方法为,鬼牌存在,并且其余牌总和小于8,那么现在加上13就是总和,如果除了鬼牌其余牌大于8小于21,那么总和就是21,电脑和人判断方法一样。最后判断大小,通过返回1,0,-1,分别表示人赢,平局,电脑赢;如:人的大于21并且电脑小于等于21,则返回-1,那么电脑赢,否则返回1,即表示人嬴;当人和电脑的牌都大于21时,通过将人和电脑的牌都减去21取绝对值的方法,然后比较得到的值,如果人得到的值小则返回 1,即人赢;相等则返回0,即平局;电脑的值小则返回-1,即电脑赢。
递归法的使用: 本方法为了避免牌的重复而使用了递归法,其中的程序为: int nextOne(){//用递归确保返回的牌没有重复
int n=(int)(Math.random()*54);//通过随机的方法产生数
if(cards[n]==0){//如果产生的那个数字曾经没有用过那么就用,否则重新产生 cards[n]=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。在调用本方法时,首先 通过方法int n=(int)(Math.random()*54)获得元素的下标n,然后通过if(cards[n]==0)判断,如果该位置的元素为0,则这个n代表的牌没有使用过的的,将它在数组所指的牌从0赋值为1后,将这个牌的下标取模后返回;否则,这张牌是被使用过的, 通过 return nextOne(); 返回到本方法的开始位置,重新执行一遍本方法,直到随机出的n所代表的牌,没有被使用过的牌 ,然后将n代表的牌返回后跳出本方法,继续程序的运行。
基于JAVA的21点扑克牌游戏的课程设计
表3.1 程序中方法和类的说明
基于JAVA的21点扑克牌游戏的课程设计
第四章 程序的图形结果及分析
程序分析
本程序没有采用传统的21点的52张牌的规则,而是采用了54张牌全用的方法,大小鬼牌也带了进去,但鬼牌可以表示1-13的任意大小具体情况可有玩家自己决定,当玩家手里牌的总分小于等于8时,若抽到鬼牌可以顶替13,当玩家手中的牌大于8时,鬼牌可以成为任意一个,并且大小鬼牌作用相同。在游戏中为了防止抽到重复的牌而采用了将牌存放在数组中,把没用过的牌在数组中赋值为0.用过的牌赋值为1,且通过递归方法来更好的避免了牌的重复。即所有牌的被定义在包含54个元素,且所有元素为0的数组中,即所有的牌的都通过数组的下标n表示,且在数组中代表的元素被赋值为0,当这张牌被使用时,通过元素的下标,将此位置的元素从0改为1。在调用本方法时,首先 通过方法int n=(int)(Math.random()*54)获得元素的下标n,然后通过if(cards[n]==0)判断,如果该位置的元素为0,则这个n代表的牌没有使用过的的,将它在数组所指的牌从0赋值为1后,将这个牌的下标取模后返回;否则,这张牌是被使用过的, 通过 return nextOne(); 返回到本方法的开始位置,重新执行一遍本方法,直到随机出的n所代表的牌,没有被使用过的牌 ,然后将n代表的牌返回后跳出本方法,继续程序的运行。本程序也运用了比较简单的数组结构。数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。一个数组中的所有元素具有相同的数据类型。当然,当数据类型为 Variant 时,各个元素能够包含不同种类的数据(对象、 字符串 、数值等等)。
基于JAVA的21点扑克牌游戏的课程设计
图4.1 程序运行结果
图4.2 程序运行结果
基于JAVA的21点扑克牌游戏的课程设计
程序中的部分注释:
1. public void start(){//开始游戏
System.out.println("*************************************");
System.out.println("开始游戏!");
int n=3;
for(int i=0;i<3;i++){//电脑和玩家先各抽3张
computer[i]=nextOne();
human[i]=nextOne(); }
while(n<5){//牌数小于5时询问是否再要牌
show(human,n,1);//显示现在玩家的牌面
if(ask(human,n)){ //如果玩家要牌 computer[n]=nextOne();//电脑获得一张牌 human[n]=nextOne();//玩家获得一张牌 n++;//n的值自动加1 }
else break;////如果不选择加牌则跳出本循环 }
基于JAVA的21点扑克牌游戏的课程设计
2. int nextOne(){//用递归确保返回的牌没有重复
int n=(int)(Math.random()*54);//通过随机的方法产生数
if(cards[n]==0){//如果产生的那个数字曾经没有用过那么就用,否则重新产生
cards[n]=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开始计数的 所以加1 0--12为13张1组牌,12-25下一组... 以此类推,共4组到51号牌 }
else return nextOne();//重新随机产生 }
基于JAVA的21点扑克牌游戏的课程设计
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;i<num;i++){//这里把电脑和人的牌总和加起来,如果有鬼牌就把joker_a或joker_b设为true,再进一步判断
if(a[i]==14||a[i]==15)joker_a=true;//14为小鬼、15为大鬼
else sum_a+=a[i];//取和
if(b[i]==14||b[i]==15)joker_b=true;
else sum_b+=b[i]; }
if(joker_a)if(sum_a<8)sum_a+=13;//鬼牌可以任意1-13,如果鬼牌存在,并且其余牌总和小于8,那么现在加上13就是总和
else if(sum_a<21)sum_a=21;//如果除了鬼牌其余牌大于8小于21,那么总和就是21
if(joker_b)if(sum_b<8)sum_b+=13;//电脑和人判断方法一样
else if(sum_b<21)sum_b=21;
基于JAVA的21点扑克牌游戏的课程设计
if(sum_a>21&&sum_b<=21)return -1;//最后判断大小,如果人的大于21并且电脑小于等于21那么电脑赢
if(sum_a<=21&&sum_b>21)return 1;//否则人赢
if(Math.abs(sum_a-21)<Math.abs(sum_b-21))
return 1;//如果人的总和减去21然后取绝对值比电脑的小,那么人赢
else if(Math.abs(sum_a-21)==Math.abs(sum_b-21))
return 0;//一样的话平局
else //if(Math.abs(sum_a-21)>Math.abs(sum_b-21))
return -1;//否则电脑赢
基于JAVA的21点扑克牌游戏的课程设计
第五章 小结
本次课程设计使我学会了许多的知识,首先就是本次设计所使用的数组结构,数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。数组属于构造数据类型。其次就是设计中的一些过程如利用递归法来使牌没有重复,还有牌的大小的判别方法等许多内容。
在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前!
基于JAVA的21点扑克牌游戏的课程设计
参考文献
[1] 谭浩强. JAVA程序设计教程[M].北京:北京工业大学出版社,2001. 24-28 [2] 陈维新. JAVA面向对象程序设计[M].北京:国防科技大学出版社,1998. 33-35 [3] 林小茶. JAVA编程思想[M].北京:北京航空学院出版社,2003. 105-108 [4] 王克宏. JAVA技术教程[M].北京:中国信息科学出版社,1995. 63-66 [5] 吕志勇. JAVA核心技术[M].北京:北京航空学院出版社,1996. 155-158
基于JAVA的21点扑克牌游戏的课程设计
附录
import java.util.*;
class Play21{
int[] cards,computer,human;//定义一副54张牌,电脑5张,玩家5张 Scanner sr=new Scanner(System.in); public Play21(){ cards=new int[54];
Arrays.fill(cards,0);//54张牌全赋值零,一旦某一张牌被用了就赋1 computer=new int[5]; Arrays.fill(computer,0); human=new int[5]; 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.println("开始游戏!"); int n=3;
for(int i=0;i<3;i++){//电脑和玩家先各抽3张 computer[i]=nextOne(); human[i]=nextOne(); }
while(n<5){//牌数小于5时询问是否再要牌 show(human,n,1);//显示现在玩家的牌面 if(ask(human,n)){
computer[n]=nextOne(); human[n]=nextOne(); n++; }
else break; }
show(human,n,1); show(computer,n,0);
if(judge(human,computer,n)==1) System.out.println("\n你赢了!"); else if(judge(human,computer,n)==0)
基于JAVA的21点扑克牌游戏的课程设计
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)+":电脑现在的牌是:"); for(int i=0;i<num;i++){
if(a[i]==1){System.out.print("A ");continue;} if(a[i]==11){System.out.print("J ");continue;} if(a[i]==12){System.out.print("Q ");continue;} if(a[i]==13){System.out.print("K ");continue;} if(a[i]==14){System.out.print("小鬼 ");continue;} if(a[i]==15){System.out.print("大鬼 ");continue;} System.out.print(a[i]+" "); } }
boolean ask(int[] a,int num){
System.out.println("\n还抽一张?Y/N"); String ch=sr.nextLine();
if(!ch.equals("n")&&!ch.equals("N")) return true; else return false; }
int nextOne(){//用递归确保返回的牌没有重复 int n=(int)(Math.random()*54); if(cards[n]==0){ cards[n]=1; if(n==52) return 14; else if(n==53) return 15;
else return n%13+1; }
else return nextOne(); }
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;i<num;i++){
if(a[i]==14||a[i]==15)joker_a=true;
else sum_a+=a[i];
基于JAVA的21点扑克牌游戏的课程设计
if(b[i]==14||b[i]==15)joker_b=true; else sum_b+=b[i]; }
if(joker_a)if(sum_a<8)sum_a+=13;//鬼牌可以任意1-13 else if(sum_a<21)sum_a=21; if(joker_b)if(sum_b<8)sum_b+=13; else if(sum_b<21)sum_b=21; if(sum_a>21&&sum_b<=21)return -1; if(sum_a<=21&&sum_b>21)return 1;
if(Math.abs(sum_a-21)<Math.abs(sum_b-21)) return 1;
else if(Math.abs(sum_a-21)==Math.abs(sum_b-21)) return 0;
else //if(Math.abs(sum_a-21)>Math.abs(sum_b-21)) return -1; } }
public class Test{
public static void main (String[] args) { Play21 p=new Play21();
Scanner sr=new Scanner(System.in); String ch="y"; while(true){ p.start();
System.out.println("再来一局?Y/N"); ch=sr.nextLine();
if(!ch.equals("n")&&!ch.equals("N")) p.clear(); else break; } } }
正在阅读:
JAVA课程设计21点扑克牌06-06
2019-2020学年八年级数学下册 19.3 矩形 菱形 正方形(第1课时)教案(新版)沪科版 doc09-20
2017年人教版中考英语八年级下册教材同步复习题-综合达标测试01-18
我做了一个梦作文800字06-17
我最想养的小动物作文400字06-17
小学生暴雨优秀作文06-12
我们的班级作文600字07-05
小学蒲公英优秀作文06-15
《遇见星期二》经典读后感10篇12-12
民商法原理复习题(含答案)05-03
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 扑克牌
- 课程
- 设计
- JAVA
- 2009年度领导班子述职述廉报告
- 2015年八年级地理下册《第七章 第二节 澳门特别行政区的旅游文化特色》导学案(无答案)(新版)湘教版
- 白色发光二极管用荧光粉研究进展(1)
- 建筑装饰工程施工合同范本
- 王阳明学说的现实意义和价值
- 幼儿园大班美术教学计划
- 软件需求评审会规范
- 传感器与检测技术的理论基础
- 2015年初三麓山国际实验学校期中考试英语试卷
- 2009年新东方考研英语笔记大总结
- 中国煤层气勘探开发技术进展浅析
- 2014年高考完型高频单词
- 宽阻带阶跃阻抗发夹线带通滤波器设计
- 成套低压电容补偿柜
- 《风筝》教学设计和反思
- 微机防误系统总结
- 让“展示”演绎课堂的精彩
- 直击双卫2009年临床执业医师考试辅导
- Two- and Three-Dimensional Smectic Ordering of Single-Handed Helical Polymers
- 家装部外包合作协议