JAVA课程设计21点扑克牌

更新时间:2023-06-06 22:57:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于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; } } }

本文来源:https://www.bwwdw.com/article/n2j1.html

Top