在21点游戏怎么 企鹅号注册容易吗呢

114网址导航程序实现(2)
21点游戏的设计能够充分体现C语言结构化程序设计的思想,如果你是C语言的初学者,本文对你一定有帮助.
&&&&& 21点游戏的规则如下:扑克牌A、2、3、4、、、、、、10、J、Q、K、大小鬼分别代表数字1、2、3、4、、、、、、10、11、12、13、21;人和电脑轮流坐庄,庄家先发牌。胜利条件:将所取牌点数相加凑成 &和&是21,谁先凑成21就胜出,如果没有人凑到&和&是21,就定&和&最接近21且小于21就胜出。每人至多可取5张扑克牌。要注意&和&超过21者谁先爆掉也就是输了,如果都爆了,点数小的胜;当点数相同时,庄家胜。
&&&&& 首先,理清游戏的运行思路是非常关键的。面对众多杂乱的规则,可以先去除无关紧要的细节,这样细节与游戏总体的思路没有关系,只是影响某些过程的处理细节.比如: 每人至多可取5张扑克牌,注意&和&超过21者谁先爆掉也就是输了,如果都爆了,点数小的胜;当点数相同时,庄家胜。可以概括为”取牌规则和判定规则”,这样整个游戏其实就变成了轮流取牌并计分的过程.只是一次取牌结束后可以自行退出,只是不能取5次以上,然后最终用特定的规则来判定胜负.这样理解的游戏的整体思路后,即使加入再多的细节也能轻松应对.
&&&&& 程序编码的第一步是什么?是先声明变量?写主函数?我个人喜欢的是先完成子函数模块的设计.把子模块完成之后,更高级的模块就变得容易了.就像盖楼房一样,先堆砌基础的模块总让我很放心,而一开始就从上层开始让我有一种悬于空中的感觉。我认为对于小型程序来说,自下而上的设计方式是高效的.
&&&&& 分析的时候从分析主体开始,没想到设计的时候从细节开始,但是,我小手一抖,就写出了几个子模块:
&&&&& //根据牌点获取其数值
intvalue(int i)
&&&&& if(i &= 52)
&&&&&&&&&& return i / 4 + 1;&&&& //花牌
&&&&& return MAXNUM;&&&&&&&&&&& //鬼牌
//电脑取牌
introbot_fetch()
&&&&& if(robot_value &= AVG_POINT)&&& //如果取得平均点,不再取牌
&&&&&&&&&& return AVG_POINT;
&&&&&&&&&& id = rand() % SUM + 1;&&&& //随机选牌
&&&&& }while(map[id]);
&&&&& map[id] = 1;&&&&& //标记为选择状态
&&&&& return robot_value + value(id);
//玩家取牌
intplayer_fetch()
&&&&&&&&&& id = rand() % SUM + 1;&&&& //随机选牌
&&&&& }while(map[id]);
&&&&& map[id] = 1;&&&&& //标记为选择状态
&&&&& int temp = value(id);
&&&&& printf(&\t\t你获得了%d 点, 现在您有 %d 点了\n&, temp, player_value + temp);
&&&&& return player_value +
//判断胜负
voidjudge_win(int flag)
&&&&& if(robot_value & MAXNUM &&player_value & MAXNUM)
&&&&&&&&&& //同时大于21,少者取胜
&&&&&&&&&& if(flag == 1)&&& //玩家是庄家
&&&&&&&&&&&&&&&& winer = (robot_value &=player_value);
&&&&&&&&&& else
&&&&&&&&&&&&&&&& winer = (robot_value &player_value);
&&&&& else&&&& if(robot_value& MAXNUM)
&&&&&&&&&& winer = 1; //玩家赢了
&&&&& else&&&& if(player_value& MAXNUM)
&&&&&&&&&& winer = 0; //电脑赢了
&&&&& else
&&&&&&&&&& //同时小于21,多着取胜
&&&&&&&&&& if(flag == 1)&&& //玩家是庄家
&&&&&&&&&&&&&&&& winer = (robot_value &=player_value);
&&&&&&&&&& else
&&&&&&&&&&&&&&&& winer = (robot_value &player_value);
&&&&& printf(&\n\t\t%s\n&, winer ?&玩家赢了& : &电脑赢了&);
在设计这些子模块的同时便决定了一些细节:
1.&&&&&用随机数模拟取牌过程
2.&&&&&用map数组记录牌的选中状态防止重选.
3.&&&&&扑克牌是按数字顺序排序的.
也在设计的过程中发现并使用了必要的变量和常量:
1.&&&&&玩家和电脑对于的点数
2.&&&&&对中间点数,总点数进行宏定义,增强程序通用性.
做出这些决定是非常自然了,你可以做出个性的不同的决定,比如用数组记录每张牌的点数,用局部变量的参数传递代替全局变量的使用等等.
子模块的设计是非常简单了,即使一个C语言的新手对这个游戏束手无策,仍然可以编出上面的程序,因为在设计的过程中不需要考虑其他的任何细节,只要在乎眼前的问题而已。这和面向对象的封装思想一样,C++的封装更优秀无非就是把子函数整理归类了.
&&&&& 最后就是用已有的模块搭建函数主题了,也同样可以轻松写出来:
int main()
&&&&& srand((unsigned)time(NULL));&&& //随机种子
&&&&& int flag = FLAG;&&& //庄家标志
&&&&& do&&&&&& &
&&&&&&&&&& memset(map, 0,sizeof(map));&&&&& //初始所有的扑克牌没有被选中
&&&&&&&&&& player_value = robot_value= 0;
&&&&&&&&&& printf(&\n\t\t游戏开始\n&);
&&&&&&&&&& int count = 1;
&&&&&&&&&& do{
&&&&&&&&&&&&&&&& player_value =player_fetch();&&&&& //玩家取牌
&&&&&&&&&&&&&&&& robot_value =robot_fetch();& //电脑取牌
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&& if(count &MAXFETVH || player_value & MAXNUM)
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&& count++;
&&&&& &&&&&&&&&& printf(&您要继续取牌吗?(Y / N)\n&);
&&&&&&&&&& }while(tolower(get_sign())!= 'n');
&&&&&&&&&& printf(&\n\t游戏结束, 您获得了 %d 点, 电脑获得了 %d 点\n&,player_value, robot_value);
&&&&&&&&&& judge_win(flag);
&&&&&&&&&& flag = !&&&& //交换庄家
&&&&&&&&&& printf(&您要继续游戏吗?(Y / N)\n&);
&&&&& }while(tolower(get_sign()) != 'n');
&&& return 0;
&&&&& 上面也有很大默认的规则,不过我想读者应该能够看出来,我就不多解释了.
&&&&& 程序仅用了150行,实现了基本的21点游戏功能,再此基础上继续增加新的功能非常简单.
如果电脑更加智能,可以根据对方的牌数和自己的点数来决定是否继续选牌,只要改变robot_fetch()函数的一部分就可以了.如果玩家是在赌博,加入金币制,只要再声明一个变量记录金币的流失与获得就可以了.就算从控制台界面转入windows窗体界面,也许全部的代码都要改动,但是流程和思路是不变的,只要懂得控件的使用就可以.
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5719次
排名:千里之外
原创:12篇
(1)(1)(2)(8)下载作业帮安装包
扫二维码下载作业帮
1.75亿学生的选择
21点怎么玩啊?有什么诀窍 啊?拜托各位大神
palnewmanm1430
游戏采用一副扑克,去掉大小王共计 52 张牌,允许 6 位玩家同时进行游戏; 在全部的 52 张牌中,9 分别为 9 点; 10 ,J ,Q ,K 分别为 10 点,A ( ACE )可以根据情况自由计为 1 点或者 11 点,当 A ( ACE )以 11 点计算时如果牌面点数不超过 21 点,则 A ( ACE )计为 11 点,否则 A ( ACE )计为 1 点; 牌面比较大小时根据牌的点数之和的大小决定胜负,其中首发的 2 张牌如果为一张 A ( ACE )和一张 10 点牌( 10 ,J ,Q ,K )的组合则为 blackjack ,为最大牌; 游戏采用随机轮庄的形式决定每局庄家; 2 .发牌 游戏开始后发给每位玩家一张明牌一张暗牌,只要玩家手中的明牌点数小于 21 点即可继续要牌,直到玩家选择停牌,双倍或者爆牌时为止; 当玩家(庄家)手中出现 21 点或者 blackjack 时则自动停牌; 3 .胜负规则 通常情况下玩家与庄家比较大小时根据牌面的点数大小决定胜负,其中 blackjack 大于所有 21 点,点数相同时计为平局,同是 blackjack 也计为平局; 通常情况下玩家获胜时,赢得押注的大小,而当玩家以 blackjack 获胜时,赢得 2 倍押注的大小; 4 .特殊规则 分牌:首轮发牌结束后,如果 2 张牌点数相同则可以进行分牌,比如两张 8 ,两张 9 ,一张 10 和一张 Q 等等;分牌后每手牌的押注金额与初始押注额相同,开牌时玩家用 2 手牌分别与庄家比较大小,皆胜则赢得初始押金的 2 倍,皆负则扣除 2 倍押金,一胜一负则计为平局;此外,当玩家分牌后无法进行加倍等操作; 加倍:玩家选择加倍后押金加倍,同时自动拿牌一张,此时不论结果如何都强制停牌; 保险:当第一次发牌结束后,如果庄家的明牌为 A ( ACE ),玩家可以选择购买保险,保险金额与押注金额相同,当庄家手中的牌为 blackjack 时,玩家可以从庄家处获得 2 倍保险金,而当庄家手中的牌不为 blackjack 时,玩家输掉保险金; 庄家明牌为 A ( ACE )时,系统会自动弹出保险窗口,玩家可以自由选择是否购买保险.
为您推荐:
其他类似问题
扫描下载二维码

我要回帖

更多关于 最容易注册的邮箱 的文章

 

随机推荐