基于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();
}
}
}