需求:
有两个人,一副牌(54张),轮流抽牌。每人拿出一张比大小,谁大谁得一分,最终比较总分
// game.ts 扑克牌小游戏
//需要两个类:Player,Card
// 设计一个扑克类,描述扑克牌
// 花色
enum Suit {黑桃,红桃,梅花,方块,王}
// 数值,RB 小王,RR大王
enum Rank {R3,R4,R5,R6,R7,R8,R9,R10,RJ,RQ,RK,RA,R2,RB,RR}
// 创建Card类
class Card{
suit:Suit; // 花色,从Suit枚举中选择
rank:Rank; // 点数,从Rank枚举中选择
constructor(suit:Suit,rank:Rank){
this.suit = suit;
this.rank = rank;
}
toString(){ // 返回一个描述扑克牌的字符串 通过属性反查枚举
let s = Suit[this.suit]
let r = Rank[this.rank]
if(this.rank==Rank.RB) return '小王'
if(this.rank==Rank.RR) return '大王'
return s + r.substring(1)
}
}
let a = new Card(Suit.黑桃, Rank.RA) // 创建一个黑桃A
console.log(a.toString()) // 写个toString方法返回一个描述扑克牌的字符串
// 创建54张牌,撞到cards数组中
let cards:Card[] = []
// 不仅需要遍历花色,还需要遍历点数,使用双层for循环穿件52张牌,push进数组
for(let suit=Suit.黑桃;suit<=Suit.方块;suit++){
for(let rank=Rank.R3;rank<=Rank.R2;rank++){
let card = new Card(suit,rank)
cards.push(card)
}
}
cards.push(new Card(Suit.王,Rank.RB))
cards.push(new Card(Suit.王,Rank.RR))
// 数组的toString方法将会自动调用元素的toString方法得到字符串,然后输出
console.log(cards.toString());
// 设计一个玩家类,描述玩家
class Player{
name:string;
score:number;
handCards:Card[]
// 构造方法传入的后两个参数,给出默认值
constructor(name:string,score:number=0,handCards:Card[]=[]){
this.name = name;
this.score = score;
this.handCards = handCards
}
/** 抽牌业务
* 传入参数:总的牌堆
* 丛总牌堆中随机删除一张,加入到自己的手牌中即可完成抽牌业务
*/
choupai(cards:Card[]){
// 随机获取一个下标
let index = Math.floor(Math.random() * cards.length)
let deleted = cards.splice(index,1) // 删除元素并返回被删掉的元素
this.handCards.push(deleted[0])
}
/** 出牌业务
* 可以随机出牌,在此,可以直接返回手牌中的第一张,并从手牌中删除
*/
chupai(){
return this.handCards.pop()
}
/** 将Player对象输出为字符串 */
toString(){
return `姓名:${this.name}\n得分:${this.score}\n手牌:${this.handCards.toString()}`
}
}
// 创建两个玩家
let p1 = new Player('张三')
let p2 = new Player('李四')
// 两个人轮流不断从拍堆中随机抽牌,抽到后加入到自己手牌,知道牌堆抽光
while(cards.length>0){
p1.choupai(cards)
p2.choupai(cards)
}
console.log('p1:',p1.handCards.toString());
console.log('p2:',p2.handCards.toString());
// 轮番出牌比较大小
while(true){
let c1 = p1.chupai()
let c2 = p2.chupai()
if(!c1 || !c2){
break;
}
if(c1.rank>c2.rank){
p1.score++
}
if(c1.rank<c2.rank){
p2.score++
}
}
console.log(p1.toString());
console.log(p2.toString());