最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年02月29日 11:24:10   作者:瘋狂的超神  
這篇文章主要介紹了JavaScript實現(xiàn)斗地主游戲的思路的相關(guān)資料,需要的朋友可以參考下

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

這里說說斗地主主要包含的功能:洗牌,發(fā)牌,玩家出牌、電腦出牌,出牌規(guī)則的驗證,輸贏啥的沒有判斷,只是實現(xiàn)了這幾個主要功能,下面依次說說幾個功能的實現(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);//隨機交換兩張牌
pukes[i]=pukes[index];
pukes[index]=tmp;
} 

  2.發(fā)牌(簡版默認(rèn)是玩家自己為地主,電腦為農(nóng)民),由于前面洗牌時已經(jīng)將牌的順序打亂,所以發(fā)牌只是簡單的循環(huán)把pukes中的元素添加到每個玩家實例中的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.玩家出牌,玩家出牌分為電腦和玩家自己兩個步驟,電腦出牌是非常傻瓜的出牌方式(有牌就出):

//出牌
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("出牌不符合規(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ī)則的驗證,是很多函數(shù)組合起來,然后循環(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){
//校驗
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){
//校驗
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){
//返回三帶的每個點數(shù)的個數(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(){
//連對
}
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步,是我認(rèn)為的主要的4個函數(shù),其他的函數(shù),如初始化,事件注冊等,在源碼已有注釋,寫的不好勿噴。

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

相關(guān)文章

  • flash調(diào)用js中的方法,讓js傳遞變量給flash的辦法及思路

    flash調(diào)用js中的方法,讓js傳遞變量給flash的辦法及思路

    前幾天發(fā)表了 將FlashVars寫在JS函數(shù)中,實現(xiàn)與后臺的實時變量更新,但是僅支持 IE,隨后與 Luckyer 進行了交流,發(fā)現(xiàn)用 SetVariable 可以很方便的實現(xiàn)多瀏覽器兼容。舉例如下。
    2013-08-08
  • JS中不應(yīng)該使用箭頭函數(shù)的四種情況詳解

    JS中不應(yīng)該使用箭頭函數(shù)的四種情況詳解

    箭頭函數(shù)給我們的工作帶來了極大的方便,但是它們有什么缺點呢?我們應(yīng)該一直使用箭頭函數(shù)嗎?我們應(yīng)該在哪些場景中停止使用箭頭函數(shù)?本文就來為大家詳細講講
    2022-07-07
  • JavaScript 格式字符串的應(yīng)用

    JavaScript 格式字符串的應(yīng)用

    在使用JavaScript中的Date對象時,有一個常用的操作就是輸出。但Date對象自帶的toString()方法輸出的格式并不能滿足用戶多樣化的需求。我在想,是不是可以將C#中DateTime.ToString(string format)方法的形式引入到JavaScript中呢?
    2010-03-03
  • Extjs4中tree的拖拽功能(可以兩棵樹之間拖拽) 簡單實例

    Extjs4中tree的拖拽功能(可以兩棵樹之間拖拽) 簡單實例

    這篇文章主要介紹了Extjs4中tree的拖拽功能簡單實例,有需要的朋友可以參考一下
    2013-12-12
  • JS實現(xiàn)可控制的進度條

    JS實現(xiàn)可控制的進度條

    這篇文章主要為大家詳細介紹了JS實現(xiàn)可控制的進度條,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • IE6彈出“已終止操作”的解決辦法

    IE6彈出“已終止操作”的解決辦法

    導(dǎo)致這個問題產(chǎn)生的原因,一般是因為js(一個比較復(fù)雜的js)寫在body里面,在body元素加載完之前調(diào)用出現(xiàn)問題。顯然,解決該問題的方法就是將這一段js放在body元素解析完畢之后。
    2010-11-11
  • javascript實現(xiàn)數(shù)組最大值和最小值的6種方法

    javascript實現(xiàn)數(shù)組最大值和最小值的6種方法

    比較數(shù)組中數(shù)值的大小是比較常見的操作,本文主要介紹了javascript實現(xiàn)數(shù)組最大值和最小值的6種方法,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • javascript 對象數(shù)組根據(jù)對象object key的值排序

    javascript 對象數(shù)組根據(jù)對象object key的值排序

    本文僅僅是實現(xiàn)了javascript 對象數(shù)組根據(jù)對象object key的值排序,算是對自己學(xué)習(xí)javascript這么久的一個小結(jié),希望大家能夠喜歡
    2015-03-03
  • js驗證整數(shù)加保留小數(shù)點的簡單實例

    js驗證整數(shù)加保留小數(shù)點的簡單實例

    這篇文章主要介紹了js驗證整數(shù)加保留小數(shù)點的簡單實例,有需要的朋友可以參考一下
    2013-12-12
  • JavaScript 短路運算的實現(xiàn)

    JavaScript 短路運算的實現(xiàn)

    本文主要介紹了JavaScript 短路運算的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06

最新評論

武强县| 枣强县| 柞水县| 房山区| 乐陵市| 饶阳县| 曲水县| 房山区| 桂平市| 海宁市| 宜宾县| 黔西| 鲁甸县| 横山县| 东乌| 凤翔县| 治县。| 沧州市| 遵义县| 阿拉尔市| 铅山县| 礼泉县| 吐鲁番市| 龙江县| 元朗区| 白河县| 台江县| 凤山市| 芦山县| 新密市| 贵定县| 黄浦区| 根河市| 嵊州市| 莲花县| 孟村| 五台县| 剑河县| 大洼县| 津市市| 北辰区|