带你读《现代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 { . . .}
由于处理字符串比我们需要的要困难,我们将把牌字符串转换为具有数字rank和suit值的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) })); . . . // 继续...
-
确定玩家手牌的价值的关键在于知道每个等级的牌有多少张,以及我们有多少计数。例如,如果我们有三张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