好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

21点软件工程实践.doc

24页
  • 卖家[上传人]:xins****2008
  • 文档编号:111306647
  • 上传时间:2019-11-02
  • 文档格式:DOC
  • 文档大小:179KB
  • / 24 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 软件工程实践报告——————————21点扑克牌游戏一、需求分析阶段1、编写目的该程序用来模拟21点扑克牌游戏,玩家最多可以要5张牌,但如果牌的点数之和超过21点,则自动出局;在不超过21点的情况下,玩家与庄家比牌的点数的大小,大者为赢者2、游戏规则分析点数计算:每张牌都有点数, 2 到 10 的牌的点数就是其牌面的数字; J 、 Q 、 K 的点数是 10 分; A 有两种算法, 1 或者 11 ,如果 A 算为 11 时总和大于 21 ,则 A 算为 1 例如 (A,8) 是 19 点,(A,7,J) 则为 18 点  爆牌:玩家手中牌的总点数超过 21 点黑杰克(BlackJack):一张 A 带一张 10 点的牌,比其他 21 点的牌大,例如(A,Q)闲家获得黑杰克,可以获得所下注的1.5倍 停牌:玩家不再要牌,等待其他玩家操作要牌:闲家根据自己手上的点数决定是否要牌,如果要牌,则系统再发一张牌给玩家如果要牌后总点数超过 21 ,则算爆牌,玩家输掉本轮游戏;若要牌后点数为 21 点,则不能再要;如果要牌后总点数不到 21 点,则玩家可以继续“要牌”、“停牌”、“加倍”庄家持牌总点数少于16,则必须要牌,直到超过16,如果庄家的总点数等于或多于 17 点,则必须停牌。

      如果庄家手中有A,且A作11点时大于16点,做1点时小于或等于16点,则由庄家自己选择是否要牌  加倍:双倍下注(Double) 如果您已经抽取了两张纸牌,在这两张牌不是“黑杰克”的前提下,如果认为第三张牌可以让您赢过庄家的手牌,您可以要求「双倍押注」 您的赌注将增加双倍,而您只可以再抽取一张额外纸牌 保险:发过牌后如果庄家手中拿到明牌A,玩家就有机会买保险,保险金是玩家当初下注的一半如果押过保险后,庄家是黑杰克(即庄家的另一张牌为10、J、Q、K),那么需要陪给玩家2倍的保险金 如果玩家选择保险:庄家是黑杰克时,庄家只赢得保险金庄家不是黑杰克,庄家首先收走保险金,然后进行要牌、比较的程序,与前述相同 如果玩家拿到21点,仍能拿到全部的酬金 如果玩家不选择保险:庄家是黑杰克时,收走玩家赌金庄家不是黑杰克,仍然进行要牌、比较等程序,与前述相同 对子:闲家可以选择在自己或其他闲家上下注押对子,如果所压的闲家获得对子(即两张相同种类的牌),则下注闲家胜,庄家赔11倍的筹码 分牌:若玩家获得对子,则可以选择分牌,将这两张牌分成两手牌,由这个玩家一人操作,每手牌的赌注与开始的赌注相同分牌后不能“加倍”,拿到 BlackJack 牌型也只算普通的 21 点。

      牌型比较: 所有闲家都与庄家比较 黑杰克为特殊牌型,比其他所有牌型都大除黑杰克,其他牌型都以点数比较大小 庄家和闲家点数相同,或都拿到黑杰克,则为平局 庄家和闲家都爆牌,系统判断庄家赢3、数据分析庄家:手牌,点数和,本金;玩家:手牌,点数和,本金,投注;二、模块设计阶段1、基本设计概念和和处理流图要牌加倍分牌玩家开始 庄家要牌停牌操作操作点数和点数和比较结束2、结构21点游戏玩家庄家手牌本金投注数手牌本金3、比较表庄家<21=21>21黑杰克不是玩家<= >且<21>21黑杰克不是黑杰克不是且=不是且!=<=21>21结果输平局赢输平局输赢平局输赢输4、主要模块设计模块1:函数名:initial()参数:玩家总数(包含庄家)功能:初始化各玩家的信息;模块2:函数名: Betting()参数:玩家总数;功能:实现玩家下注模块3:函数名:Showprincipal();参数:玩家总数(包含庄家)功能:显示各玩家的本金;模块4:函数名:Dealing();参数:玩家和玩家编号功能:给玩家和庄家发牌;模块5:函数名:Insurance();参数:玩家总数功能:实现处理玩家是否投保险;模块6:函数名: Playerplay();参数:玩家总数功能:实现玩家的操作:要牌,加倍,分牌,停牌;模块7:函数名:Bankerplay();参数:无功能:实现庄家的操作:要牌和停牌;模块8:函数名:Compare();参数:玩家总数功能:实现玩家与庄家的手牌的比较;其他。

      三、程序实现流程初始化游戏信息 Initial():系统发2张牌 Dealing()玩家下注Betting();玩家操作Playerplay();分牌Divide()加倍Double()要牌Want()庄家操作Bankerplay();要牌Want();比较结果Compare()继续结束程序视图:这里说明下结果输赢只判断原始投注的输赢,押对子和保险的输赢不显示;代码:#include "stdafx.h"#include#include#includeusing namespace std;#define max 100int poker[15];//第二幅牌struct pk{ int num[6]; int number; int sum; int betting;};//玩家属性struct people{ int num[6]; //要到的牌 int number; //已经有几张 int sum; //点数之和 int principal; //本金 int betting[4]; //投注betting[0]:原始投注,betting[1]:保险,betting[2]:投对子 bool ifinsurance; //判断是否买保险 bool ifbettingdyad; //判断是否投对子 bool ifdyad; //判断是否是对子 bool ifdouble; //判断是否加倍 bool ifbjack; //判断是否是黑杰克 bool ifdivide; //判断是否分牌 int other; //若投注对子投给谁 pk next;}player[max];//初始化void initial(int n){ int i; for(i=0;i=4); //产生随机数(~13) poker[r]++; a.num[a.number]=r; a.number+=1; if(r>10) a.sum+=10; else a.sum+=r;}//加倍void Double(people & a){ a.betting[0]*=2; //投注金额加倍 int r; while(poker[r=rand()%13+1]>=4); //产生随机数(~13) poker[r]++; //扑克牌中该牌被拿 a.num[a.number]=r; //牌到玩家手中 a.number+=1; //玩家手牌增加一张 if(r>10) a.sum+=10; //如果是J,Q,K则当点算 else a.sum+=r;}//判断是否是对子void Dyad(int n){ int i; for(i=1;i>a) { if(a=='Y') //投对子 { while(cin>>p>>c) { if(p0&&c<=20&&c>0) //输入符合要求 { player[i].ifbettingdyad =true; player[i].other =p; player[i].betting[2]=c; player[i].principal -=c; cout<<"玩家"<

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.