模拟保皇游戏开始的发牌过程。
规则:4副扑克,5个玩家。1)有一个大王标记为皇上。每次发牌时,所发牌中有该大王的玩家是皇上。2)皇帝选择侍卫(也叫保儿、腿子,游戏过程中与皇帝一伙):作为皇上的玩家从自己的牌中选择一张拥有相同三张(点数和花色都相同)的一张牌(不能是2、3、大小王),其他四个玩家中有这张牌的就是侍卫。例如,皇上有三个红桃5,其他四个玩家中有红桃5的玩家就是侍卫。
特殊情况是:1)皇上有一套四张牌相同的点数的牌,皇帝可以自己做侍卫;2)皇帝没有满足要求的牌,无法获得侍卫。
程序要求:程序启动后生成5个玩家,并自动给他们发牌。然后输出:1)皇帝和侍卫的名字及其手里的牌(每张牌输出为“花色”+“点数”,如红桃5,牌之间用“,”分割),并按照大王、小王、2、A、K、Q、J、10、9、8、7、6、5、4、3的顺序排列,相同点数但不同花色的牌要把相同花色的牌放在一起;2)那张作为侍卫所特有的牌(“花色”+“点数”)。如果无法得到侍卫,则程序输出相应的提示。
输出样例:
皇帝:玩家1
皇帝的牌:[皇上, 小王, 小王, 小王, 小王, 方片2, 黑桃2, 黑桃A, 黑桃A, 红桃A, 方片K, 梅花K, 黑桃K, 红桃K, 梅花Q, 梅花Q, 黑桃Q,方片J, 方片J, 方片J, 红桃J, 梅花9, 黑桃9, 黑桃9, 方片8, 梅花8, 红桃8, 梅花7, 黑桃7, 黑桃7, 红桃7, 梅花6, 梅花6, 黑桃6, 黑桃6, 方片5, 梅花5, 黑桃5, 黑桃5, 梅花4, 梅花4, 梅花4, 方片3, 红桃3]
侍卫对应的牌:方片J
侍卫:玩家2
侍卫的牌:[方片2, 黑桃2, 红桃2, 方片A, 方片K, 梅花K, 梅花K, 黑桃K, 红桃K, 红桃K, 黑桃Q, 红桃Q,方片J, 方片10, 黑桃10, 红桃10, 红桃10, 红桃10, 方片9, 红桃9, 方片8, 梅花8, 梅花8, 黑桃8, 黑桃8, 黑桃8, 红桃8, 红桃8, 方片7, 黑桃7, 黑桃7, 方片6, 黑桃6, 黑桃5, 梅花4, 黑桃4, 红桃4, 红桃4, 方片3, 梅花3, 黑桃3, 红桃3, 红桃3]
思路:
1.先创建一个Card类,类中包含两个属性,牌的花色(用int表示,再将其转化为String类型)和点数,该类实现Comparable接口,可以实现排序,另外该类重写equals方法和toString方法
2.创建一个Player类,类中包含两个属性,玩家名字(String)和玩家的手牌(Card数组),在玩家类中实现对该玩家手牌的排序,重写toString方法,方便输出,再添加两个方法,一个方法找出皇帝牌,一个方法找出保子牌
3.创建一个Card数组,将四副牌中所有的牌存到这个数组中,调用Collections.shuffle()方法打乱顺序
4.将Card数组中的牌依此发给五个玩家
5.对五个玩家中的手牌排序,找出皇帝,并找出侍卫牌,找出侍卫牌后,再找出侍卫
6.按照格式输出
以下为具体实现:
1.Card类实现:
class Card implements Comparable<Card>{
private int colour;//取值范围为1-6,1:红桃,2:黑桃,3:梅花,4:方片,5:小王,6:大王,7:皇帝
private String scolour;
private int value;//取值范围为3-16,3-13为基本牌,14为A,15为2,16为王
private String svalue;
Card(int colour,int value){
this.colour = colour;
this.value = value;
switch(colour){
case 1:
this.scolour = "红桃";
break;
case 2:
this.scolour = "黑桃";
break;
case 3:
this.scolour = "梅花";
break;
case 4:
this.scolour = "方片";
break;
case 5:
this.scolour = "小王";
break;
case 6:
this.scolour = "大王";
break;
case 7:
this.scoluor = "皇帝";
break;
}
switch(value){
case 11:
this.svalue = "J";
break;
case 12:
this.svalue = "Q";
break;
case 13:
this.svalue = "K";
break;
case 14:
this.svalue = "A";
break;
case 15:
this.svalue = "2";
break;
case 16:
this.svalue = "";
break;
default:
this.svalue = String.valueOf(value);
}
}
public int compareTo(Card c){
if(c==this)
return 0;
if(this.value>c.value)
return -1;
else if(this.value<c.value)
return 1;
else{
if(this.colour>c.colour)
return -1;
else if(this.colour<c.colour)
return 1;
else
return 0;
}
}
public int hashCode(){
int result = 17;
result = 31*result+colour;
result = 31*result+value;
return result;
}
public boolean equals(Object obj){
if(this == obj)
return true;
if(obj == null)
return false;
if(getClass() != obj.getClass())
return false;
Card c = (Card)obj;
if(this.colour!=c.colour)
return false;
if(this.value!=c.value)
return false;
return true;
}
public String toString(){
return scolour+svalue;
}
}
2.Player类的实现:
import java.util.Collections;
import java.util.LinkedList;
class Player{
private String name;
public LinkedList<Card> playerscard = new LinkedList<Card>();
Player(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void sortc(){
Collectoins.sort(this.playerscard);
}
public Card IfisEmperor(){//找出并返回侍卫牌,否则返回null
Card c = null;
for(int i=0;i<this.playerscard.size()-2;i++){
if((this.playerscard.get(i).equals(this.playerscard.get(i+1)))&&(this.playerscard.get(i).equals(this.playerscard.get(i+2)))){
c=playerscard.get(i);
break;
}
}
return c;
}
public boolean IfisBodyguard(Card c){//判断玩家是不是侍卫,是的话返回true,否则返回false
int flag=0;
for(int i=0;i<this.playerscard.size();i++){
if(this.playerscard.get(i).equals(c)){
flag=1;
break;
}
}
if(flag==1)
return true;
else
return false;
}
public void show(){
System.out.print("["+this.playerscard.get(0));
for(int i=1;i<this.playerscard.size();i++){
System.out.print(","+this.playerscard.get(i));
}
System.out.print("]");
}
}
3.main函数的实现(控制台类Main的实现)
import java.util.Scanner;
import java.util.Collections;
import java.util.LinkedList;
class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
LinkedList<Card> cards = new LinkedList<Card>();
Player[] players = new Player[5];
//将所有的牌存入cards链表中
for(int i=3;i<16;i++){//十三张基本牌
for(int j=1;j<5;j++){//四个基本花色
for(int k=0;k<4;k++){
cards.add(new Card(j,i));//将四副牌的基本牌存入到数组中
}
}
}
for(int i=0;i<4;i++){//将四副牌的小王存入
cards.add(new Card(5,16));
}
for(int i=0;i<3;i++){//将四副牌中出皇帝牌外的三张大王存入
cards.add(new Card(6,16));
}
cards.add(new Card(7,16));//将皇帝牌存入
for(int i=0;i<5;i++){//初始化玩家姓名
String name = input.nextLine();
players[i] = new Player(name);
}
//洗牌(打乱牌的顺序)
Collections.shuffle(cards);
//发牌
while(!cards.isEmpty()){
for(int i=0;i<5;i++){
if(cards.isEmpty())
break;
players[i].playerscard.add(cards.get(0));
cards.remove(0);
}
}
//给每个玩家排手牌
for(int i=0;i<players.length;i++){
players[i].sortc();
}
//找出皇帝
Card cemperor = null;//皇帝能够叫的侍卫牌
int iemperor = 0;//皇帝在players数组中的位置
String s = "皇帝";
for(int i=0;i<players.length;i++){
if(s.equals(players[i].playerscard.get(0).toString())){
iemperor = i;
cemperor = players[i].IfisEmperor();
}
}
System.out.println("皇帝:"+players[iemperor].getName());
System.out.print("皇帝的牌:");
players[iemperor].show();
System.out.println();
if(cemperor == null){//皇帝没有三张花色一样的牌
System.out.println("皇帝叫不起侍卫牌");
}
else{//皇帝有三张花色一样的牌,找出侍卫,并输出侍卫的牌
System.out.println("侍卫对应的牌:"+cemperor);
System.out.println();
int ibodyguard=0;
for(int i=0;i<players.length;i++){
if(i==iemperor)
continue;
if(players[i].IfisBodyguard(cemperor)){
ibodyguard = i;
break;
}
}
if(ibodyguard==0) {
ibodyguard=iemperor;
System.out.println("皇帝自保");
}
System.out.println("侍卫:"+players[ibodyguard].getName());
System.out.println();
System.out.print("侍卫的牌:");
players[ibodyguard].show();
System.out.println();
}
}
}