JavaScript实现斗地主游戏的思路

 更新时间:2016年3月1日 10:02  点击:2301

本文知识给大家分享一下使用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实现斗地主游戏的思路就给大家介绍这么多,希望对大家有所帮助!

[!--infotagslink--]

相关文章

  • JavaScript判断浏览器及其版本信息

    本篇文章主要分享了通过window.navigator来判断浏览器及其版本信息的实例代码。具有一定的参考价值,下面跟着小编一起来看下吧...2017-01-23
  • 利用JS实现点击按钮后图片自动切换的简单方法

    下面小编就为大家带来一篇利用JS实现点击按钮后图片自动切换的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-10-25
  • 详解前端安全之JavaScript防http劫持与XSS

    作为前端,一直以来都知道HTTP劫持与XSS跨站脚本、CSRF跨站请求伪造。防御这些劫持最好的方法是从后端入手,前端能做的太少。而且由于源码的暴露,攻击者很容易绕过防御手段。但这不代表我们去了解这块的相关知识是没意义的,本文的许多方法,用在其他方面也是大有作用。...2021-05-24
  • js实现浏览器打印功能的示例代码

    这篇文章主要介绍了js如何实现浏览器打印功能,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-15
  • JavaScript仿支付宝密码输入框

    那么今天我就用JavaScript代码来实现这个效果吧,那么首先介绍一下整个的思路,首先我们先将确定输入密码的位数,我的需求是5位,那么就用一个div标签包住5个input标签...2016-01-02
  • js+css实现回到顶部按钮(back to top)

    这篇文章主要为大家详细介绍了js+css实现回到顶部按钮back to top回到顶部按钮,感兴趣的小伙伴们可以参考一下...2016-03-03
  • 一个关于JS正则匹配的踩坑记录

    这篇文章主要给大家介绍了一个关于JS正则匹配的踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-13
  • js实现上传图片及时预览

    这篇文章主要为大家详细介绍了js实现上传图片及时预览的相关资料,具有一定的参考价值,感兴趣的朋友可以参考一下...2016-05-09
  • 如何使用JavaScript实现无缝滚动自动播放轮播图效果

    这篇文章主要介绍了如何使用JavaScript实现“无缝滚动 自动播放”轮播图效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-08-20
  • node.js如何操作MySQL数据库

    这篇文章主要介绍了node.js如何操作MySQL数据库,帮助大家更好的进行web开发,感兴趣的朋友可以了解下...2020-10-29
  • Nest.js参数校验和自定义返回数据格式详解

    这篇文章主要给大家介绍了关于Nest.js参数校验和自定义返回数据格式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-28
  • js实现文本框输入文字个数限制代码

    这篇文章主要介绍了js实现文本框输入文字个数限制代码,文本框输入的文字个数并不是无限制的,一般都会限定一个输入最高上限,如何限制,请看本文...2015-12-27
  • 如何制作自己的原生JavaScript路由

    这篇文章主要介绍了如何制作自己的原生JavaScript路由,对路由感兴趣的同学,可以参考下...2021-05-04
  • js屏蔽F12审查元素,禁止修改页面代码等实现代码

    有时候我们需要屏蔽客户端的F12,以防菜鸟也可以随意修改我们的代码,也处于源码的保护等操作,这里就为大家分享一下常见的代码...2020-10-03
  • 基于JavaScript实现文字超出部分隐藏

    这篇文章主要介绍了基于JavaScript实现文字超出部分隐藏 的相关资料,需要的朋友可以参考下...2016-03-01
  • NodeJS实现阿里大鱼短信通知发送

    本文给大家介绍的是nodejs实现使用阿里大鱼短信API发送消息的方法和代码,有需要的小伙伴可以参考下。...2016-01-20
  • 基于JavaScript实现表单密码的隐藏和显示出来

    为了网站的安全性,很多朋友都把密码设的比较复杂,但是如何密码不能明显示,不知道输的是对是错,为了安全起见可以把密码显示的,那么基于js代码如何实现的呢?下面通过本文给大家介绍JavaScript实现表单密码的隐藏和显示,需要的朋友参考下...2016-03-03
  • js组件SlotMachine实现图片切换效果制作抽奖系统

    这篇文章主要介绍了js组件SlotMachine实现图片切换效果制作抽奖系统的相关资料,需要的朋友可以参考下...2016-04-19
  • JS实现响应鼠标点击动画渐变弹出层效果代码

    这篇文章主要介绍了JS实现响应鼠标点击动画渐变弹出层效果代码,具有非常自然流畅的动画过度效果,涉及JavaScript针对鼠标事件的响应及页面元素样式的动态操作相关技巧,需要的朋友可以参考下...2016-03-28
  • js实现列表按字母排序

    这篇文章主要为大家详细介绍了js实现列表按字母排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-11