TypeScript--扑克牌比大小的小游戏

本文介绍了如何设计一个简单的扑克牌游戏,包括Card类(描述扑克牌)和Player类(描述玩家),实现两人轮流抽牌、比较牌面大小并累计得分的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:

有两个人,一副牌(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());

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值