21点游戏设计.doc

上传人:文库蛋蛋多 文档编号:2547087 上传时间:2023-02-20 格式:DOC 页数:21 大小:462KB
返回 下载 相关 举报
21点游戏设计.doc_第1页
第1页 / 共21页
21点游戏设计.doc_第2页
第2页 / 共21页
21点游戏设计.doc_第3页
第3页 / 共21页
21点游戏设计.doc_第4页
第4页 / 共21页
21点游戏设计.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《21点游戏设计.doc》由会员分享,可在线阅读,更多相关《21点游戏设计.doc(21页珍藏版)》请在三一办公上搜索。

1、课程设计(大作业)报 告课程名称: 算法设计与分析 设计题目: 21点游戏设计 院 系: 信息技术学院 专业及班级: 计算机科学与技术 设 计 者: 学 号: 指导教师: 设计时间:2014年6月30日至7月4日 昆明学院昆明学院课程设计(大作业)任务书姓 名: 院(系):信息技术学院专 业:计算机科学与技术学 号: 任务起止日期:2014.6.302014.7.4课程设计题目:21点游戏设计 课程设计要求:根据52张扑克牌,随机发出两手牌,其中一个玩家为人,另外一方为计算机,根据概率,设计算法,使计算机合理选择是否补牌。玩家设法使自己的牌的总分达到21分并要比电脑开的点数大而且不超过这个数值

2、。扑克牌的分值取它们的面值,但J,Q,K分都是10分,A可为11分也可为1分。我们在处理这次课程设计的时候,从分析题目的需求入手,按设计抽象数据类型、构思算法、通过类的设计实现抽象数据类型、编制上机程序代码并调试的步骤完成题目,最终写出完整的分析报告。主要设计内容:1.JAVA语言的初级编程。2.JAVA语言的21点扑克牌的编程及设计。3.JAVA平台软件eclipse的使用。工作计划及安排:1、自由分组,分工,查阅资料 1天2、写代码、PPT制作 1天3、代码调试 1天4、写报告 1天5、方案答辩 1天合计: 5天指导教师签字 年 月 日 课程设计(大作业)成绩学号: 姓名: 指导教师: 课

3、程设计题目:21点游戏设计完成情况总结:本次课程设计的内容是21点游戏设计。首先自由分组,组长明确分工,之后查阅资料,编写代码,调试代码,编写报告。这次课程设计任务分工明确,听从组长的安排,我主要负责报告的编写和协助编写代码的组员。这次的课程设计困难重重,由于编写程序的能力不足,所以需要参考很多资料以及找同学帮忙,最后才完成代码的编写。通过这几天的课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,同时在设计的过程中发现了自己的不足

4、之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。这次课程设计提高设计方案的分析、设计、及文档规范书写的能力和解决实际问题的能力。在这次的课程设计中,我明显发现了自己还有很多的不足,在以后的学习中,一定要努力认真,争取做得更好。总的来说,通过这次课程设计,提高了我的实践能力,平时上课学到的都是理论的知识,通过这次的课程设计,让我可以在实践中更好的提高自己。让我今后在学习中更加的注重实践。在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样

5、去克服心理上的不良情绪。因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前。指导教师评语:成绩:填表时间:指导教师签名:目录昆明学院课程设计(大作业)任务书2一、概述51.1 题目要求51.2 JAVA工作平台的简介51.3 21点游戏发展历史61.4 21点游戏介绍6二、设计分析6三、总体设计73.1程序总体结构73.2重要数据的数据结构设计73.3总体功能框图83.4主要算法流程图9四、运行结果与分析104.1开始游戏104.2返回上级菜单的示意图104.3查看玩家记录114.4结束游戏11五、总结12六、参考文献12附录源代码:13一、概述近来随着计算

6、机的快速发展,各种各样的电脑游戏层出不穷,使得我们能有更多的娱乐项目,而一些游戏能起到锻炼人的思维和修身养性的作用。越来越多的具有智能的机器进入了人类的生活,人工智能的重要性如今显而易见。自己对人工智能比较感兴趣,而21点游戏程序的开发实现了这个课题,正好提供给我这样一个研究的机会,通过对人工智能中博弈方面的研究(人机对弈),让我在简单的人机对弈全局设计,以及具体到相关算法上有了深入的了解。人工智能大致可以分成几个任务,这时,这些学科之间的差别就变的很模糊。人工智能在机器人学、模式识别、物景分析、数据库的智能检索、机器下棋(实际上是博弈论问题)和家用电气智能化等领域都有广泛的应用。而这个课程设

