问题描述
模拟保皇游戏开始的发牌过程。规则: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]
代码开始
Baohuang.java
package problem5;
import java.util.*;
public class Baohuang {
public static void main(String[] args) {
ArrayList t = new ArrayList();
Cards.CreatCards(t);
player[] Players = new player[5];
for (int i = 0; i < 5; i++) {
Players[i] = new player();
}
player.AcquireCards(Players, t);
player.SortCards(Players);
//
int EmperorNum = player.FindEmperor(Players);
Cards tt = new Cards(0, 0);
int flag = player.EmperorCards(Players, EmperorNum, tt);
Iterator iter2 = Players[EmperorNum].Mine.iterator();
System.out.println("皇帝是" + EmperorNum);
System.out.print("皇帝的牌是:[");
int flag1 = 0;
while (iter2.hasNext()) {
Cards result = (Cards) iter2.next();
if (flag1 == 0) {
System.out.print(Cards.CardsToString(result));
flag1 = 1;
} else
System.out.print("," + Cards.CardsToString(result));
}
System.out.println("]");
if (flag == 1) {
int GuardNum = player.FindGuard(tt, Players, EmperorNum);
System.out.println("侍卫是" + GuardNum);
System.out.println("侍卫的对应的牌是" + Cards.CardsToString(tt));
System.out.print("侍卫的牌是:[");
int flag2 = 0;
Iterator iter3 = Players[GuardNum].Mine.iterator();
while (iter3.hasNext()) {
Cards result = (Cards) iter3.next();
if (flag2 == 0) {
System.out.print(Cards.CardsToString(result));
flag2 = 1;
} else
System.out.print("," + Cards.CardsToString(result));
}
System.out.println("]");
}
if (flag == 2) {
System.out.println("皇帝可以自己当侍卫");
}
if (flag == 0) {
System.out.println("皇帝没有可选的侍卫");
}
}
//
//
// System.out.println(" ");
// while(iter2.hasNext())
// { Cards result=(Cards)iter1.next();
// System.out.print(Cards.CardsToString(result));
// }
}
Cards.java
package problem5;
import java.util.*;
public class Cards {
private int type;
private int num;
Cards(int type,int num)
{
this.type=type;
this.num=num;
}
static String CardsToString(Cards t)//将数字翻译成牌号
{ String s1=null,s2=null;
switch (t.type)
{
case 0:
{s1="黑桃";break;}
case 1:
{s1="红桃";break;}
case 2:
{s1="方片";break;}
case 3:
{s1="梅花";break;}
case 4:
{s1="小王";break;}
case 5:
{s1="大王";break;}
case 6:
{s1="皇帝";break;}
}
switch(t.num)
{
case 8:
{s2="J";break;}
case 9:
{s2="Q";break;}
case 10:
{s2="K";break;}
case 11:
{s2="A";break;}
case 12:
{s2="2";break;}
case 13:
{s2="";break;}
default:
{
s2=Integer.toString(t.num+3);
break;
}
}
return s1+s2;
}
public void setType(int type) {
this.type = type;
}
public void setNum(int num) {
this.num = num;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + num;
result = prime * result + type;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Cards other = (Cards) obj;
if (num != other.num)
return false;
if (type != other.type)
return false;
return true;
}
static void CreatCards(ArrayList t)//创建4副卡牌,并将其存入arraylist中,进行洗牌
{ for(int k=0;k<13;k++)//13种有4种花色的牌
for(int i=0;i<4;i++)//4副
for(int j=0;j<4;j++)//4种花色
{
t.add(new Cards(j,k));
}
for(int i=0;i<4;i++)//4副大王
t.add(new Cards(4,13));
for(int i=0;i<4;i++)//4副小王
t.add(new Cards(5,13));
t.add(new Cards(6,13));
Collections.shuffle(t);
}
public int getType() {
return type;
}
public int getNum() {
return num;
}
/*public static void main(String[] args) {
ArrayList t=new ArrayList();
CreatCards(t);
Iterator iter=t.iterator();
while(iter.hasNext())
{
Cards c=(Cards)iter.next();
System.out.println(c.CardsToString(c));
}
}*/
}
player.java
package problem5;
import java.util.*;
public class player {
ArrayList<Cards> Mine=new ArrayList<Cards>();
class SortByNum implements Comparator<Cards>
{
public int compare(Cards t1,Cards t2)
{
if(t1.getNum()<t2.getNum())
return -1;
else if(t1.getNum()>t2.getNum())
return 1;
else
{
if(t1.getType()<t2.getType())
return -1;
else if(t1.getType()>t2.getType())
return 1;
else
return 0;
}
}
}
static void AcquireCards(player []Players,ArrayList<Cards> t)//每个人获取牌
{
Random r=new Random();
int num=r.nextInt(5);
Iterator iter=t.iterator();
while(iter.hasNext())
{ Cards result=(Cards)iter.next();
Players[num].Mine.add(new Cards(result.getType(),result.getNum()));
num=(num+1)%5;
}
}
static void SortCards(player []Player)
{ player n=new player();
for(int i=0;i<Player.length;i++)
{SortByNum sc=n.new SortByNum();
Collections.sort(Player[i].Mine,sc);
}
}
static int FindEmperor(player []Player)
{ int num=0;
for(int i=0;i<Player.length;i++)
{
if(Player[i].Mine.contains(new Cards(6,13)))
{ num=i;
break;
}
}
return num;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((Mine == null) ? 0 : Mine.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
player other = (player) obj;
if (Mine == null) {
if (other.Mine != null)
return false;
} else if (!Mine.equals(other.Mine))
return false;
return true;
}
static int EmperorCards(player []Player,int num,Cards tt)
{ Cards cd=(Cards)Player[num].Mine.get(0);
Iterator iter=Player[num].Mine.iterator();
int a=cd.getNum();
int b=cd.getType();
Cards et=(Cards)iter.next();
int record=1;
int flag1 =0;
int flag2=0;
int result=0;
while(iter.hasNext())
{ et=(Cards)iter.next();
if(a==et.getNum()&&b==et.getType()&&a!=0&&a!=0&&a!=12&&b!=4&&b!=5&&b!=6)
{
record++;
}
else
{
a=et.getNum();
b=et.getType();
record=1;
}
if(record==3&&flag1==0)
{
flag1=1;
tt.setNum(et.getNum());
tt.setType(et.getType());
}
if(record==4)
{
flag2=1;
}
}
if(flag1==0&&flag2==0)
{
result=0;
}
else if(flag2==1)
{
result=2;
}
else
{
result=1;
}
return result;
}
static int FindGuard(Cards t,player []Player,int num)
{ int result=0;
for(int i=0;i<Player.length;i++)
{
if(Player[i].Mine.contains(new Cards(t.getType(),t.getNum()))&&i!=num)
{
result=i;
break;
}
}
return result;
}
}
输出结果
皇帝是1
皇帝的牌是:[黑桃3,红桃3,红桃3,方片3,黑桃4,黑桃4,红桃4,红桃5,红桃5,红桃5,方片5,方片5,梅花5,梅花5,黑桃6,红桃6,方片6,梅花6,黑桃7,红桃8,红桃8,方片8,黑桃9,黑桃9,方片9,梅花9,黑桃10,梅花10,方片J,方片J,方片Q,方片Q,方片Q,梅花Q,黑桃K,梅花K,红桃A,方片A,方片A,黑桃2,红桃2,红桃2,大王,皇帝]
侍卫是0
侍卫的对应的牌是红桃5
侍卫的牌是:[黑桃3,红桃3,方片3,梅花3,黑桃5,黑桃5,红桃5,方片5,梅花5,梅花5,黑桃6,梅花6,梅花6,黑桃7,红桃7,红桃7,梅花7,梅花7,黑桃8,梅花8,梅花8,黑桃9,红桃9,红桃9,方片9,梅花9,方片10,方片10,梅花10,黑桃J,红桃J,梅花J,梅花J,红桃Q,梅花Q,黑桃K,梅花K,黑桃A,黑桃A,红桃A,黑桃2,小王,小王]
总结
1、要选择恰当的容器。
2、充分利用好容器类的方法。