本文知识给大家分享一下使用js写斗地主的思路,代码写的不好,还请见谅。
这里说说斗地主主要包含的功能:洗牌,发牌,玩家出牌、电脑出牌,出牌规则的验证,输赢啥的没有判断,只是实现了这几个主要功能,下面依次说说几个功能的实现:
1.洗牌:
var pukes=this.manage.pukes;//存放扑克牌的数组//洗牌for(var i=;i<pukes.length;i++){var tmp=pukes[i];var index=util.random(i,pukes.length);//随机交换两张牌pukes[i]=pukes[index];pukes[index]=tmp;}
2.发牌(简版默认是玩家自己为地主,电脑为农民),由于前面洗牌时已经将牌的顺序打乱,所以发牌只是简单的循环把pukes中的元素添加到每个玩家实例中的pukes字段中。
//发牌var start=;for(var i=;i<this.manage.pukes.length-;i++) {if(start==this.manage.players.length){start=;}this.manage.pukes[i].status=true;this.manage.players[start].pukesLen++;this.manage.players[start++].pukes.push(this.manage.pukes[i]);}for(var i=this.manage.pukes.length-;i<this.manage.pukes.length;i++){//地主多三张this.manage.pukes[i].status=true;this.manage.players[this.manage.curPlayerIndex].pukesLen++;this.manage.players[this.manage.curPlayerIndex].pukes.push(this.manage.pukes[i]);}
3.玩家出牌,玩家出牌分为电脑和玩家自己两个步骤,电脑出牌是非常傻瓜的出牌方式(有牌就出):
//出牌if(this.options.playerIndex==this.manage.curPlayerIndex) {var spks = [],gz=false;if (this.manage.curMaxPlayerIndex == this.options.playerIndex) {this.manage.deskPukes = [];}if (this.isCompute) {//电脑自动出牌var start = ;var len=this.manage.deskPukes.length||;while (start < this.pukes.length) {spks = [];for (var i = ,j=start; i <len&&j<this.pukes.length; i++) {//随便选一张 可以出就行if(this.pukes[j].status) {spks.push(this.pukes[j++]);}}if(spks.length) {if (rules.valids(spks, this.manage.deskPukes)) {gz = true;break;}}start++;}}else {//玩家选择出牌for (var i = ; i < this.pukes.length; i++) {if (this.pukes[i].selected && this.pukes[i].status) {spks.push(this.pukes[i]);}}if (rules.valids(spks, this.manage.deskPukes)) {gz=true;}else{alert("出牌不符合规则!");}}if(gz){this.manage.curMaxPlayerIndex=this.options.playerIndex;this.manage.deskPukes = [];for (var i = ; i < spks.length; i++) {this.pukesLen--;this.manage.deskPukes.push(spks[i]);spks[i].status = false;}}this.manage.renderPukes();this.manage.renderCurDiscard();if(this.isCompute||gz) {this.manage.nextPlayer();}}else{alert("没轮到你出牌!");}
4.出牌规则的验证,是很多函数组合起来,然后循环调用,如果遇到返回ture的即为出牌符合规则:
//以下为出牌规则var rules={_rules:[new danzRule(),new duiRule(),new sandRule(),new zandRule(),new shunzRule(),new liandRule()],valids:function(_pukes,_curPukes){for(var i=;i<this._rules.length;i++){if(this._rules[i].valid(_pukes,_curPukes)){return true;}}return false;}};function danzRule(){//单张规则}danzRule.prototype.valid=function(_pukes,_curPukes){//校验var pukes=_pukes;//玩家的牌var curPukes=_curPukes;//左面的牌if(pukes&&pukes.length==){//比较牌面值if(!curPukes||!curPukes.length){return true;}if(curPukes[].dians==&&pukes[].dians<){//特殊处理return false;}if(pukes[].dians==&&curPukes[].dians<){//特殊处理return true;}return pukes[].dians>curPukes[].dians;}return false;}function duiRule(_pukes,_curPukes){//两张规则}duiRule.prototype.valid=function(_pukes,_curPukes){//校验var pukes=_pukes;//玩家的牌var curPukes=_curPukes;//左面的牌if(pukes&&pukes.length==){//比较牌面值if(pukes[].dians>&&pukes[].dians>){return true;}if(pukes[].dians!=pukes[].dians){return false;}if(!curPukes||!curPukes.length){return true;}else {if(curPukes.length!=){return false;}if (curPukes[].dians > && curPukes[].dians > ) {return false;}if (curPukes[].dians != curPukes[].dians) {return false;}if (curPukes[].dians == ) {return false;}}if(pukes[].dians==){return true;}return pukes[].dians>curPukes[].dians;}return false;}function sandRule(){//三带}sandRule.prototype.valid=function(_pukes,_curPukes){//校验var pukes=_pukes;//玩家的牌var curPukes=_curPukes;//左面的牌if(pukes&&(pukes.length>=)){//比较牌面值var books=getBooks(pukes);if(!valid(books))return false;if(!curPukes||!curPukes.length)return true;if(curPukes.length!=books.length)return false;var books=getBooks(curPukes);if(!valid(books))return false;return getSum(books)>getSum(books);}return false;function getSum(books){var sum=;for(var i=;i<books.length;i++) {if(books[i]==){if(i==)return ;sum+=i;}}return sum;}function valid(books){//验证三带是否有效var counts= ,countsd= ,d=true,start=false,startIndex=-;for(var i=;i<books.length;i++) {if(start&&books[i]==&&startIndex!=(i-)){return false;}else{startIndex=i;}if(books[i]==){if(!start) {start = true;startIndex = i;}counts++;}if(books[i]==){d=false;}}for(var i=;i<books.length;i++) {if(d&&books[i]==){countsd++;}else if(!d&&books[i]==){countsd++;}}return counts>&&counts==countsd;}function getBooks(pukes){//返回三带的每个点数的个数var books=[];for(var i=;i<pukes.length;i++){if(!books[pukes[i].dians]){books[pukes[i].dians]=;}else{books[pukes[i].dians]++;}}return books;}}function zandRule(){//炸弹}zandRule.prototype.valid=function(_pukes,_curPukes){var pukes=_pukes;//玩家的牌var curPukes=_curPukes;//左面的牌if(pukes&&pukes.length==) {if(!allEqual(pukes)){return false;}if(!curPukes||(curPukes.length>&&curPukes.length!=)||!allEqual(curPukes)){return true;}else{if(pukes[].dians==){return true;}if(curPukes[].dians==){return false;}return pukes[].dians>curPukes[].dians;}}return false;function allEqual(pukes){if(!pukes||!pukes.length)return false;var base=pukes[].dians;for(var i=;i<pukes.length;i++){if(base!=pukes[i].dians){return false;}}return true;}}function liandRule(){//连对}liandRule.prototype.valid=function(_pukes,_curPukes) {var pukes=_pukes;//玩家的牌var curPukes=_curPukes;//左面的牌if(pukes&&pukes.length>=) {if(!verificationCoherence(pukes)){return false;}if(!curPukes||curPukes.length<=){return true;}if(!verificationCoherence(curPukes)){return false;}if(pukes.length!=curPukes.length){return false;}return getSumDians(pukes)>getSumDians(curPukes);}return false;function getSumDians(pukes){var sum=;for(var i=;i<pukes.length;i++) {sum+=pukes[i].dians;}return sum;}function verificationCoherence(pukes){//验证连贯性if(!pukes||!pukes.length)return false;var books=[];for(var i=;i<pukes.length;i++){if(pukes[i].dians==||pukes[i].dians>){return false;}if(!books[pukes[i].dians]){books[pukes[i].dians]=;}else{books[pukes[i].dians]++;}if(books[pukes[i].dians]>){return false;}}var start=false;for(var i=;i<books.length;i++) {if(books[i]&&books[i]!=){return false;}if(books[i]==&&!start){start=true;}if(start&&books[i]!=){return false;}}return true;}}function shunzRule(){//顺子}shunzRule.prototype.valid=function(_pukes,_curPukes){var pukes=_pukes;//玩家的牌var curPukes=_curPukes;//左面的牌if(pukes&&pukes.length>=) {if(!verificationCoherence(pukes)){return false;}if(!curPukes||curPukes.length<=){return true;}if(!verificationCoherence(curPukes)){return false;}if(pukes.length!=curPukes.length){return false;}return getSumDians(pukes)>getSumDians(curPukes);}return false;function getSumDians(pukes){var sum=;for(var i=;i<pukes.length;i++) {sum+=pukes[i].dians;}return sum;}function verificationCoherence(pukes){//验证连贯性if(!pukes||!pukes.length)return false;var books=[];for(var i=;i<pukes.length;i++){if(pukes[i].dians==||pukes[i].dians>){return false;}if(!books[pukes[i].dians]){books[pukes[i].dians]=;}else{return false;}}var start=false;for(var i=;i<books.length;i++) {if(books[i]==&&!start){start=true;}if(start&&!books[i]){return false;}}return true;}}
以上4步,是我认为的主要的4个函数,其他的函数,如初始化,事件注册等,在源码已有注释,写的不好勿喷。
JavaScript实现斗地主游戏的思路就给大家介绍这么多,希望对大家有所帮助!
新闻热点
疑难解答