带你读《现代TypeScript高级教程》十八、TS实战之扑克牌排序(2)

简介: 带你读《现代TypeScript高级教程》十八、TS实战之扑克牌排序(2)

带你读《现代TypeScript高级教程》十八、TS实战之扑克牌排序(1)https://developer.aliyun.com/article/1348422?groupCode=tech_library


2.我们有什么手牌?

让我们首先定义我们将要构建的handRank()函数。我们的函数将接收一个包含五张牌的元组,并返回一个Hand结果。

 

export function handRank(
 cardStrings: [string, string, string, string, string]): Hand {
 .
 .
 .}

 

由于处理字符串比我们需要的要困难,我们将把牌字符串转换为具有数字ranksuit值的Card对象,以便更容易编写。

 

const cards: Card[] = cardStrings.map((str: string) => ({
   rank: rankToNumber(
     str.substring(0, str.length - 1) as Rank
   ),
   suit: suitToNumber(str.at(-1) as Suit)
 }));
 .
 .
 .
 // 继续...

 

image.png-

 

确定玩家手牌的价值的关键在于知道每个等级的牌有多少张,以及我们有多少计数。例如,如果我们有三张J和两张K,J的计数为3,K的计数为2。然后,知道我们有一个计数为三和一个计数为两的计数,我们可以确定我们有一个葫芦。另一个例子:如果我们有两个Q,两个A和一个5,我们会得到两个计数为两和一个计数为一;我们有两对。

 

生成计数很简单。我们希望A的计数在countByRank[1]处,因此我们不会使用countByRank数组的初始位置。类似地,花色的计数将位于countBySuit[1]countBySuit[4]之间,因此我们也不会使用该数组的初始位置。

// ...继续
 .
 .
 .
 const countBySuit = new Array(5).fill(0);
 const countByRank = new Array(15).fill(0);
 const countBySet = new Array(5).fill(0);
 cards.forEach((card: Card) => {
   countByRank[card.rank]++;
   countBySuit[card.suit]++;
 });
 countByRank.forEach(
   (count: number) => count && countBySet[count]++
 );
 .
 .
 .
 // 继续...

 

我们不要忘记A可能位于顺子的开头(A-2-3-4-5)或结尾(10-J-Q-K-A)。我们可以通过在K之后复制Aces计数来处理这个问题。

 

// ...继续
 .
 .
 .
 countByRank[14] = countByRank[1];
 .
 .
 .
 // 继续...

 

带你读《现代TypeScript高级教程》十八、TS实战之扑克牌排序(3)https://developer.aliyun.com/article/1348419?groupCode=tech_library

相关文章
|
22天前
|
JavaScript Java API
30.【TypeScript 教程】Reflect Metadata
30.【TypeScript 教程】Reflect Metadata
14 4
|
22天前
|
JavaScript 编译器
31.【TypeScript 教程】混入(Mixins)
31.【TypeScript 教程】混入(Mixins)
17 3
|
22天前
|
JavaScript
28.【TypeScript 教程】生成器(Generator)
28.【TypeScript 教程】生成器(Generator)
24 3
|
22天前
|
JavaScript 前端开发
27.【TypeScript 教程】迭代器(Iterator)
27.【TypeScript 教程】迭代器(Iterator)
20 3
|
22天前
|
JavaScript 编译器
35.【TypeScript 教程】编译选项
35.【TypeScript 教程】编译选项
14 2
|
22天前
|
JavaScript 编译器
33.【TypeScript 教程】命名空间
33.【TypeScript 教程】命名空间
18 2
|
22天前
|
JavaScript 存储
25.【TypeScript 教程】infer 关键字
25.【TypeScript 教程】infer 关键字
18 2
|
22天前
|
JavaScript
23.【TypeScript 教程】条件类型
23.【TypeScript 教程】条件类型
12 2
|
22天前
|
JavaScript 开发者
22.【TypeScript 教程】映射类型
22.【TypeScript 教程】映射类型
14 2
|
22天前
|
索引 JavaScript 前端开发
21.【TypeScript 教程】索引类型
21.【TypeScript 教程】索引类型
17 2