7、计就是和人工智能中博弈论领域紧密相关的,我们会尽全力做好它。1.1 题目要求本次算法设计与分析课程设计题目是“21点纸牌游戏”,系统的主要功能是娱乐游戏,根据52张扑克牌,随机发出两手牌,其中一个玩家为人,另外一方为计算机。玩家设法使自己的牌的总分达到21分,并要比电脑开的点数大而且不超过这个数值。扑克牌的分值取它们的面值,但J,Q,K分都是10分,A可为10分也可为1分。我们小组采用Java语言编写这个程序。1.2 JAVA工作平台的简介Java不依赖平台的特点使得它受到广泛的关注,Java已成为网络时代最重要的语言之一。Java语言不仅是一门正在被广泛使用的编程语言,而且已成为软件设计开发

8、者应当掌握的一门基础语言。目前,很多新的技术领域都涉及Java语言,国内外许多大学已将Java语言列入了本科教学计划,掌握Java已经成为共识。Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由SunMicrosystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE,JavaEE,JavaME)的总称。Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。我们

9、用的JAVA开发语言平台是Eclipse:1.3 21点游戏发展历史21点游戏为一款极具趣味性的牌类游戏,最早出现在十六世纪,起源于法国,法语称:vingt-et-un(单单字面来看是20和1,因为法文数字本身的复杂性,就是简单的21),因此在广为流行后该游戏就叫“21”。后传入英国并广泛流传,如果玩家拿到黑心“A”和黑心“J”,就会给与额外的奖励,英文的名字叫黑杰克(Blackjack)1.4 21点游戏介绍21点游戏是一个古老的扑克游戏,游戏的规则是:各个参与者设法使自己的牌的总分达到21而不超过这个数值。扑克牌的分值取它们的面值,A充当1或者11分,J,Q和K人头牌都是10分。庄家VS1

10、1个玩家。在开局时,庄家和玩家都发一张牌。玩家可以看到他们的牌,而庄家有一张牌暂时是隐藏的。接下来,只要愿意,玩家都有机会依次再拿一张牌。如果是玩家的总分超过了21(称为引爆),那么这个玩家就输了。在玩家拿了额外的牌后,庄家将显示隐藏的牌。只要庄家的总分等于或小于16,那么他就必须再拿牌。如果庄家引爆了,那么还没有引爆的玩家都将获胜,引爆的玩家打成平局。如果玩家的总分大于庄家的总分,则玩家获胜。如果二者的总分相同,则玩家与庄家打成平局中。二、设计分析首先是JAVA语言的初级编程。其次JAVA语言的21点扑克牌的编程及设计。还有JAVA平台软件eclipse的使用。并且使用软件eclipse对2

11、1点游戏进行编程,设计游戏算法,实现游戏功能。本次设计的主要难点:1.21点游戏的基本功能的实现2.程序中胜负的判别方法编写程序实现游戏,该程序是模拟古老的21点扑克牌游戏,实现1对1的人机大战。要求游戏过程中任意一方牌的点数之和超过21点,则自动出局;在不超过21点的情况下,玩家下注由电脑随机发牌与庄家比累积牌的点数的大小,大者为赢家。该系统要求在Windows平台下实现扑克牌游戏中的21点,模拟现实生活中的牌类游戏模式。该系统需要的主要功能有以下几个:A.扑克牌游戏中的常规功能:1)洗牌,发牌。2)在每一个回合,玩家可根据自己已获得的牌以及对方摊开的牌选择某一个操作(如再要一张牌)。3)对

12、方(电脑)每个回合根据情况自动选择某个操作。4)每个回合结束后系统自动判断该局游戏是否结束以及输赢情况,然后统计赢了、输了、平了多少局的信息。B.21点游戏的功能:1)玩家在每回合可选择“再要一张牌”、“开牌”等的操作。当游戏结束后禁用这些操作2)以数字的形式显示玩家获得的牌的大小总和,以及对方(电脑)获得的牌中已摊开给玩家看的牌的大小总和。3)在信息栏中显示与游戏相关的信息。包括“游戏正在进行”、“游戏进行中。对方已停牌”、“恭喜你,你赢了”、“很遗憾,你输了”、“还不错,平局”。根据概率,设计算法,使计算机合理选择是否补牌。三、总体设计3.1程序总体结构首先进入开始界面。开始游戏后,先是玩

