国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

JavaScript實(shí)現(xiàn)斗地主游戲的思路

2019-11-20 10:29:21
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文知識(shí)給大家分享一下使用js寫斗地主的思路,代碼寫的不好,還請(qǐng)見諒。

這里說說斗地主主要包含的功能:洗牌,發(fā)牌,玩家出牌、電腦出牌,出牌規(guī)則的驗(yàn)證,輸贏啥的沒有判斷,只是實(shí)現(xiàn)了這幾個(gè)主要功能,下面依次說說幾個(gè)功能的實(shí)現(xiàn):

  1.洗牌:  

var pukes=this.manage.pukes;//存放撲克牌的數(shù)組//洗牌for(var i=;i<pukes.length;i++){var tmp=pukes[i];var index=util.random(i,pukes.length);//隨機(jī)交換兩張牌pukes[i]=pukes[index];pukes[index]=tmp;} 

  2.發(fā)牌(簡(jiǎn)版默認(rèn)是玩家自己為地主,電腦為農(nóng)民),由于前面洗牌時(shí)已經(jīng)將牌的順序打亂,所以發(fā)牌只是簡(jiǎn)單的循環(huán)把pukes中的元素添加到每個(gè)玩家實(shí)例中的pukes字段中。

//發(fā)牌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.玩家出牌,玩家出牌分為電腦和玩家自己兩個(gè)步驟,電腦出牌是非常傻瓜的出牌方式(有牌就出):

//出牌if(this.options.playerIndex==this.manage.curPlayerIndex) {var spks = [],gz=false;if (this.manage.curMaxPlayerIndex == this.options.playerIndex) {this.manage.deskPukes = [];}if (this.isCompute) {//電腦自動(dòng)出牌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("出牌不符合規(guī)則!");}}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.出牌規(guī)則的驗(yàn)證,是很多函數(shù)組合起來(lái),然后循環(huán)調(diào)用,如果遇到返回ture的即為出牌符合規(guī)則:

//以下為出牌規(guī)則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(){//單張規(guī)則}danzRule.prototype.valid=function(_pukes,_curPukes){//校驗(yàn)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){//兩張規(guī)則}duiRule.prototype.valid=function(_pukes,_curPukes){//校驗(yàn)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){//校驗(yàn)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){//驗(yàn)證三帶是否有效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){//返回三帶的每個(gè)點(diǎn)數(shù)的個(gè)數(shù)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(){//連對(duì)}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){//驗(yàn)證連貫性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){//驗(yàn)證連貫性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步,是我認(rèn)為的主要的4個(gè)函數(shù),其他的函數(shù),如初始化,事件注冊(cè)等,在源碼已有注釋,寫的不好勿噴。

JavaScript實(shí)現(xiàn)斗地主游戲的思路就給大家介紹這么多,希望對(duì)大家有所幫助!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 略阳县| 辽阳市| 深水埗区| 溆浦县| 丰原市| 临猗县| 昌吉市| 浪卡子县| 贺州市| 临洮县| 灯塔市| 盘锦市| 深泽县| 丰镇市| 西乌珠穆沁旗| 新乐市| 乌鲁木齐县| 大埔区| 凤凰县| 永丰县| 铁力市| 图片| 许昌市| 北辰区| 赤壁市| 黄大仙区| 卢湾区| 随州市| 高唐县| 镇远县| 楚雄市| 道孚县| 响水县| 海盐县| 循化| 杭州市| 白朗县| 津南区| 闻喜县| 武平县| 龙川县|