1、JAVA课程设计21点扑克牌JAVA课程设计21点扑克牌通信专业课程设计一 太原科技大学 课 程 设 计 设计(论文)题目:基于JAVA的21点扑克牌 姓名 学号 班级 学院 指导教师 2011年 12 月 23日 太原科技大学课程设计任务书 学院:时间: 2011年 月 日 学 生 姓 名 设计题目 指 导 教 师 基于JAVA的21点扑克牌游戏设计 语言的初级编程。 主要研 究内容 语言的21点扑克牌的编程及设计。 平台软件eclipse的使用。 研究方法 使用软件eclipse对21点游戏进行编程,设计游戏算法,实现游戏功能。 主要技术指标(或研究目标)1. 21点游戏的基本功能的实现。
2、 2. 程序中胜负的判别方法。 3. 递归法的理解与使用。 教研室意见 教研室签字: 年月日邸伟:基于JAVA的21点设计 目 录 第一章 绪论 . - 4 - JAVA工作平台的简介 . - 4 - 本次设计的主要内容 . - 4 - 第二章 设计任务的分析 . - 5 -二十一点游戏介绍 . - 5 -实现以下功能: . - 5 - 第四章 程序的图形结果及分析 . - 10 - 第五章 小结 . - 16 - 邸伟:基于JAVA的21点设计 第三章 本次设计的重点及难点 向玩家发额外的 牌并显示牌和总分向电脑发额外的 牌并显示牌和总分玩家引 爆? Y N 玩家赢 平局 - 6 - 玩家输
3、 洗牌 给玩家发最初的三张牌,并显示出来 给电脑发最初的三张牌 并显示牌和总分 Y 玩家需要额外的牌? N 显示电脑的牌 Y 电脑需要额外的牌? N Y 电脑引爆? N Y N 玩家引爆? 玩家总分电脑? 玩家赢 玩家输 图 21点流程图 邸伟:基于JAVA的21点设计 游戏胜负的判别方法: 本方法考虑了鬼牌的因素,于所用到的扑克牌为54张,将他们存放在数组,且通过数组的下标来保证牌的唯一。于数组中的计数方式是从0开始的,所以第0-12号为13张1组牌,12-25号为下一组.以此类推,共4组到51号牌,所以第52号和53号及为鬼牌,且他们的作用是一样的。 int judge(int a,int
4、 b,int num)/判断电脑和玩家谁的点数更接近21,如果有鬼牌就另行判断 int sum_a=0,sum_b=0; boolean joker_a=false,joker_b=false; for(int i=0;i if(ai=14|ai=15)joker_a=true; else sum_a+=ai; if(bi=14|bi=15)joker_b=true; else sum_b+=bi; if(joker_a)if(sum_a if(joker_b)if(sum_b if(sum_a21&sum_b21)return 1; if(sum_a-21) else if(sum_a-21
5、)=(sum_b-21)return 0; else /if(sum_a-21)(sum_b-21)return -1; if(judge(human,computer,n)=1)(你赢了! else if(judge(human,computer,n)=0)(平局!else if(judge(human,computer,n)=-1)(你输了! (- 7 - 邸伟:基于JAVA的21点设计 当玩家抽到鬼牌时,鬼牌可以顶替1-13任意大小的牌,抽到鬼牌时的判别方法为,鬼牌存在,并且其余牌总和小于8,那么现在加上13就是总和,如果除了鬼牌其余牌大于8小于21,那么总和就是21,电脑和人判断方法一
6、样。最后判断大小,通过返回1,0,-1,分别表示人赢,平局,电脑赢;如:人的大于21并且电脑小于等于21,则返回-1,那么电脑赢,否则返回1,即表示人嬴;当人和电脑的牌都大于21时,通过将人和电脑的牌都减去21取绝对值的方法,然后比较得到的值,如果人得到的值小则返回 1,即人赢;相等则返回0,即平局;电脑的值小则返回-1,即电脑赢。 递归法的使用: 本方法为了避免牌的重复而使用了递归法,其中的程序为: int nextOne()/用递归确保返回的牌没有重复 int n=(int)()*54);/通过随机的方法产生数 if(cardsn=0)/如果产生的那个数字曾经没有用过那么就用,否则重新产生
7、 cardsn=1;/用过的赋值为1 if(n=52)/如果n的值为52 return 14;/返回的值为14 else if(n=53)/如果n的值为53 return 15;/返回的值为15 else return n_+1;/这个数对13取模然后加1就是产生的牌 else return nextOne();/重新随机产生 所有牌的被定义在包含54个元素,且所有元素为0的数组中,即所有的牌的都通过数组的下标n表示,且在数组中代表的元素被赋值为0,当这张牌被使用时,通过元素的下标,将此位置的元素从0改为1。在调用本方法时,首先 通过方法int n=(int)()*54)获得元素的下标n,然后
8、通过if(cardsn=0)判断,如果该位置的元素为0,则这个n代表的牌没有使用过的的,将它在数组所指的牌从0赋值为1后,将这个牌的下标取模后返回;否则,这张牌是被使用过的, 通过 return nextOne(); 返回到本方法的开始位置,重新执行一遍本方法,直到随机出的n所代表的牌,没有被使用过的牌 ,然后将n代表的牌返回后跳出本方法,继续程序的运行。- 8 - 邸伟:基于JAVA的21点设计 表 程序中方法和类的说明 类名 Play21 Play21 Play21 Play21 Play21 Play21 Test 方法名 Start() Clear() Show() Ask() Nex
9、tone() Judge() Main() 始游戏 描述 游戏开始 数组清零开始计数 显示玩家或电脑的牌 询问玩家或电脑是否要牌 通过迭代的方式获得牌 对比玩家和电脑的牌的大小 程序的入口方法,通过这里开 - 9 - 邸伟:基于JAVA的21点设计 第四章 程序的图形结果及分析 程序分析 本程序没有采用传统的21点的52张牌的规则,而是采用了54张牌全用的方法,大小鬼牌也带了进去,但鬼牌可以表示1-13的任意大小具体情况可有玩家自己决定,当玩家手里牌的总分小于等于8时,若抽到鬼牌可以顶替13,当玩家手中的牌大于8时,鬼牌可以成为任意一个,并且大小鬼牌作用相同。在游戏中为了防止抽到重复的牌而采用
10、了将牌存放在数组中,把没用过的牌在数组中赋值为0.用过的牌赋值为1,且通过递归方法来更好的避免了牌的重复。即所有牌的被定义在包含54个元素,且所有元素为0的数组中,即所有的牌的都通过数组的下标n表示,且在数组中代表的元素被赋值为0,当这张牌被使用时,通过元素的下标,将此位置的元素从0改为1。在调用本方法时,首先 通过方法int n=(int)()*54)获得元素的下标n,然后通过if(cardsn=0)判断,如果该位置的元素为0,则这个n代表的牌没有使用过的的,将它在数组所指的牌从0赋值为1后,将这个牌的下标取模后返回;否则,这张牌是被使用过的, 通过 return nextOne(); 返回
11、到本方法的开始位置,重新执行一遍本方法,直到随机出的n所代表的牌,没有被使用过的牌 ,然后将n代表的牌返回后跳出本方法,继续程序的运行。本程序也运用了比较简单的数组结构。数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。一个数组中的所有元素具有相同的数据类型。当然,当数据类型为 Variant 时,各个元素能够包含不同种类的数据
12、。 10 - -邸伟:基于JAVA的21点设计 图 程序运行结果 图 程序运行结果 11 - -邸伟:基于JAVA的21点设计 程序中的部分注释: 1. public void start()/开始游戏 ( (开始游戏! int n=3; for(int i=0;icomputeri=nextOne(); humani=nextOne(); while(n show(human,n,1);/显示现在玩家的牌面 if(ask(human,n) /如果玩家要牌 computern=nextOne();/电脑获得一张牌humann=nextOne();/玩家获得一张牌n+;/n的值自动加1 else
13、 break;/如果不选择加牌则跳出本循环 12 - -邸伟:基于JAVA的21点设计 2. int nextOne()/用递归确保返回的牌没有重复 int n=(int)()*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_+1;/这个数对13取模然后加1就是产生的牌,正常情况下,除13后剩下的牌就是牌的值 但数组是从0开始计数的 所以加1 0-12为13张1组牌,12-25下一组. 以此类推,共4组到51号牌 else return nextOne();/重新随机产生 13 - -邸伟:基于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=fals
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1