规则:4副扑克,5个玩家。
1)有一个大王标记为皇上。每次发牌时,所发牌中有该大王的玩家是皇上。
2)皇帝选择侍卫(也叫保儿、腿子,游戏过程中与皇帝一伙):作为皇上的玩家从自己的牌中选择一张拥有相同三张(点数和花色都相同)的一张牌(不能是2、3、大小王),其他四个玩家中有这张牌的就是侍卫。例如,皇上有三个红桃5,其他四个玩家中有红桃5的玩家就是侍卫。特殊情况是:1.皇上有一套四张牌相同的点数的牌,皇帝可以自己做侍卫;2.皇帝没有满足要求的牌,无法获得侍卫。3. 如果皇上有多种选择,需要与用户进行交互,即需要皇上输入想要使用的牌来选择侍卫情况。
程序要求:程序启动后生成5个玩家,并自动给他们发牌。然后输出:
1)皇帝和侍卫的名字及其手里的牌(每张牌输出为“花色”+“点数”,如红桃5,牌之间用“,”分割),并按照大王、小王、2、A、K、Q、J、10、9、8、7、6、5、4、3的顺序排列,相同点数但不同花色的牌要把相同花色的牌放在一起;
2)那张作为侍卫所特有的牌(“花色”+“点数”)。如果无法得到侍卫,则程序输出相应的提示。例如,程序运行后输出如下的结果:
情况1:只有一种选择,直接生成侍卫(是皇帝自身或者另外一个玩家)
皇帝是player3
皇上的牌是:[皇上, ♚, ♣A, ♣A, ♥A, ♥A, ♥A, ♠A, ♦Q, ♠Q, ♠Q, ♦J, ♥J, ♥J, ♠J, ♠J, ♣10, ♥10, ♣9, ♣9, ♠9, ♠9, ♣8, ♥8, ♠8, ♣7, ♥7, ♣6, ♣6, ♥6, ♠6, ♦5, ♦5, ♥5, ♦4, ♣4, ♠4, ♣3, ♣3, ♣3, ♥3, ♠3, ♠3]
侍卫对应的牌是:♥A
侍卫是player2
侍卫的牌是:[🃏, ♚, ♣2, ♥2, ♦A, ♦A, ♦A, ♥A, ♣K, ♥K, ♥K, ♠K, ♦Q, ♦J, ♠J, ♣10, ♥10, ♥10, ♥10, ♠10, ♦9, ♦9, ♣9, ♣9, ♦8, ♥8, ♠8, ♠8, ♦7, ♣7, ♣7, ♣7, ♠7, ♦6, ♣5, ♠5, ♠5, ♦4, ♣4, ♥4, ♠4, ♦3, ♠3]
情况2:有多种选择,需要进行交互,皇上输入想要使用的牌
皇帝是player3
皇上的牌是:[皇上, ♦2, ♣2, ♦A, ♣A, ♣A, ♠A, ♠A, ♦K, ♥K, ♠K, ♠K, ♣Q, ♣Q, ♥Q, ♦J, ♠J, ♣10, ♣10, ♣10, ♥10, ♦9, ♦9, ♥9, ♥9, ♦7, ♣7, ♣7, ♥7, ♠7, ♦6, ♣6, ♦5, ♣5, ♣5, ♣5, ♥5, ♦4, ♦3, ♦3, ♦3, ♣3, ♥3]
拥有3张相同的:♣10,♣5
请选择想要使用的牌:
♣10
侍卫是player4
侍卫的牌是:[♚, ♦2, ♥2, ♦A, ♣A, ♦K, ♦K, ♣K, ♠K, ♦Q, ♥Q, ♥Q, ♠Q, ♠Q, ♣J, ♣J, ♥J, ♥J, ♠J, ♦10, ♣10, ♥10, ♦9, ♣9, ♣9, ♦8, ♦8, ♥8, ♥7, ♥7, ♠7, ♦6, ♣6, ♥6, ♦5, ♣5, ♥5, ♣4, ♥4, ♥4, ♠4, ♦3, ♥3]
代码如下:
import java.util.*;
//定义扑克牌类,提供equals、toString等方法
class Card {
private String color;
private String size;//点数中有字符JQK,所以定义成String类型
private int index;//记录牌的相对大小,方便排序
@Override
public String toString(){
return color+size;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Card card = (Card) o;
return index == card.index && Objects.equals(color, card.color) && Objects.equals(size, card.size);
}
@Override
public int hashCode() {
return Objects.hash(color, size, index);
}
public Card(String color, String size, int index) {
this.color = color;
this.size = size;
this.index = index;
}
public String getColor() {
return color;
}
public String getSize() {
return size;
}
public int getIndex() {
return index;
}
}
//比较扑克牌相对大小的方法,用于sort按序输出
class compareIndex implements Comparator<Card>{
public int compare(Card c1,Card c2){
return c2.getIndex()-c1.getIndex();
}
}
//麻烦使用IDEA,谢谢
public class Main {
//查找在集合中是否有与被比较元素相同的元素;比较方法,花色和点数相同即相同
public static boolean search(List<Card> cards , Card c){
for(int i = 0;i<cards.size();i++){
if(c.getSize().equals(cards.get(i).getSize())&&c.getColor().equals(cards.get(i).getColor())){
return true;
}
}
return false;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//定义allCards集合储存四副牌
List<Card> allCards = new ArrayList<>();
//初始化四副牌
String[] sizes = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
String[] colors = {"♠","♥","♣","♦"};//IDEA中输入时字符与名称相互对应
for(int i = 0;i<4;i++){
int index = 1;
for(String size:sizes){
for(String color:colors){
Card c = new Card(color,size,index++);
allCards.add(c);
}
}
//添加大小王
Card smallKing = new Card("","♚",index++);
Card bigKing = new Card("","🃏",index++);
Collections.addAll(allCards,smallKing,bigKing);
}
//移除一个大王,并且添加“皇上”牌;remove(Object obj):只移除第一个相同的元素,后面的相同不会移除
allCards.remove(new Card("","🃏",54));
allCards.add(new Card("","皇上",55));//定义皇上牌的相对大小为55,与当大王牌有区分
//洗牌!!!
Collections.shuffle(allCards);//打乱顺序
//定义五个玩家,并且初始化!!!!!!
List<Card>[] players = new ArrayList[5];
for(int i = 0;i<5;i++){
players[i] = new ArrayList<>();
}
//定义一个Map集合给各个玩家赋值编号,方便后面的发牌等遍历
Map<Integer,List> map = new HashMap<>();
for(int i =0;i<5;i++){
map.put(i,players[i]);
}
int kingplayerNo = 0;//用来记录皇帝玩家序号
//给五个玩家发牌并记录皇帝是谁
for(int i = 0,j = 0;i<allCards.size();i++,j++){
if(j == 5)
j = 0;
if (allCards.get(i).equals(new Card("", "皇上", 55))){
/*System.out.println("皇帝是player" + (j+1));*/
kingplayerNo = j;
}
map.get(j).add(allCards.get(i));
}
//给集合中元素按照指定标准排序,将每个玩家扑克排序。
for(int i =0;i<5;i++){
Collections.sort(players[i],new compareIndex());
//System.out.println("player"+(i+1)+"的牌是:"+players[i]);//查看每个玩家的牌
}
//输出皇帝的牌
System.out.println("皇帝是player" + (kingplayerNo+1));
System.out.println("皇上的牌是:"+map.get(kingplayerNo));
//获得皇帝玩家扑克信息,查找相同牌
List<Card> kingplayer = map.get(kingplayerNo);
//记录出现三次或者四次相同牌的信息并储存
int samepokerNumber = 1;
Card[] samecard3 = new Card[10];
int count1 = 0;
Card[] samecard4 = new Card[10];
int count2 = 0;
Card cardFlag = kingplayer.get(1);
for(int i =2;i<kingplayer.size();i++){
if(cardFlag.equals(kingplayer.get(i))&&(cardFlag.getSize().equals("♚")==false)&&(cardFlag.getSize().equals("🃏")==false)&&(cardFlag.getSize().equals("2")==false)&&(cardFlag.getSize().equals("3")==false)){
samepokerNumber++;
}else {
cardFlag = kingplayer.get(i);
samepokerNumber = 1;
}
if(samepokerNumber == 3){
samecard3[count1++] = kingplayer.get(i);
}
if(samepokerNumber == 4){//如果出现四张相同牌,将三张相同牌的集合元素去掉
samecard4[count2++] = kingplayer.get(i);
samecard3[--count1] = null;
}
}
//分析各种侍卫出现的情况
if((count1+count2)==0){
System.out.println("本局皇帝没有侍卫");
}
if(count1 == 0 && count2 >=1){
System.out.println("本局侍卫是皇帝自身");
}
if(count1 == 1 && count2 == 0){
Card c = samecard3[0];
System.out.println("侍卫对应的牌是:"+c);
int protecterNo = 0;
for(int i = 0;i<5;i++){
if(i==kingplayerNo)
continue;
if(search(map.get(i),c)){
protecterNo = i;
break;
}
}
System.out.println("侍卫是player"+(protecterNo+1));
System.out.println("侍卫的牌是:"+map.get(protecterNo));
}
if(count1>=2||((count1+count2)>=2&&count1>=1)){
for(int i =0;i<count1;i++){
if(i==0){
System.out.print("拥有3张相同的:"+samecard3[i]);
}else
System.out.print(","+samecard3[i]);
}
System.out.println();
for(int i =0;i<count2;i++){
if(i==0){
System.out.print("拥有4张相同的:"+samecard4[i]);
}else
System.out.print(","+samecard3[i]);
}
if(count2>0){
System.out.println();
}
System.out.println("请选择想要使用的牌:");
String choose = sc.next();
String firstcolor = "";
String lastsize = "";
firstcolor += choose.charAt(0);
if(choose.length()==2){
lastsize += choose.charAt(1);
}
if(choose.length()==3){
lastsize += choose.charAt(1);
lastsize += choose.charAt(2);
}
Card chooseCard = new Card(firstcolor,lastsize,10);
int flag = 0;
for(int i = 0;i<count2;i++){
if(chooseCard.getColor().equals(samecard4[i].getColor())&&chooseCard.getSize().equals(samecard4[i].getSize())){
System.out.println("本局皇帝选择自己当侍卫");
flag = 1;
break;
}
}
if(flag == 0){
int protecterNo = 0;
for(int i = 0;i<5;i++){
if(i==kingplayerNo)
continue;
if(search(map.get(i),chooseCard)){
protecterNo = i;
break;
}
}
System.out.println("侍卫是player"+(protecterNo+1));
System.out.println("侍卫的牌是:"+map.get(protecterNo));
}
}
}
}
个人作业,如有不足,请多指教。