Java扑克牌游戏——猜牌型\凑牌型得分

一、猜牌型

1.定义一个单张扑克类(考虑需要哪些属性),定义一个一副扑克牌类,该类包含一个单张扑克对象的数组(不考虑大小王)。实现一个模拟扑克发牌洗牌的算法;

2.电脑随机发出5张牌,判断是以下哪种类型?

由于牌数太多,将牌数缩短为20张,只有10,J,Q,K,A。

Card类包含数值(int)、花色(String)

考虑以下几点:

由于new出的Card对象返回的是哈希码,所以该类要重写toString方法来返回正确的扑克名

J,Q,K,A对应11,12,13,14,所以在toString方法中利用选择判断语句将其转换


public class Card {
    int rank;
    String suit;
    public Card(String suit,int rank){
        this.rank=rank;
        this.suit=suit;
    }

    @Override
    public String toString() {
        String 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=String.valueOf(this.rank);
                break;
            }
        }
        return this.suit+new_rank;
    }
}

Poker类

考虑以下几点:

10张牌,四种花色,生成一副扑克牌

洗牌(随机数,交换)

输出扑克牌

判断牌型

import java.util.*;

public class Poker {
    Card[] cards=new Card[20];
    String[] suits={"红桃","方片","黑桃","草花"};
    public Poker(String[] suits,Card[] cards){
        this.cards=cards;
        this.suits=suits;
    }
    public Poker(){
        int index=0;
        for (int i=0;i<this.suits.length;i++){
            for (int j=10;j<=14;j++){
                Card card=new Card(this.suits[i],j);
                cards[index]=card;
                index++;
            }
        }
    }
    public void shuffle(){
        Random random=new Random();
        for (int i=0;i<20;i++){
            int random_index= random.nextInt(20);
            Card tmp=cards[i];
            cards[i]=cards[random_index];
            cards[random_index]=tmp;
        }
    }
    public List<Card> getOneHand(){
        List<Card> cardList=new ArrayList<>();
        this.shuffle();
        for (int i=0;i<5;i++) cardList.add(cards[i]);
        return cardList;
    }
    public void output(){
        int index=0;
        for (int i=0;i<this.suits.length;i++){
            for (int j=1;j<=5;j++){
                System.out.print(cards[index]);
                index++;
            }
            System.out.println();
        }
    }

    public String getType(List<Card> hand) {
        Set<String> suitSet=new HashSet<>();
        List<Integer> rankList =new ArrayList<>();
        Set<Integer> rankSet=new HashSet<>();
        Map<Integer,Integer> map=new HashMap<>();
        for (Card card:hand){
            suitSet.add(card.suit);
            rankSet.add(card.rank);
            rankList.add(card.rank);

            if (map.containsKey(card.rank)){
                int count=map.get(card.rank);
                count++;
                map.put(card.rank,count);
            }
            else {
                map.put(card.rank,1);
            }
        }
        Collections.sort(rankList);
        boolean isStraight=false;
        boolean isSameColor=false;
        if(rankList.get(4)-rankList.get(0)==4&&rankSet.size()==5){
            isStraight=true;

        }
        if (suitSet.size()==1){
            isSameColor=true;

        }
        if (isStraight&&isSameColor){
            return "同花顺";
        }
        if (isStraight){
            return "顺子";
        }
        if (isSameColor){
            return "同花";
        }
        if (rankSet.size()==4){
            return "一对";
        }
        if (rankSet.size()==5){
            return "无对";
        }
        if (rankSet.size()==2){
            //3带2or4带1
            if (map.containsValue(4)){
                return "四条";
            }else {
                return "满堂红";
            }
        }
        if (rankSet.size()==3){
            //221or311
            if(map.containsValue(3)){
                return "三条";
            }
            else {
                return "两对";
            }
        }
        return "unknown";
    }
    public Card getOneCard(int index){
        return cards[index];
    }
}

主类

调用Poker类,猜测牌型


import java.util.List;

public class Main {
    public static void main(String[] args){
        Card card=new Card("红桃",3);
        //System.out.println(card);

        Poker poker=new Poker();
        poker.shuffle();
        poker.output();

        List<Card> hand =poker.getOneHand();
        //poker.output();
        for (Card card1:hand){
            System.out.print(card1+" ");
        }
        System.out.println();
        String type=poker.getType(hand);
        System.out.println(type);
    }
}

 二、凑牌型得分

  • 同花顺——100分
  • 四条——25
  • 满堂红——10
  • 同花——5
  • 顺子——4
  • 三条——3
  • 两对——2
  • 一对——0
  • 无对——-1

设置倍数:1,2,3,4,5

输入示例:1 2(意为替换1、2位置的牌)

换牌:利用Map,删除相应位置,换成其余的牌

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class PokerGame {
    public static void main(String[] args) {

        Map<String,Integer> mapPrize=new HashMap<>();
        mapPrize.put("同花顺",100);
        mapPrize.put("四条",25);
        mapPrize.put("满堂红",10);
        mapPrize.put("同花",5);
        mapPrize.put("顺子",4);
        mapPrize.put("三条",3);
        mapPrize.put("两对",2);
        mapPrize.put("一对",0);
        mapPrize.put("无对",-1);



        int score=100;
        Poker poker=new Poker();
        Scanner scanner = new Scanner(System.in);
        while(score>0)
        {
            System.out.println("please input your bet");
            int times =scanner.nextInt();
            scanner.nextLine();

            score-=times;

            System.out.println("your score now is:"+score);
            List<Card> hand =poker.getOneHand();
            for (Card card:hand){
                System.out.println(card+" ");
            }
            System.out.println("please input card no you want to change(1-5用空格分割)\n,input enter key if you do not want to change any card,input quit to quit");

            String cmd = scanner.nextLine();
            if (cmd.equals("quit")){
                break;
            }
            else if (!cmd.equals("")){
                String[] arr=cmd.split(" ");
                for (int i=0;i< arr.length;i++){
                    int change_index=Integer.parseInt(arr[i]);
                    change_index--;
                    hand.remove(change_index);//删掉不想要的牌
                    Card tmp=poker.getOneCard(i+5);
                    hand.add(change_index,tmp);//该位置换成其余的新牌
                }
            }
            for (Card card:hand){
                System.out.println(card+" ");
            }

            String card_type=poker.getType(hand);
            System.out.println(card_type);
            int prize=mapPrize.get(card_type);
            System.out.println("prize is "+prize*times);
            score+=prize*times;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值