13、家输入赌金,然后发牌,进入核心部分发牌、判断和处理玩家要牌、发牌各种情况、查看比分与剩余货币和游戏结束。3.2重要数据的数据结构设计开始界面:首先进入游戏会有一个开始界面。洗牌:先定义一个一维指针字符数组*ran52用来存放52张牌,然后用两个srand()/52函数随机在52张牌中产生两个随机数,再用for循环交换1000次,使52张牌的次序完全打乱,洗牌完成。输入赌金以及赌金的计算:计算每次玩家和庄家的点数利用函数需要在每次发牌时计算求和玩家和庄家的点数,再利用函数来比较来判断谁赢。最后记录这些,还有计算剩余货币。3.3总体功能框图游戏界面加倍开始游戏查看比分结束游戏是否要牌开牌退回胜利次

14、数失败次数剩余货币3.4主要算法流程图给玩家发最初的一张牌,并显示出来向玩家发额外的牌并显示牌和总分显示电脑的牌平局给电脑发最初的两张牌并显示牌和总分玩家需要额外的牌?电脑需要额外的牌?向电脑发额外的牌并显示牌和总分电脑引爆?玩家赢玩家引爆?玩家总分电脑?洗牌NYYNYYNN玩家引爆?玩家输YN玩家赢玩家输四、运行结果与分析4.1开始游戏出现的牌是随机的。加倍是投放的货币加倍,PASS是放弃一轮,这两个功能只实现了一半,因为一旦这样做了,就无法重新发牌,但电脑还有牌,所以就直接开牌,记录结果了。4.2返回上级菜单的示意图4.3查看玩家记录4.4结束游戏整体来看,在设计时,我们考虑的比较清晰,但

15、实际操作时,却不能尽善尽美。说明我们学习的知识打的基础不是很好,而且不能很好去拓展新的知识面,我们应该主动地去了解关于这方面的知识,而不是被动的接受老师的教导。五、总结本次课程设计的内容是21点游戏设计。首先自由分组,组长明确分工,之后查阅资料,编写代码,调试代码,编写报告。这次课程设计任务分工明确,听从组长的安排,我主要负责报告的编写和协助编写代码的组员。这次的课程设计困难重重,由于编写程序的能力不足,所以需要参考很多资料以及找同学帮忙,最后才完成代码的编写。课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程

16、。 通过几天的课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正做到学以致用,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。因此在以后的生活和学习的过程中

17、,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前。六、参考文献1耿祥义,张跃平.Java2实用教程(第三版)M.北京:清华大学出版社,2004.5:37-103.2美HerbertSchildt.Java参考大全M.北京:清华大学出版社,2007.8:145-168.3陈家兴.JAVA图形用户界面设计与实例M.北京:冶金工业出版社,2005.2:75-894张伟.Java程序设计实战训练M.北京:人民邮电出版社,2005.7:97-105.5孙卫琴.Java面向对象编程M.北京:电子工业出版社,2009.5:123-156.6美Deitel.Java.大学基础教程(第六版)M.北京:电

