网页版 html5 斗地主,HTML5版单机斗地主
本文中所使用的JControls、JFunction和ResourceData在前面的《學習HTML5開發RPG游戲》中都有提到,這里不再重述,詳細情況,大家可以查看本文最后的源碼。
1、初始化界面及游戲
var DJDDZ={};
DJDDZ.Init=function(canvasID){
JFunction.PreLoadData(GMain.URL).done(function () {
JMain.JForm=new JControls.Form(GMain.Size,canvasID).setBGImage(ResourceData.Images.bg1);
JMain.JForm.clearControls();
GMain.BtnPanel=new JControls.Object({x:100,y:280},{width:600,height:50});//用于顯示游戲控制按鈕
GMain.PokerPanel0=new GControls.PokerPanel({x:100,y:5},{width:600,height:120},0,0);//用于顯示底牌,顯示對象存儲在GMain.Poker[0]
GMain.PokerPanel1=new GControls.PokerPanel({x:200,y:355},{width:400,height:120},1,20);//用于顯示自己的牌,顯示對象存儲在GMain.Poker[1]
GMain.PokerPanel2=new GControls.PokerPanel({x:695,y:60},{width:100,height:440},2,25);//用于顯示右邊電腦的牌,顯示對象存儲在GMain.Poker[2]
GMain.PokerPanel3=new GControls.PokerPanel({x:5,y:60},{width:100,height:440},3,25);//用于顯示左邊電腦的牌,顯示對象存儲在GMain.Poker[3]
GMain.PokerPanel4=new GControls.PokerPanel({x:200,y:150},{width:400,height:120},4,20);//用于顯示出的最后一手牌,顯示對象存儲在GMain.Poker[4]
var BeginButton=new JControls.Button({x:235,y:0},{width:130,height:50}).setText("開始").setBGImage(ResourceData.Images.btn);
BeginButton.onClick=function(){
GMain.BtnPanel.visible=false;
DJDDZ.Dealing();
}
GMain.BtnPanel.addControlInLast([BeginButton]);
JMain.JForm.addControlInLast([GMain.PokerPanel0,GMain.PokerPanel1
,GMain.PokerPanel2,GMain.PokerPanel3,GMain.PokerPanel4,GMain.BtnPanel]);
DJDDZ.InitGame();
JMain.JForm.show();
});
}
DJDDZ.InitGame=function(){
GMain.Poker=[];
for(var i=0;i<5;i++)GMain.Poker[i]=[];//初始化撲克對象存儲空間
for(var j=0;j<54;j++)GMain.Poker[0][j]=new GControls.Poker(j+1);//生成撲克對象
GMain.PokerPanel0.hidePoker=true;//hidePoker為true,顯示撲克背面
GMain.PokerPanel1.hidePoker=false;//hidePoker為false,顯示撲克正面
GMain.PokerPanel2.hidePoker=true;
GMain.PokerPanel3.hidePoker=true;
GMain.PokerPanel4.hidePoker=false;
GMain.PokerPanel1.toSelectPoker=false;
GMain.PokerPanel0.density=1;//設置撲克牌顯示密度
GMain.ToPlay=false;
GMain.LastHandPokerType=null;
GMain.DealingNum=0;
GMain.DealerNum=JFunction.Random(1,3);
GMain.BeginNum=GMain.DealerNum;//初始化發牌起始標識
}
2、點擊開始按鈕后開始發牌
DJDDZ.Dealing=function(){//發牌
if(GMain.DealingHandle)clearTimeout(GMain.DealingHandle);
if(GMain.DealingNum>=51) {//已發完牌
GMain.MaxScore=0;
GMain.GrabTime=0;
GMain.PokerPanel0.density=105;
DJDDZ.GrabTheLandlord();//搶地主
}else{
if(GMain.DealerNum>3) GMain.DealerNum=1;
var r=JFunction.Random(0,GMain.Poker[0].length-1);
GMain.Poker[GMain.DealerNum].splice(GMain.Poker[ GMain.DealerNum].length,0,GMain.Poker[0][r]);
GMain.Poker[0].splice(r,1);
GMain.DealingNum++;
GMain.DealerNum++;
GMain.DealingHandle=setTimeout(DJDDZ.Dealing, 40);//40毫秒發一張牌
JMain.JForm.show();
}
}
3、搶地主
DJDDZ.GrabTheLandlord=function(){//搶地主
if(GMain.GrabTime==3&&GMain.MaxScore==0){//沒有人搶地主
DJDDZ.GameOver();
return;
}
if(GMain.MaxScore==3||(GMain.MaxScore>0&&GMain.GrabTime==3)){//地主已產生
GMain.DealerNum=GMain.LandlordNum;
GMain.LastHandNum=0;
GMain.PokerPanel0.hidePoker=false;
GMain.Poker[GMain.LandlordNum].splice(GMain.Poker[GMain.LandlordNum].length,0,GMain.Poker[0][2]);
GMain.Poker[GMain.LandlordNum].splice(GMain.Poker[GMain.LandlordNum].length,0,GMain.Poker[0][1]);
GMain.Poker[GMain.LandlordNum].splice(GMain.Poker[GMain.LandlordNum].length,0,GMain.Poker[0][0]);
GMain.ToPlay=true;
DJDDZ.ToPlay();
return;
}
if(GMain.DealerNum>3) GMain.DealerNum=1;
if(GMain.DealerNum==1){//自己搶地主
GMain.BtnPanel.clearControls();
var Button1=new GControls.GrabButton({x:10,y:0},{width:130,height:50},1).setText("1分").setBGImage(ResourceData.Images.btn);
var Button2=new GControls.GrabButton({x:160,y:0},{width:130,height:50},2).setText("2分").setBGImage(ResourceData.Images.btn);
var Button3=new GControls.GrabButton({x:310,y:0},{width:130,height:50},3).setText("3分").setBGImage(ResourceData.Images.btn);
var Button4=new GControls.GrabButton({x:460,y:0},{width:130,height:50}).setText("不搶").setBGImage(ResourceData.Images.btn);
GMain.BtnPanel.addControlInLast([Button1,Button2,Button3,Button4]);
GMain.BtnPanel.visible=true;
JMain.JForm.show();
}else{//電腦搶地主
var r=JFunction.Random(0,3);
if(r>GMain.MaxScore){
GMain.MaxScore=r;
GMain.LandlordNum=GMain.DealerNum;
}
GMain.DealerNum++;
GMain.GrabTime++;
JMain.JForm.show();
DJDDZ.GrabTheLandlord();
}
}
4、出牌
DJDDZ.ToPlay=function(){//出牌
JMain.JForm.show();
if(GMain.DealerNum>3) GMain.DealerNum=1;
if(GMain.LastHandNum==GMain.DealerNum){
GMain.LastHandNum=0;
}
if(GMain.DealerNum==1){//輪到自己出牌
GMain.BtnPanel.clearControls();
if(GMain.LastHandNum==2||GMain.LastHandNum==3){//不是該輪第一個出牌,可以選擇不出牌
var Button1=new JControls.Button({x:50,y:0},{width:100,height:50},1).setText("不出").setBGImage(ResourceData.Images.btn);
Button1.onClick=function(){
for(var i=GMain.Poker[GMain.DealerNum].length-1;i>=0;i--)
GMain.Poker[GMain.DealerNum][i].isSelected=false;
GMain.DealerNum++;
GMain.BtnPanel.visible=false;
DJDDZ.ToPlay();
}
}
var Button2=new JControls.Button({x:250,y:0},{width:100,height:50}).setText("出牌").setBGImage(ResourceData.Images.btn);
Button2.onClick=function(){
var _pokerNumbers=[];
for(var i=GMain.Poker[GMain.DealerNum].length-1;i>=0;i--){
if(GMain.Poker[GMain.DealerNum][i].isSelected){
_pokerNumbers[_pokerNumbers.length]=GMain.Poker[GMain.DealerNum][i].pokerNumber;
}
}
if(DJDDZ.CheckPlayPoker(_pokerNumbers)){//判斷選中的牌是否符合規則
DJDDZ.PlayPoker();//出選中的牌
GMain.BtnPanel.visible=false;
GMain.DealerNum++;
DJDDZ.ToPlay();//下一位出牌
}else{
alert("出牌不符合規則,請重新選擇!");
}
}
var Button3=new JControls.Button({x:450,y:0},{width:100,height:50}).setText("提示").setBGImage(ResourceData.Images.btn);
Button3.onClick=function(){
DJDDZ.AISelectPoker();
JMain.JForm.show();
}
GMain.BtnPanel.addControlInLast([Button1,Button2,Button3]);
GMain.BtnPanel.visible=true;
GMain.PokerPanel1.toSelectPoker=true;
JMain.JForm.show();
}else{ //電腦出牌
if(DJDDZ.AISelectPoker()){//電腦AI選牌
DJDDZ.PlayPoker();//出選中的牌
}
GMain.DealerNum++;
setTimeout(DJDDZ.ToPlay, 1500);//暫停1500毫秒,下一位出牌
}
}
4.1、檢查出牌是否符合規則
DJDDZ.CheckPlayPoker=function(_pokerNumbers){//檢查出牌是否符合規則,pokerNumbers從小到大排序
var pokerType=DJDDZ.GetPokerType(_pokerNumbers);
if(pokerType==null)return false;//沒有獲取到牌型
if(GMain.LastHandNum==0)return true;//如果是該輪首牌,任何牌型都可以
else{
//與該輪出的最后一手牌比較
if(GMain.PokerTypes[pokerType.type].weight>GMain.PokerTypes[GMain.LastHandPokerType.type].weight)return true;//當前牌型可以壓前一手牌型
else if (GMain.PokerTypes[pokerType.type].weight==GMain.PokerTypes[GMain.LastHandPokerType.type].weight){//當前牌型不可以壓前一手牌型
if(pokerType.type==GMain.LastHandPokerType.type&&pokerType.length==GMain.LastHandPokerType.length){//牌型與出牌數都相同
if(pokerType.num>GMain.LastHandPokerType.num)return true;//數值大的壓數值小的
else return false;
}else return false;
}else return false;
}
};
4.2、獲取牌型
DJDDZ.GetPokerType=function(__pokerNumbers,chaiNum){//獲取__pokerNumbers的牌型,__pokerNumbers已排序,從小到大
if(chaiNum==null)chaiNum=3;
var splitPoker=DJDDZ.SplitPoker(__pokerNumbers,chaiNum);//把牌拆成非組合類型
var pokerType={type:"",num:0,length:__pokerNumbers.length};
if(splitPoker["12"].length>0){
if(pokerType.length==2)pokerType.type="12";//王彈
else pokerType= null;
}else if(splitPoker["1111"].length>0){
if(splitPoker["1111"].length==1){
pokerType.num=splitPoker["1111"][0];
if(pokerType.length==4) pokerType.type="1111";//炸彈
else if(pokerType.length==6&&(splitPoker["1"].length==1||splitPoker["1"].length==2))pokerType.type="111123";//4帶2
else if(pokerType.length==8&&splitPoker["11"].length==2)pokerType.type="11112233";//4帶2對
else pokerType= null;
}else pokerType= null;
}else if(splitPoker["111"].length>0){
var l=splitPoker["111"].length;
if(l==1||DJDDZ.IsStraight(splitPoker["111"])){//l=1或GMain.SplitPoker["111"]的值連續
pokerType.num=splitPoker["111"][0];
if(pokerType.length==3*l)pokerType.type="111";//3條,l>=2時為飛機
else if(pokerType.length==4*l&&splitPoker["1"].length==l) pokerType.type="1112";//3條帶1,l>=2時為飛機
else if(pokerType.length==5*l&&splitPoker["11"].length==l)pokerType.type="11122";//3條帶1對,l>=2時為飛機
else pokerType= null;
}else pokerType= null;
}else if(splitPoker["11"].length>0){
var l=splitPoker["11"].length;
if(l==1|| (l>=3&&DJDDZ.IsStraight(splitPoker["11"]))){
pokerType.num=splitPoker["11"][0];
if(pokerType.length==2*l)pokerType.type="11";//l=1時為對子,l>=3時為連對
else pokerType= null;
}else pokerType= null;
}else if(splitPoker["1"].length>0){
var l=splitPoker["1"].length;
if(l==1||(l>=5&&DJDDZ.IsStraight(splitPoker["1"]))){
pokerType.num=splitPoker["1"][0];
pokerType.type="1";
}else pokerType= null;
} else pokerType=null;
if( pokerType==null&&chaiNum>0)pokerType=DJDDZ.GetPokerType(__pokerNumbers,chaiNum-1);
return pokerType;
}
4.3、出選中的牌
DJDDZ.PlayPoker=function(){//出選中的牌
GMain.Poker[4]=[];//清空出牌存儲空間
var _pokerNumbers=[];
for(var i=GMain.Poker[GMain.DealerNum].length-1;i>=0;i--){
if(GMain.Poker[GMain.DealerNum][i].isSelected){
_pokerNumbers[_pokerNumbers.length]=GMain.Poker[GMain.DealerNum][i].pokerNumber;
GMain.Poker[4].splice(GMain.Poker[4].length,0,GMain.Poker[GMain.DealerNum][i]);
GMain.Poker[GMain.DealerNum].splice(i,1);
}
}
GMain.LastHandNum=GMain.DealerNum;//本輪最后一手牌標識
GMain.LastHandPokerType=DJDDZ.GetPokerType(_pokerNumbers);//設置最后一手牌牌型
if(GMain.Poker[GMain.DealerNum].length==0)DJDDZ.GameOver();//牌出完,游戲結束
}
4.4、電腦AI選牌
DJDDZ.AISelectPoker=function(){//AI選牌
var _pokerNumbers=[];
for(var i=GMain.Poker[GMain.DealerNum].length-1;i>=0;i--){
_pokerNumbers[_pokerNumbers.length]=GMain.Poker[GMain.DealerNum][i].pokerNumber;
}
var SPN=[];
if(DJDDZ.CheckPlayPoker(_pokerNumbers)){//如果只有一手牌,直接出完
SPN=_pokerNumbers;
}else{
if(GMain.LastHandNum==0){//本輪第一手牌
var splitPoker=DJDDZ.SplitPoker(_pokerNumbers);
if(splitPoker["111"].length>0){
//出3條或飛機,優先飛機
if(splitPoker["111"][0]<7||(splitPoker["1"].length==0&&splitPoker["11"].length==0)){
if(splitPoker["11"].length>0&&(splitPoker["11"][0]<7||splitPoker["1"].length==0)){
for(var i=GMain.PokerTypes["11122"].maxL;i>0;i--){
SPN=DJDDZ.GetPokerByType(_pokerNumbers,{type:"11122",num:0,length:5*i});
if(SPN.length>0)break;
}
}
if(SPN.length==0&&splitPoker["1"].length>0&&splitPoker["1"][0]<15){
for(var i=GMain.PokerTypes["1112"].maxL;i>0;i--){
SPN=DJDDZ.GetPokerByType(_pokerNumbers,{type:"1112",num:0,length:4*i});
if(SPN.length>0)break;
}
}
if(SPN.length==0){
for(var i=GMain.PokerTypes["111"].maxL;i>0;i--){
SPN=DJDDZ.GetPokerByType(_pokerNumbers,{type:"111",num:0,length:3*i});
if(SPN.length>0)break;
}
}
}
}
if(SPN.length==0){
var nn=[];
for(var x=1;x<=3;x++){
if(GMain.Poker[x].length==1||GMain.Poker[x].length==2){
if(GMain.DealerNum==GMain.LandlordNum){
if(GMain.DealerNum!=x)nn[GMain.Poker[x].length]=true;
}else{
if(GMain.LandlordNum==x)nn[GMain.Poker[x].length]=true;
}
}
}
if((splitPoker["11"].length>0&&splitPoker["1"].length>0&&(splitPoker["11"][0]0&&splitPoker["1"].length==0)){
//出連對
for(var i=GMain.PokerTypes["11"].maxL;i>2;i--){
SPN=DJDDZ.GetPokerByType(_pokerNumbers,{type:"11",num:0,length:2*i});
if(SPN.length>0)break;
}
if(SPN.length==0) SPN=DJDDZ.GetPokerByType(_pokerNumbers,{type:"11",num:0,length:2});//出對子
}else{
if(splitPoker["1"].length>0) SPN[SPN.length]=splitPoker["1"][0];//出單牌
}
}
if(SPN.length==0)SPN=DJDDZ.GetPokerByType(_pokerNumbers,{type:"1111",num:0,length:4});//出炸彈
if(SPN.length==0)SPN=DJDDZ.GetPokerByType(_pokerNumbers,{type:"12",num:0,length:2});//出王炸
}else{
if(GMain.LastHandPokerType.type!="12"){
if(GMain.LandlordNum==GMain.DealerNum||GMain.LastHandNum==GMain.LandlordNum){//如果AI是地主或接地主的牌
SPN=DJDDZ.GetPokerByType(_pokerNumbers,GMain.LastHandPokerType);
if(SPN.length==0&&GMain.LastHandPokerType.type!="1111")SPN=DJDDZ.GetPokerByType(_pokerNumbers,{type:"1111",num:0,length:4});
if(SPN.length==0)SPN=DJDDZ.GetPokerByType(_pokerNumbers,{type:"12",num:0,length:2});
}else{//接同伴的牌
if(GMain.Poker[GMain.LastHandNum].length>5){
if((GMain.LastHandPokerType.type=="1"&&GMain.LastHandPokerType.length==1)
||(GMain.LastHandPokerType.type=="11"&&GMain.LastHandPokerType.length==2)){
SPN=DJDDZ.GetPokerByType(_pokerNumbers,GMain.LastHandPokerType);
if(SPN.length>0&&SPN[0]>10)SPN=[];
}
}
}
}
}
}
if(SPN.length>0){
for(var i=0;i=0;j--){
if(!GMain.Poker[GMain.DealerNum][j].isSelected&&GMain.Poker[GMain.DealerNum][j].pokerNumber==SPN[i]){
GMain.Poker[GMain.DealerNum][j].isSelected=true;//選牌
break;
}
}
}
return true;
}else return false
}
4.5、獲取指定牌型的牌
DJDDZ.GetPokerByType=function(__pokerNumbers,type){//從__pokerNumbers中獲取type類型的牌
var _pokerNumbers=[];
var SPN=[];
if(__pokerNumbers.length>=type.length){
for(var i=0;itype.num&&_pokerNumbers[j]==_pokerNumbers[j-c]){
if(SPN.length>0){
if(_pokerNumbers[j]==SPN[0])break;
else if(_pokerNumbers[j]>SPN[0]+1)SPN=[];//如果不能連續則清空已選數
}
for(var k=j;k>=j-c;k--) {
SPN.splice(0,0,_pokerNumbers[k]);//選取數值
_pokerNumbers.splice(j,1);//刪除數值
}
if(SPN.length==type.length)break;//選取完成
}
if(SPN.length==type.length)break;
}
}else if(type.type=="1112"||type.type=="11122"||type.type=="111123"||type.type=="11112233"){//組合類型
var zcy=GMain.PokerTypes[type.type].zcy;
var fcy=GMain.PokerTypes[type.type].fcy;
var fcyNum=GMain.PokerTypes[type.type].fcyNum;
var l=type.length/GMain.PokerTypes[type.type].allNum;
SPN=DJDDZ.GetPokerByType(_pokerNumbers,{type:zcy,num:type.num,length:l*GMain.PokerTypes[zcy].allNum});//先選主類型
if(SPN.length>0){
for(var i=0;i0){
var spn1=DJDDZ.GetPokerByType(_pokerNumbers,{type:fcy,num:0,length:GMain.PokerTypes[fcy].allNum});
for(var i=0;i
5、游戲結束
當某個人出完牌或沒有人搶地主時游戲結束。
DJDDZ.GameOver=function(){
GMain.BtnPanel.clearControls();
var Button=new JControls.Button({x:235,y:0},{width:130,height:50}).setText("重新開始").setBGImage(ResourceData.Images.btn);
Button.onClick=function(){
DJDDZ.InitGame();
GMain.BtnPanel.visible=false;
DJDDZ.Dealing();
}
GMain.BtnPanel.addControlInLast([Button]);//加載重新開始按鈕
//翻開低牌和左右電腦的牌
GMain.PokerPanel0.hidePoker=false;
GMain.PokerPanel2.hidePoker=false;
GMain.PokerPanel3.hidePoker=false;
GMain.BtnPanel.visible=true;
JMain.JForm.show();
}
演示地址 源碼地址
總結
以上是生活随笔為你收集整理的网页版 html5 斗地主,HTML5版单机斗地主的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj1969---找规律
- 下一篇: HTML网页设计CSS样式代码大全