写一个三个人玩斗地主的游戏。实现随机发牌的功能。
使用面向对象的思路完成。
最后把每个玩家的牌在页面展示出来,只展示花色♣️♠️♥️♦️和点数即可。
提示:
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
}
}