18、子工业出版社,2008.8:34-78.7美迪特尔(Deitel.H.M).Java程序设计教程M.北京:清华大学出版社,2007.4:12-34.七、附录源代码:package cm.sd.g;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.Stack;/* * * author *

19、21点游戏 */public class PlayGame private Player player,com;/ 玩家和电脑 private Dealer deck;/ 一副牌 BufferedReader br; /* * 打印菜单 * 完成所有功能调用 */ public PlayGame() / 初始化玩家,牌 player=new Player(); com=new Player(); deck=new Dealer(); String str = null; br=new BufferedReader(new InputStreamReader(System.in); / 打印菜单

20、 while(true) player.playAgain(); com.playAgain(); System.out.println(tt 21点游戏 n); System.out.println(tt 1.开始游戏 n); System.out.println(tt 2.查看比分 n); System.out.println(tt 3.结束游戏 n); System.out.println(t请输入:); try str=br.readLine(); catch (IOException e) e.printStackTrace(); switch(Integer.parseInt(st

21、r) case 1: start(); break; case 2: checkScore(); break; case 3: System.out.println(n游戏结束); System.exit(0); break; default: System.out.println(输入有误,请重新输入); break; /* * param args the command line arguments */ public static void main(String args) new PlayGame(); / 游戏开始,完成初始金额的投注及发第一张牌 / 然后用户选择是投注加倍金额,

22、发下一张牌,还是PASS,或者开牌 private void start() / 初始化金额为20货币单位 int money=20;/ 投注金额 int yourChoice;/ 用户选择 System.out.println(请选择你要投注的金额(最低20货币单位):); / 用户输入下注金额 try money=Integer.parseInt(br.readLine(); if(money20) money=20; catch (Exception e) money=20; System.out.println(您的输入不正确,计算机自动将您的投注金额定为20货币单位); System

23、.out.println(下面开始发牌.); player.setHand(deck.getCard(); com.setHand(deck.getCard(); do System.out.println(您得到的牌是:+player.getHandList(); do System.out.println(您的选择:1.加倍;2.PASS;3.再要一张;4.开牌;5.退回上级菜单); try yourChoice=Integer.parseInt(br.readLine(); break; catch (NumberFormatException ex) System.out.printl

24、n(输入错误,请重新输入); catch (IOException ex) System.out.println(输入错误,请重新输入); while(true); switch(yourChoice) case 1:/ 加倍 yourDouble(money); break; case 2:/ PASS yourPass(money); break; case 3:/ 再要一张 getCardAgain(money); break; case 4:/ 开牌 winOrLose(money); yourChoice=5; break; case 5:/ 退回上一级 break; default

25、: System.out.println(您的输入有误,请输入15); while(yourChoice!=5); / 查看玩家成绩 private void checkScore() System.out.println(恭喜你,您胜利了+player.getWin()+次); System.out.println(很遗憾,您失败了+player.getLose()+次); System.out.println(您还有+player.getCash()+货币单位); / 玩家加倍 private void yourDouble(int money) money*=2;/ 投注金额加倍 / 判

26、断输赢 this.winOrLose(money); / 点数计算 private int computePoint(Player player) int playerPoint=0;/ 玩家的牌点 int numberOfA=0;/ A点拿到的张数 / A点以外的分数累加 for(int i=0;i=2&c.getFace().charAt(0)21) playerPoint+=numberOfA; else playerPoint+=11; if(playerPoint=21) return playerPoint; else return 0;/ 超过21点(爆分) private vo

27、id yourPass(int money) / PASS / 判断输赢 this.winOrLose(money); private void getCardAgain(int money) / 再发一张 player.setHand(deck.getCard(); private void winOrLose(int money) / 判断输赢 int playerPoint=putePoint(player);/ 获得玩家点数 int comPoint=comPlayer();/ 获得电脑点数 if(comPoint=0)/ 点脑爆分 System.out.println(爆分!你赢了。

28、); player.setCash(player.getCash()+money); player.youWin(); else if(playerPoint=0)/ 玩家爆分 System.out.println(爆分!你输了。); player.setCash(player.getCash()-money); player.youLose(); else if(comPointplayerPoint|player.getSize()=5|playerPoint=21) System.out.println(电脑:+comPoint+你:+playerPoint+你赢了); player.s

29、etCash(player.getCash()+money); player.youWin(); else System.out.println(电脑:+comPoint+你:+playerPoint+你输了); player.setCash(player.getCash()-money); player.youLose(); private int comPlayer() int comPoint=putePoint(com); System.out.println(电脑开始:+com.getHandList(); while(comPoint!=0&comPoint=18 & com.ge

30、tSize()5)/ 人工智能:如果电脑手上的点数小于18点就发牌 com.setHand(deck.getCard();/ 再发一张牌给电脑 System.out.println(再发一张,电脑手中:+com.getHandList(); comPoint=putePoint(com);/ 重新计算分数 return comPoint; / BlackJack /* * * author * 扑克 */class Card / 表示所有纸牌面值的数组 public static final String FACES=2,3,4,5,6,7,8,9,10,J,Q,K,A; / 表示所有类型值的

31、数组 public static final String SUITS=黑桃,梅花,方块,红心; / 纸牌总数 public static final int MAX_CARDS=FACES.length*SUITS.length; / 这张牌的点值 protected int value; / 用0点创建一个默认纸牌 public Card() value=0; / 创建第n张牌,非法n值将使程序终止。 public Card(int n) if(nMAX_CARDS) System.out.println(错误:非法牌索引,程序退出); System.exit(0); else value

32、=n; / 返回表示纸牌面值的字符串 public String getFace() return FACESvalue%FACES.length; / 返回表示纸牌类型的String public String getSuit() return SUITSvalue%SUITS.length; public String toString() return getSuit()+getFace(); / Card/* * * author * 发牌者 */ class Dealer / Card对象的最大值 public static final int MAX_SIZE=52; / Card

33、对象的栈 protected Stack cards; / 所有已取出牌的集合 protected List drawnCards; / 在上面的列表中允许随机获取 protected Random random; /*创建一个含52张牌的Deck */ public Dealer() / 把给定数目的牌压入栈中 cards=new Stack(); for (int i=1;i=MAX_SIZE;i+) cards.push(new Card(i); / 为已取出的牌创建一个池,并创建数字产生器 drawnCards=new ArrayList(); random=new Random(); shuffle(); /* * 返回这幅牌剩余的数量 */ public int getSize() return cards.size()+drawnCards.size(); / 随机洗牌 private void shuffle() / 清空栈 while (!cards.isEmpty() drawnCards.add(cards.pop()

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号