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 相关文章推荐
MooBox 基于Mootools的对话框插件
Jan 20 Javascript
28个常用JavaScript方法集锦
Jan 14 Javascript
javascript日期格式化方法小结
Dec 17 Javascript
node.js版本管理工具n无效的原理和解决方法
Nov 24 Javascript
想用好React的你必须要知道的一些事情
Jul 24 Javascript
Node.js dgram模块实现UDP通信示例代码
Sep 26 Javascript
使用Vue开发一个实时性时间转换指令
Jan 17 Javascript
MUI 实现侧滑菜单及其主体部分上下滑动的方法
Jan 25 Javascript
Vue配合iView实现省市二级联动的示例代码
Jul 27 Javascript
express 项目分层实践详解
Dec 10 Javascript
vue使用微信JS-SDK实现分享功能
Aug 23 Javascript
react antd实现动态增减表单
Jun 03 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
十大催泪虐心动漫电影,有几部你还没看
2020/03/04 日漫
php入门学习知识点一 PHP与MYSql连接与查询
2011/07/14 PHP
YII中assets的使用示例
2014/07/31 PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
2016/10/10 PHP
用js重建星际争霸
2006/12/22 Javascript
服务器端的JavaScript脚本 Node.js 使用入门
2012/03/07 Javascript
jQuery点击其他地方时菜单消失的实现方法
2016/04/22 Javascript
浅析JavaScript Array和string的转换(推荐)
2016/05/20 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
2016/06/12 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
2016/06/14 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
2017/05/17 Javascript
jQuery使用zTree插件实现可拖拽的树示例
2017/09/23 jQuery
javascript自定义加载loading效果
2020/09/15 Javascript
JS实现京东商品分类侧边栏
2020/12/11 Javascript
[46:09]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第三场
2014/05/26 DOTA
[00:20]DOTA2荣耀之路7:-ah fu-抢盾
2018/05/31 DOTA
Python排序搜索基本算法之希尔排序实例分析
2017/12/09 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
2018/10/21 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
2019/08/09 Python
Django框架model模型对象验证实现方法分析
2019/10/02 Python
python 中的paramiko模块简介及安装过程
2020/02/29 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
使用Python将图片转正方形的两种方法实例代码详解
2020/04/29 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
2020/09/26 Python
python logging模块的使用详解
2020/10/23 Python
英国著名的化妆品折扣网站:Allbeauty.com
2016/07/21 全球购物
英国儿童鞋和靴子:Start-Rite
2019/05/06 全球购物
优秀中专生推荐信
2013/11/17 职场文书
员工工作表扬信范文
2014/01/13 职场文书
关于工资低的辞职信
2014/01/14 职场文书
学习雷锋寄语大全
2014/04/11 职场文书
语文教育专业求职信
2014/06/28 职场文书
乔迁之喜答谢词
2015/01/05 职场文书
运动会开幕式新闻稿
2015/07/17 职场文书
常用的MongoDB查询语句的示例代码
2021/07/25 MongoDB
Java 轮询锁使用时遇到问题
2022/05/11 Java/Android