「技术」21点扑克游戏实现原理解析

- 编辑:admin - 点击数:415

「技术」21点扑克游戏实现原理解析

一,游戏介绍1.1游戏规则

21点又名黑杰克,该游戏由2到6个人玩,使用除大小王之外的52张牌,游戏者的目标是使手中的牌的点数之和不超过21点且尽量大。

1.2牌点计算

A至10牌,按其原点数计算;J、Q、K都算作10点。

1.3判断胜负

二十一点玩法规则和概率在二十一点游戏中,拥有最高点数的玩家获胜,其点数必须等于或低于21点;超过21点的玩家称为爆牌。拥有最高点数的玩家获胜,其点数必须等于或低于21点;超过21点之间判负。

二,游戏设计2.1游戏流程

发牌:玩家和AI每人发两张牌,由手牌点数和大的玩家优先选择是否在牌堆中取牌

取牌:手牌点数和小于21,等待1中优先选择后再顺时针轮到其他玩家选择是否取牌

取牌后:若牌点大于21则直接判负出局,场上只剩1人,直接游戏结束;否则重复2-3若牌点小于等于21则轮到下家取牌,重复2-3

游戏结束其他玩家取牌后都超过21点,只剩1人,直接获胜所有玩家都选择不取牌后,按规则比较所有玩家手牌点数和,牌点大的获胜。

2.2玩家类

由玩家自己选择是否继续拿牌。(输入Y继续拿牌,N为不拿牌)

2.3AI类

简化AI逻辑,发牌后AI手牌和为4-8时继续拿牌,一直到17点或17点以上不再拿牌;因为此时再拿牌就有一半以上的概率超过21点。

「技术」21点扑克游戏实现原理解析
三,参考代码
usingSystem;namespace_21dian{usingSystem;;namespaceGame21Points{classProject{staticvoidMain(string[]args){("-----游戏开始-----");//扑克牌Listintcards=newListint(){1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52};//创建对象Pokerpoker=newPoker(cards);Playerplayer=newPlayer();AIPlayerai=newAIPlayer();//--玩家入场="Czhenya";="AI";(player);(ai);//事件关系绑定+=;+=;//游戏开始();//每人发两张牌();();//询问取牌();();}}abstractclassAbsPlayer{publicstringplayerName;publicboolIsContinueTakeCard=true;publicListinthandCards=newListint();publicabstractvoidGameStart();publicvirtualvoidSCard(intcard){(card);}publicabstractboolTakeCard();publicboolGameOver(){boolisGameOver;if(HandCardsPoint21){isGameOver=true;}else{isGameOver=!IsContinueTakeCard;}returnisGameOver;}publicintHandCardsPoint{get{(handCards);}}}classPlayer:AbsPlayer{publicoverridevoidGameStart(){();("玩家整理了一下衣服,准备开局;");}publicoverridevoidSCard(intcard){(card);("玩家发牌:"+(card));}publicoverrideboolTakeCard(){("当前您的手牌点数和为:"+HandCardsPoint);("是否继续取牌(Y/N)?");stringreadStr=();//输入Y取牌,其他为不取牌IsContinueTakeCard=("Y");returnIsContinueTakeCard;}}classAIPlayer:AbsPlayer{publicoverridevoidGameStart(){();("AI:清理一下内存,与之一战;");}publicoverridevoidSCard(intcard){(card);("AI发牌:"+(card));}publicoverrideboolTakeCard(){//手牌数点数小于17,就继续取牌returnHandCardsPoint17;}}classPoker{ListAbsPlayerplayers=newListAbsPlayer();publicActionGameSratrHandler;publicActionintSCardHandler;publicFuncint,boolTaskCardHandler;//发牌用ListintsCards;publicPoker(Listintcards){//复制一份发牌用sCards=newListint(cards);}publicvoidAddPlayer(AbsPlayerplayer){(player);}publicvoidGameStart(){for(inti=0;;i++){if(!players[i].GameOver()){players[i].GameStart();}}}///summary///发牌--会剔除已经发过的牌////summarypublicvoidSCard(){for(inti=0;;i++){players[i].SCard(SOneCard());}}intSOneCard(){//随机发一张牌Randomrandom=newRandom();intindex=(0,);//取到牌值intcardPoint=sCards[index];//从手牌中移除--为避免发到相同的牌(index);returncardPoint;}publicvoidTaskCard(){for(inti=0;;i++){//选择取牌后再发一张牌if(players[i].TakeCard()){players[i].SCard(SOneCard());}(34;玩家:{players[i].playerName}爆牌了");}else{(players[i]);if(maxPointplayers[i].HandCardsPoint){maxPoint=players[i].HandCardsPoint;}}}if(==0){("平局");}elseif(==1){(34;玩家:{playerList[i].playerName}赢了");}}}}returnisGameOver;}}}classPokeTools{///summary///根据牌点返回牌名如:14-红桃3////summary///paramname="card"/param///returns/returnspublicstaticstringPokerBrandByPoint(intcard){if(card52||card=0){("不是扑克牌点");return"不是扑克牌点";}string[]flowerColor=newstring[4]{"黑桃","红桃","梅花","方片"};string[]points=newstring[13]{"K","A","2","3","4","5","6","7","8","9","10","J","Q"};inthuaSe=(card-1)/13;intpoint=card%13;//返回花色+牌点如:红桃3returnflowerColor[huaSe]+points[point];}///summary///手牌求和////summary///paramname="handCards"/param///returns/returnspublicstaticintHandCardsSum(ListinthandCards){//"K","2","3","4","5","6","7","8","9","10","J","Q"int[]points=newint[13]{10,1,2,3,4,5,6,7,8,9,10,10,10};intsumRes=0;for(inti=0;;i++){sumRes+=points[handCards[i]%13];}returnsumRes;}//显示手牌publicstatic(string,string)ShowHandCard(ListinthandCards){stringresStr="";for(inti=0;;i++){resStr+=(handCards[i]);if(!=i){resStr+=",";}}return(resStr,"牌点和:"+(handCards));}}}

测试结果:

你会喜欢下面的文章? You'll like the following article.