基於JAVA集合寫的一個梭哈遊戲

基於JAVA集合寫的一個梭哈遊戲。

遊戲思路:
1,首先使用一個List數組保存一副無序的撲克牌(使用集合工具類)
2,使用一個Map集合和TreeSet集合保存玩家手上的手牌
3,使用一個Map集合保存玩家手牌所對應的分數
4,從寫Comparator接口裏面的compare函數,並且是TreeSet使用這種排序,
對玩家手上的牌進行大小排序
5,利用梭哈的遊戲規則,進行玩家手牌分數自定義。

package com.langxikeji.Set;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeSet;

public class ShowHand {
    //儲存一幅撲克牌
    public static List<String>puke =new ArrayList<>();
    //保存玩家的對應的撲克牌
    public static Map<String,TreeSet<String>>map=new HashMap<>();
    //儲存玩家的總分
    public static Map<String,Double>sumScore=new HashMap<>();
    //添加一幅撲克牌,並且隨機打亂
    public static boolean flag=true;
    public static void countPuke(){
        String []num={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
        String []color={"紅桃","梅花","方塊","黑桃"};
        for(int i=0;i<num.length;i++){
            for(int j=0;j<color.length;j++){
                puke.add(color[j]+num[i]);
            }
        }
        Collections.shuffle(puke);
        System.out.println("一副隨機的撲克牌:");
        System.out.println(puke);
        System.out.println("---------------------");
    }
    //給每位玩家發牌
    public static void fapai(){
        for(int i=0;i<5;i++){
            for(String key:map.keySet()){
                String puke1 = puke.remove(0);
                map.get(key).add(puke1);
            }
        }
        for(String key:map.keySet()){
            System.out.println("玩家名稱"+key+":"+map.get(key));
        }
    }
    //控制檯輸入參與遊戲的玩家
        public static void joinplayer(){
            System.out.println("請輸入玩家的姓名,相鄰名字請用空格( )隔開!");
            Scanner sc = new Scanner(System.in);
            String str=sc.nextLine();
            String [] name=str.split(" ");
            if(!(name.length>=2&&name.length<=5)){ 
                System.out.println("參加遊戲的人數不符合規則,程序退出");
                flag=false;
                return;
            }
            //對玩家手牌進行排序
            Comparator<String>comp=new Comparator<String>(){
                public int compare(String str1,String str2){
                    int num1=getNum(str1.substring(2));
                    int num2=getNum(str2.substring(2));
                    if(num1>num2){
                        return 1;
                    }else if(num1<num2){
                        return -1;
                    }else{
                        int type1=getType(str1.substring(0,2));
                        int type2=getType(str2.substring(0,2));
                        if(type1>type2){
                            return 1;
                        }else{
                            return -1;
                        }
                    }
                }
            };
            for(int i=0;i<name.length;i++){
                map.put(name[i],new TreeSet<String>(comp));
            }
        }
    //把撲克牌的點數全部換成數字,便於比較大小
    public static int getNum(String num){
        if("A".equals(num)){
            return 1;
        }else if("J".equals(num)){
            return 11;
        }else if("Q".equals(num)){
            return 12;
        }else if("K".equals(num)){
            return 13;
        }else{
            return Integer.parseInt(num);
        }
    }
    //把撲克牌的花色全部換成數字,便於比較
    public static int getType(String Type){
        if("黑桃".equals(Type)){
            return 4;
        }else if("紅桃".equals(Type)){
            return 3;
        }else if("梅花".equals(Type)){
            return 2;
        }else{
            return 1;

        } 
    }
    public static void getScore(){
     double winnerScore=0;
     String winner=null;
     for(String key:map.keySet()){
         TreeSet<String>set=map.get(key);
         double score=score(set);
         sumScore.put(key, score);
         for(String key1:sumScore.keySet()){
             if(sumScore.get(key1)>winnerScore){
                 winnerScore=sumScore.get(key1);
                 winner=key1;
             }
         }
     } 
     System.out.println("-------------------------------");
     for(String key:sumScore.keySet()){
     System.out.println("玩家名稱"+key+":"+map.get(key)+"分數是:"+sumScore.get(key));
     }
     System.out.println("獲勝者是:"+winner+","+"分數是:"+winnerScore);

    }
     public static double score(TreeSet<String>set){
         double score=0;
         String [] pukepai=set.toArray(new String[set.size()]);
         //同花大順>同花順
         for(int i=0;i<pukepai.length;i++){
             int num1=getNum(pukepai[i].substring(2));
             int num2=getNum(pukepai[i+1].substring(2));
             int type1=getType(pukepai[i].substring(0, 2));
             int type2=getType(pukepai[i+1].substring(0, 2)); 
             if(num1-num2!=1&&type1!=type2){
                 flag=false;
                 break;
             }
         }
         if(flag){
             score=6.0+getNum(pukepai[4].substring(2))*0.01;
             return score;
         }
        //順子(花色不想同但連續的牌)12345
         for(int i=0;i<pukepai.length;i++){
             int num1=getNum(pukepai[i].substring(2));
             int num2=getNum(pukepai[i+1].substring(2));
             if(num1-num2!=1){
                 flag=false;
                 break;
             }
         }
         if(flag){
             score=3.5+getNum(pukepai[4].substring(2))*0.01;
             return score;
         }
         //取出撲克牌的數字
         int point1=getNum(pukepai[0].substring(2));
         int point2=getNum(pukepai[1].substring(2));
         int point3=getNum(pukepai[2].substring(2));
         int point4=getNum(pukepai[3].substring(2));
         int point5=getNum(pukepai[4].substring(2));
         //取出撲克牌的花色
         int type1=getType(pukepai[0].substring(0,2)); 
         int type2=getType(pukepai[1].substring(0,2));
         int type3=getType(pukepai[2].substring(0,2));
         int type4=getType(pukepai[3].substring(0,2));
         int type5=getType(pukepai[4].substring(0,2));
         //(炸彈)11112 12222 (四條)
         if(point1==point2&&point2==point3&&point3==point4||point2==point3&&point3==point4&&point4==point5){
             score=5.0+getNum(pukepai[2].substring(2))*0.01;
             return score;
         }
         //滿堂紅11122  11222(三條+一對)
         else if(point1==point2&&point2==point3&&point4==point5||point1==point2&&point3==point4&&point4==point5){
             score=4.5+getNum(pukepai[2].substring(2))*0.01;
                     return score;
         }
         //同花(花色相同)
         else if(type1==type2&&type2==type3&&type3==type4&&type4==type5){
             score=4.0+getNum(pukepai[4].substring(2))*0.01;
             return score;
         }
         //三條 111xy xyKKK xKKKy
         else if(point1==point2&&point2==point3||point2==point3&&point3==point4||point3==point4||point4==point5){
             score=3.0+getNum(pukepai[2].substring(2))*0.01;
             return score;
         }
         //兩對 1122x 11x22 x1122
         else if(point1==point2&&point3==point4||point1==point2&&point4==point5||point2==point3&&point3==point4){
             score=2.5+getNum(pukepai[3].substring(2))*0.01;
             return score;
         }
         //一對 11xyz x11yz xy11z xyz11(未判斷如果兩人的撲克牌對子相同的牌面最大值)
         else if(point1==point2){
             score=2+getNum(pukepai[0].substring(2))*0.01;
             return score;
         }
         else if(point2==point3){
             score=2+getNum(pukepai[1].substring(2))*0.01;
             return score;
         }
         else if(point3==point4){
             score=2+getNum(pukepai[2].substring(2))*0.01;
             return score;
         }
         else if(point4==point5){
             score=2+getNum(pukepai[3].substring(2))*0.01;
             return score;
         }else{
             score=1+getNum(pukepai[4].substring(2))*0.01;
             return score;
         }
     }
   public static void main(String []args){
       countPuke();
       joinplayer();
       if(flag){
           fapai();
           getScore();
       }
       }
       }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章