JavaScript实现斗地主游戏的思路


Posted in Javascript onFebruary 29, 2016

本文知识给大家分享一下使用js写斗地主的思路,代码写的不好,还请见谅。

JavaScript实现斗地主游戏的思路

这里说说斗地主主要包含的功能:洗牌,发牌,玩家出牌、电脑出牌,出牌规则的验证,输赢啥的没有判断,只是实现了这几个主要功能,下面依次说说几个功能的实现:

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实现斗地主游戏的思路就给大家介绍这么多,希望对大家有所帮助!

Javascript 相关文章推荐
用javascript获得地址栏参数的两种方法
Nov 08 Javascript
SWFObject Flash js调用类
Jul 08 Javascript
基于jquery的一个简单的脚本验证插件
Apr 05 Javascript
HTML上传控件取消选择
Mar 06 Javascript
如何使用jQuery Draggable和Droppable实现拖拽功能
Jul 05 Javascript
JS动态添加与删除select中的Option对象(示例代码)
Dec 20 Javascript
什么是cookie?js手动创建和存储cookie
May 27 Javascript
基于jQuery实现动态数字展示效果
Aug 12 Javascript
简单实现Bootstrap标签页
Aug 09 Javascript
webpack 单独打包指定JS文件的方法
Feb 22 Javascript
解决Vue开发中对话框被遮罩层挡住的问题
Nov 26 Javascript
vue router 通过路由来实现切换头部标题功能
Apr 24 Javascript
jQuery取消特定的click事件
Feb 29 #Javascript
JavaScript+CSS实现的可折叠二级菜单实例
Feb 29 #Javascript
JS三级可折叠菜单实现方法
Feb 29 #Javascript
精通JavaScript的this关键字
May 28 #Javascript
javascript正则表达式总结
Feb 29 #Javascript
javascript计时器编写过程与实现方法
Feb 29 #Javascript
javascript插件开发的一些感想和心得
Feb 28 #Javascript
You might like
关于PHP中的Class的几点个人看法
2006/10/09 PHP
PHP PDOStatement::rowCount讲解
2019/02/01 PHP
DOM相关内容速查手册
2007/02/07 Javascript
jquery ajax中使用jsonp的限制解决方法
2013/11/22 Javascript
jquery获得option的值和对option进行操作
2013/12/13 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
微信JS-SDK自定义分享功能实例详解【分享给朋友/分享到朋友圈】
2016/11/25 Javascript
详解Angular2 之 结构型指令
2017/06/21 Javascript
基于Node.js模板引擎教程-jade速学与实战1
2017/09/17 Javascript
js实现图片放大并跟随鼠标移动特效
2019/01/18 Javascript
vue实现的下拉框功能示例
2019/01/29 Javascript
Vue Element UI + OSS实现上传文件功能
2019/07/31 Javascript
vue-model实现简易计算器
2020/08/17 Javascript
PHP读取远程txt文档到数组并实现遍历
2020/08/25 Javascript
微信小程序学习之自定义滚动弹窗
2020/12/20 Javascript
Python实现约瑟夫环问题的方法
2016/05/03 Python
Python中的异常处理相关语句基础学习笔记
2016/07/11 Python
python字符串string的内置方法实例详解
2018/05/14 Python
python 编写简单网页服务器的实例
2018/06/01 Python
python实现机器学习之元线性回归
2018/09/06 Python
python3 线性回归验证方法
2019/07/09 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
使用已经得到的keras模型识别自己手写的数字方式
2020/06/29 Python
移动端Html5中百度地图的点击事件
2019/01/31 HTML / CSS
体验完美剃须:The Art of Shaving
2018/08/06 全球购物
外贸英语专业求职信范文
2013/12/25 职场文书
元宵节主持词
2014/03/25 职场文书
留学经费担保书
2014/05/12 职场文书
团队激励口号
2014/06/06 职场文书
校庆标语集锦
2014/06/25 职场文书
2014年教师节寄语
2014/08/11 职场文书
县长群众路线对照检查材料思想汇报
2014/10/02 职场文书
村当支部个人对照检查材料思想汇报
2014/10/06 职场文书
公司承诺函范文
2015/01/21 职场文书
python实现进度条的多种实现
2021/04/29 Python
Java实现添加条码或二维码到Word文档
2022/06/01 Java/Android