这篇文章主要介绍了 JavaScript 实现斗地主游戏的思路的相关资料, 需要的朋友可以参考下
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
本文知识给大家分享一下使用 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 实现斗地主游戏的思路就给大家介绍这么多,希望对大家有所帮助!
来源: http://www.phperz.com/article/17/0406/266916.html