实现简单的斗地主在控制台中显示

写一个三个人玩斗地主的游戏。实现随机发牌的功能。
使用面向对象的思路完成。
最后把每个玩家的牌在页面展示出来,只展示花色♣️♠️♥️♦️和点数即可。
提示:
a:游戏本身是个对象,比如有游戏名字、玩家、一副扑克等属性,
应该有开始游戏的功能。
b:每一副扑克本身也应该是个对象,有牌的数量的属性,
和存储每一张扑克的数组,洗牌等功能。
c:每张牌也应该是个对象,有花色和点数等属性。
d:每个玩家也应该是个对象,比如玩家的姓名,玩家手里的牌等属性。

步骤1.利用面向对象的思维,先确定一个整体的对象 即 game ,我们所有的功能都在这个对象中实现:

代码分析:

var game = {                //定义游戏这个对象
//  game属性1:对于游戏这个对象来说,游戏名称是必须的;
    name:"斗地主",         
//  game属性2:玩家,而玩家又是一个一个的对象,所以在此我们又可以给创建一个构造函数,用来创建每个玩家  
    players:[new Player("吕布"), new Player("貂蝉"), new Player("董卓")],         
//  game属性3:扑克牌组,扑克牌组也是一个对象,所以在此我们又可以给创建一个构造函数,用来创建扑克牌组
    poker: new Poker(),
//  game属性4:一个开始游戏的函数
    startGame: function (){}
//  game属性5:一个发牌的函数  
    sendCard : function (){}
//  game属性6:一个显示所有玩家所有牌的函数
    showAllCard : function (){}
}
具体代码如下:
var game = {
    //给游戏起名
    name: "斗地主",
    //调用步骤2中的构造函数创建三个玩家
    players: [new Player("吕布"), new Player("貂蝉"), new Player("董卓")],
    //调用步骤3中的构造函数创建一个牌组
    poker: new Poker(),
    //开始游戏的函数
    startGame: function (){
        // 调用分牌函数
        this.sendCard();
        // 调用在控制台显示牌的函数
        this.showAllCard();
    },
    //分牌的函数,用于在开始游戏中调用
    sendCard : function (){
        //牌组中54张牌,但我们要留3张作为底牌,所以循环51次
        for(var i = 0; i < 51; i++){
            var card = this.poker.cards[i];
            this.players[i % this.players.length].cards.push(card);
        }
    },
    //在控制台中显示牌的函数,用于在开始游戏中调用
    showAllCard : function (){
        for(var i = 0; i < this.players.length;i++){
            this.players[i].showCards();
        }
    }
}
//调用game对象中开始游戏的函数
game.startGame();

步骤2.定义一个构造函数用于创建每个玩家

代码分析:

function Player(name){
  this._init(name);
}
Player.prototype={                            //Player原型对象中的属性:
  _init:function(){},                                     初始化函数
  showCards:function(){},                                 用于显示每个玩家的牌的函数
}
具体代码如下:
function Player(name){
    this._init(name);
}
Player.prototype = {
//Player原型对象属性1:应该有一个用于初始化的函数
    _init:function(name){
      //对于每个玩家这个对象,它的属性A:每位玩家名字name
      this.name = name;
      //属性B:每位玩家手里的牌
      this.cards = [];
    }
//属性2:一个用于显示每一个玩家的牌的函数(这个函数我们可以在game对象中的showAllCard中直接调用它)
    showCards: function (){
        //调用了步骤4中的toString()函数用于将每个牌的花色还有数字用字符串的方式显示出来
      console.log(this.name + ":" + this.cards.toString());
    }
}

步骤3.定义一个构造函数用于创建一个牌组

代码分析:

function Poker(){
  this._init();
}
Poker.prototype={                 //Poker原型对象中的俩个属性:
  _init:function(){},                                         初始化函数
  shuffle:function(){},                                           打乱牌的函数
}
具体代码如下:
function Poker(){
    this._init();
}
Poker.prototype = {
  //Poker原型对象属性1:应该有一个用于初始化的函数
    _init: function (){
        //定义一个数组用来盛放所有的牌,可以把每张牌都当成是数组里的一个元素
        this.cards = [];
        // 初始化54张牌
        //花色数组中存放的是4种不同的花色
        var huases = ["♣", "♠", "♥", "♦"];
        //数字数组中存放的是13种不同的数字
        var points = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]
        //利用俩个for循环将花色数组和数字数组组合成同一个数组(即cards这个数组)
        for (var i = 0; i < huases.length; i++){
            for (var j = 0; j < points.length; j++){
                //把每一张牌当成一个对象,这样我们又可以在步骤4中定义一个构造函数用于创建每一张牌
                var card = new Card(huases[i], points[j]);
               //把创建好的每一张牌都添加到数组cards中
                this.cards.push(card);
            }
        }
        //通过上面的俩个for循环,我们得到的是一个有52个元素(13种数字对应4种花色13*4=52)的数组
        //所以还要在添加上 大 小王;
        this.cards.push(new Card("", "大王"))
        this.cards.push(new Card("", "小王"))
        //以上步骤全执行完之后我们得到的是一个排序整齐的牌组,可以通过调用shuffle()方法来打乱它,
        //这样我们在给每位玩家发牌的时候发的就是打乱的牌
        this.shuffle();
    },
    //Poker原型对象属性2:一个用于打乱数组的函数
    shuffle: function (){
      this.cards.sort(function (a, b){
            return Math.random() > 0.5 ? 1 : -1
        })
    }
}

步骤4.定义一个构造函数用于创建每张牌

代码分析:

function Card(huase,point){
  this._init(huase,point);
}
Card.prototype = {                            //Card原型对象中的属性:
  _init:function(){},                                 初始化的函数
  toString:function(){},                              用于转换为字符串的函数
}
具体代码如下:
function Card(huase, point){
    this._init(huase, point);
}
Card.prototype = {
    //原型对象中的属性1:用于初始化的函数
    _init: function (huase, point){
        //对于每张牌这个对象,都有花色(如"♣", "♠"等等)
        this.huase = huase;
        //对于每张牌这个对象,都有数字(如 "A", "2","3"等等)
        this.point = point;
    },
    //属性2:用于转换为字符串的函数(可以用于在步骤2的showCards()函数中调用)
    toString : function (){
        return this.huase + this.point
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,761评论 2 17
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,067评论 1 10
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,129评论 25 707
  • 01 最近,《人民的名义》有点被全民追剧的感觉,不追着看看似乎有点太落伍了。 作为一名要赚钱养家,要遛狗带娃,又想...
    AB型双子座阅读 1,678评论 0 22
  • 再好的耐心,也会被一个人磨得所剩无几。 回过头才发现,对你的影响大到再次面对同样状况的时候,无法再如从前,只能变得...
    Tianjincui_阅读 127评论 0 0