jacks or better video poker (typescript version)

Card

export class Card{
    rank: number;
    suit: string;
    constructor(suit:string, rank:number){
        this.rank = rank;
        this.suit = suit;
    }
    toString():string{
        let new_rank = ''
        switch(this.rank){
            case 14:
                {
                    new_rank = 'A'
                    break
                }
            case 11:
                {
                    new_rank = 'J'
                    break
                }
            case 12:
                {
                    new_rank = 'Q'
                    break
                }
            case 13:
                {
                    new_rank = 'K'
                    break
                }
            default:
                {
                    new_rank = this.rank+''
                    break
                }
        }
        return this.suit + new_rank;
    }
}

// let card:Card = new Card('红桃',12)
// console.log(card.toString());

Poker

import { Card } from "./card";

export class Poker{
    suits: string[] = ['红桃','黑桃','方片','梅花'];
    cards: Array<Card> = new Array<Card>(24);
    constructor(){
        let count = 0;
        for(let i = 0; i < this.suits.length; i++){
            for(let j = 9; j <= 14; j++){
                let card_tmp = new Card(this.suits[i], j);
                this.cards[count++] = card_tmp;
            }
        }
    }

    outputCard(): void{
        let count = 0;
        for(let i = 0; i < this.cards.length; i++){
            if(count % 6 == 0 && count != 0){
                console.log()
            }
            process.stdout.write(this.cards[count++].toString() + ' ')
        }
    }

    shuffleCard(): void{
        for(let i = 0; i < this.cards.length; i++){
            let random_idx = Math.floor(Math.random() * this.cards.length);
            [this.cards[i],this.cards[random_idx]] =  [this.cards[random_idx],this.cards[i]]
        }
    }

    getOneHand(): Array<Card>{
        this.shuffleCard()
        let hands: Array<Card> = []
        for(let i = 0; i < 5; i++){
            hands.push(this.cards[i])
        }
        return hands
    }

    getOneCard(index: number):Card{
        return this.cards[index]
    }

    outputHand(hand: Array<Card>){
        hand.forEach((card) => {
            process.stdout.write(card.toString() + ' ')
        })
    }
    getHandType(hand: Array<Card>): string{
        let suitSets: Set<string> = new Set()
        let rankSets: Set<number> = new Set()
        let rankArr: Array<number> = new Array()
        let rankMap: Map<number,number> = new Map()
        
        hand.forEach((card) => {
            suitSets.add(card.suit)
            rankSets.add(card.rank)
            rankArr.push(card.rank)
            if(rankMap.has(card.rank)){
                let count = rankMap.get(card.rank);
                if(count !== undefined){
                    count++
                    rankMap.set(card.rank, count)
                }
            }
            else{
                rankMap.set(card.rank, 1)
            }
        })

        rankArr.sort((a, b) => a - b)

        let isSameColor = false
        let isStraight = false

        if(rankArr[4] - rankArr[0] === 4 && rankSets.size == 5){
            isStraight = true
        }

        if(suitSets.size == 1){
            isSameColor = true
        }

        if(isStraight&&isSameColor){
            return '同花顺'
        }

        if(isStraight){
            return '顺子'
        }
        if(isSameColor){
            return '同花'
        }

        if(rankSets.size == 2){
            let countArr:Array<number> = [...rankMap.values()]
            if(countArr.includes(4)){
                return '四条'
            }
            else{
                return '满堂红'
            }
        }

        if(rankSets.size == 3){
            let countArr:Array<number> = [...rankMap.values()]
            if(countArr.includes(3)){
                return '311'
            }
            else{
                return '两对'
            }
        }

        if(rankSets.size == 4){
            return '一对'
        }
        if(rankSets.size == 5){
            return '杂牌'
        }
        return ''
    }
}

PokerGame.ts

import { Card } from './card'
import { Poker } from './poker'
let rs = require('readline-sync')
// let poker: Poker = new Poker()
// poker.outputCard()
// // poker.shuffleCard()
// console.log()
// console.log()
// // poker.outputCard()
// let hand: Array<Card> = poker.getOneHand()
// poker.outputHand(hand)

// let type = poker.getHandType(hand)
// console.log();
// console.log(type);
let poker: Poker = new Poker()
let mapPrize: Map<string,number> = new Map()
mapPrize.set("同花顺",100);
mapPrize.set("四条",25);
mapPrize.set("满堂红",10);
mapPrize.set("同花",5);
mapPrize.set("顺子",4);
mapPrize.set("311",3);
mapPrize.set("两对",2);
mapPrize.set("一对",-1);
mapPrize.set("杂牌",-2);

let score = 10
while(score > 0){
    console.log("-----------------------");
    console.log("your current score: " + score);
    score--;
    let hand:Array<Card> = poker.getOneHand()
    poker.outputHand(hand);
    let input:string = rs.question("\nplease input card no what you want to change(0 for exit)\n, input enter key if you do not change any card\n");
    if(input === '0'){
        break
    }
    else if(input.length == 0){
        ;
    }
    else{
        let card_no_arr = input.split(' ')
        for(let i = 0; i < card_no_arr.length; i++){
            let card_no = parseInt(card_no_arr[i])
            card_no--
            hand.splice(card_no, 1, poker.getOneCard(5+i))
        }
    }

    poker.outputHand(hand);
    let type = poker.getHandType(hand)
    console.log();
    console.log(type);
    let prize = mapPrize.get(type)
    console.log(prize);
    score += prize ? prize : 0
}

tsconfig.json

{
  "compilerOptions": {
    "target": "es2020",
    "module": "commonjs",
    "lib": ["es2020"],
    "sourceMap": true,
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "moduleResolution": "node",
    "baseUrl": "src",
    "esModuleInterop": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": ["src/**/*"],
  "exclude": ["dist", "node_modules"],
  "compileOnSave": false
}

运行

ts-node PokerGame.ts
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值