3.模拟保皇游戏开始的发牌过程。
规则: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]
参考答案
import java.util.*;
public class Main {
public static void main(String[] args) {
Poker p = new Poker(); // 生成1副扑克
String []poker = p.getPoker(); // 获取这副扑克
p.playgame(); // 生成4副扑克,并洗好
List poker_list = p.getPoker_list(); //获取 洗好的牌
//生成五名玩家
PlayUser [] playuser = new PlayUser[5];
for(int i = 0; i < 5; i ++ ){
playuser[i] = new PlayUser(poker);
}
//测试玩家是否生成
// for( int i = 0; i < 5; i ++ ){
// System.out.println(playuser[i].getName());
// }
//发牌并标记皇帝
int flag_index = 0;
for(int i = 0; i < poker_list.size(); i ++){
int t = i % 5;
int index = (int)poker_list.get(i);
(playuser[t].getUser_poker())[index] ++;
if( index == 54 ){ // 表示皇上
flag_index = t;
}
}
//测试发牌是否生成
System.out.println("玩家1-玩家5的牌为:");
for( int i = 0; i < 5; i ++ ){
System.out.println(playuser[i]);
}
// 找到皇上
// System.out.println("\n\n皇上是玩家" + (flag_index + 1));
// 找皇上的侍卫
// 判断皇帝自己能否是侍卫
if( playuser[flag_index].jment()){
System.out.println("\n\n皇上是: " + playuser[flag_index].getName() + "( 可自保 )");
System.out.print("皇上的牌是:");
System.out.println(playuser[flag_index]);
}
else{
List list = playuser[flag_index].select_guard();
System.out.println("皇上有几个3个相同的: " + list.size());
if( list.size() > 1 ){ // 如果皇上有多个3个相同的
int ind = (int) (Math.random() * list.size());
System.out.println("\n\n皇上是: " + playuser[flag_index].getName());
System.out.println(playuser[flag_index]);
System.out.println("侍卫对应的牌是:" + list.get(ind));
for( int i = 0; i < playuser.length ; i ++ ){
if( i != flag_index && playuser[i].getUser_pokers().indexOf(list.get(ind)) != -1 ) {
System.out.println("侍卫是:" + playuser[i].getName());
System.out.print("侍卫的牌是:");
System.out.println(playuser[i]);
}
}
}
else if( list.size() == 1 ){
System.out.println("\n\n皇上是: " + playuser[flag_index].getName());
System.out.println(playuser[flag_index]);
System.out.println("侍卫对应的牌是:" + list.get(0));
for( int i = 0; i < playuser.length; i ++ ){
if( i != flag_index && playuser[i].getUser_pokers().indexOf(list.get(0)) >= 0 ){
System.out.println("侍卫是:" + playuser[i].getName());
System.out.print("侍卫的牌是:");
System.out.println(playuser[i]);
}
}
}
else{
System.out.println("\n\n皇上是: " + playuser[flag_index].getName() + "( 无法获取侍卫 )");
System.out.print("皇上的牌是:");
System.out.println(playuser[flag_index]);
}
}
}
}
class Poker{
private String[] poker;// 生成一幅扑克牌
private final int poker_num = 54;
private List poker_list; // 生成4副扑克牌
String [] poker_type = { "梅花", "方块", "黑桃", "红桃"};
String [] poker_value = {"2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3"};
//生成一幅扑克牌,一幅扑克 54 张
Poker(){
this.poker = new String[this.poker_num];
poker[0] = "大王";
poker[1] = "小王";
for(int i = 2; i < poker_num; ){
for( int j = 0; j < poker_value.length; ++ j ){
for(int k = 0; k < poker_type.length; ++ k ){
poker[i ++] = poker_type[k] + poker_value[j];
}
}
}
}
public String[] getPoker() {
return poker;
}
public List getPoker_list() {
return poker_list;
}
// 生成4副扑克牌
public void playgame() {
poker_list = new ArrayList<Integer>();
for( int i = 0; i < poker.length - 1; i ++ ){
poker_list.add(i);
poker_list.add(i);
poker_list.add(i);
poker_list.add(i);
}
poker_list.add(poker.length - 1);
poker_list.add(poker.length - 1);
poker_list.add(poker.length - 1);
poker_list.add(54); // 皇帝
Collections.shuffle(poker_list); // 进行随机排序
}
}
class PlayUser{
private String name; // 玩家名字
private int [] user_poker = new int[55]; // 玩家手里的牌
private String[] poker;
private static int num = 1;
private boolean bool = false;
public PlayUser(String [] poker) {
this.name = "玩家" + num ++;
this.poker = poker;
for( int i = 0; i < user_poker.length; ++ i ){
user_poker[i] = 0; // 清零
}
}
// 找侍卫
public List select_guard(){
List guard = new ArrayList<String>();
for(int i = 3; i < user_poker.length - 1; i ++ ){
// (点数和花色都相同)的一张牌(不能是2、3、大小王)
if( user_poker[i] == 3 && i != 14){
guard.add( poker[i] );
}
}
return guard;
}
// 判断皇上自己能否当侍卫
public boolean jment(){
for(int i = 3; i < user_poker.length - 1; i ++ ){
// 皇上有一套四张牌相同的点数的牌,皇帝可以自己做侍卫
if( user_poker[i] == 4 ){
return true;
}
}
return false;
}
public String getName() {
return name;
}
public int[] getUser_poker() {
return user_poker;
}
public List getUser_pokers() {
int sum = 0;
List user_list = new ArrayList<String>();
if( user_poker[54] != 0 ){
user_list.add("皇上");
sum += 1;
}
for(int i = 0; i < user_poker.length - 1; i ++ ){
sum += user_poker[i];
for( int j = 0; j < user_poker[i]; j ++ ){
user_list.add( poker[i] );
}
}
//测试每个玩家几张牌
// System.out.println(sum);
return user_list;
}
public String toString(){
String res = "[";
List user_list = getUser_pokers();
for(int i = 0; i < user_list.size() - 1; i ++ ){
res += user_list.get(i) + ", ";
}
return res + user_list.get(user_list.size() - 1) + "]";
}
}
测试结果1
玩家1-玩家5的牌为:
[皇上, 大王, 大王, 小王, 方块2, 方块2, 黑桃2, 红桃2, 梅花A, 梅花A, 方块A, 红桃A, 红桃A, 梅花K, 方块K, 黑桃K, 黑桃K, 红桃K, 红桃K, 梅花Q, 红桃Q, 红桃Q, 黑桃J, 红桃J, 梅花10, 方块10, 梅花9, 方块9, 黑桃9, 梅花8, 梅花8, 方块7, 黑桃7, 红桃7, 红桃6, 红桃6, 红桃6, 梅花5, 梅花5, 方块5, 方块5, 黑桃5, 方块4, 黑桃4]
[梅花2, 方块2, 黑桃2, 红桃2, 红桃2, 梅花A, 方块A, 黑桃A, 红桃A, 梅花K, 黑桃K, 红桃K, 方块Q, 黑桃Q, 红桃Q, 红桃Q, 黑桃J, 黑桃J, 红桃J, 梅花10, 方块9, 红桃9, 梅花8, 方块8, 黑桃8, 黑桃8, 梅花7, 梅花6, 梅花6, 方块6, 方块6, 方块6, 方块5, 方块5, 红桃5, 红桃5, 梅花3, 梅花3, 梅花3, 方块3, 方块3, 方块3, 红桃3]
[小王, 梅花2, 黑桃2, 黑桃2, 红桃2, 梅花Q, 梅花Q, 方块Q, 方块Q, 梅花J, 梅花J, 梅花J, 方块J, 方块J, 红桃J, 梅花10, 方块10, 红桃10, 梅花9, 黑桃9, 黑桃9, 黑桃9, 红桃9, 方块8, 方块8, 黑桃8, 梅花7, 方块7, 方块7, 黑桃7, 梅花6, 梅花6, 黑桃6, 黑桃5, 黑桃5, 红桃5, 梅花4, 梅花4, 梅花4, 方块4, 红桃4, 黑桃3, 黑桃3]
[大王, 小王, 小王, 梅花2, 方块2, 方块A, 方块A, 红桃A, 方块K, 方块K, 梅花Q, 方块Q, 黑桃Q, 梅花J, 方块J, 黑桃J, 方块10, 黑桃10, 黑桃10, 红桃10, 梅花9, 红桃9, 梅花8, 红桃8, 红桃8, 红桃8, 红桃8, 方块7, 黑桃7, 黑桃7, 红桃7, 红桃7, 方块6, 黑桃6, 黑桃6, 梅花5, 红桃5, 黑桃4, 红桃4, 梅花3, 方块3, 黑桃3, 红桃3]
[大王, 梅花2, 梅花A, 黑桃A, 黑桃A, 黑桃A, 梅花K, 梅花K, 方块K, 黑桃K, 红桃K, 黑桃Q, 黑桃Q, 方块J, 红桃J, 梅花10, 方块10, 黑桃10, 黑桃10, 红桃10, 红桃10, 梅花9, 方块9, 方块9, 红桃9, 方块8, 黑桃8, 梅花7, 梅花7, 红桃7, 黑桃6, 红桃6, 梅花5, 黑桃5, 梅花4, 方块4, 方块4, 黑桃4, 黑桃4, 红桃4, 红桃4, 黑桃3, 红桃3]
皇上有几个3个相同的: 1
皇上是: 玩家1
[皇上, 大王, 大王, 小王, 方块2, 方块2, 黑桃2, 红桃2, 梅花A, 梅花A, 方块A, 红桃A, 红桃A, 梅花K, 方块K, 黑桃K, 黑桃K, 红桃K, 红桃K, 梅花Q, 红桃Q, 红桃Q, 黑桃J, 红桃J, 梅花10, 方块10, 梅花9, 方块9, 黑桃9, 梅花8, 梅花8, 方块7, 黑桃7, 红桃7, 红桃6, 红桃6, 红桃6, 梅花5, 梅花5, 方块5, 方块5, 黑桃5, 方块4, 黑桃4]
侍卫对应的牌是:红桃6
侍卫是:玩家5
侍卫的牌是:[大王, 梅花2, 梅花A, 黑桃A, 黑桃A, 黑桃A, 梅花K, 梅花K, 方块K, 黑桃K, 红桃K, 黑桃Q, 黑桃Q, 方块J, 红桃J, 梅花10, 方块10, 黑桃10, 黑桃10, 红桃10, 红桃10, 梅花9, 方块9, 方块9, 红桃9, 方块8, 黑桃8, 梅花7, 梅花7, 红桃7, 黑桃6, 红桃6, 梅花5, 黑桃5, 梅花4, 方块4, 方块4, 黑桃4, 黑桃4, 红桃4, 红桃4, 黑桃3, 红桃3]
测试结果2
玩家1-玩家5的牌为:
[大王, 梅花2, 方块2, 方块2, 黑桃2, 黑桃2, 黑桃A, 梅花K, 方块K, 方块K, 黑桃K, 方块Q, 黑桃Q, 梅花J, 方块J, 方块J, 黑桃J, 黑桃J, 红桃J, 梅花10, 梅花10, 黑桃10, 红桃10, 方块9, 梅花8, 方块8, 黑桃8, 黑桃8, 红桃8, 方块7, 方块7, 黑桃7, 梅花6, 方块6, 黑桃6, 方块5, 红桃5, 红桃5, 梅花4, 梅花4, 黑桃4, 黑桃4, 红桃4, 红桃4]
[小王, 红桃2, 梅花A, 梅花A, 方块A, 方块A, 红桃A, 梅花K, 红桃K, 梅花Q, 方块Q, 黑桃Q, 梅花J, 梅花J, 梅花J, 方块J, 梅花10, 方块10, 方块10, 红桃10, 梅花9, 方块9, 方块9, 红桃9, 红桃9, 红桃8, 梅花7, 梅花7, 黑桃7, 梅花6, 方块6, 黑桃6, 红桃6, 红桃6, 梅花5, 梅花5, 方块5, 梅花4, 红桃4, 方块3, 方块3, 方块3, 黑桃3]
[皇上, 大王, 小王, 小王, 方块2, 黑桃2, 黑桃2, 梅花A, 方块A, 黑桃A, 红桃A, 红桃A, 梅花K, 方块K, 红桃Q, 红桃Q, 红桃Q, 红桃Q, 红桃J, 黑桃10, 方块9, 黑桃9, 黑桃9, 梅花8, 方块8, 梅花7, 方块7, 黑桃7, 红桃7, 红桃7, 梅花6, 红桃6, 梅花5, 黑桃5, 黑桃5, 黑桃5, 红桃5, 梅花4, 方块4, 方块4, 方块3, 红桃3, 红桃3]
[大王, 大王, 小王, 梅花2, 方块2, 红桃2, 红桃2, 梅花A, 黑桃A, 黑桃K, 红桃K, 红桃K, 梅花Q, 梅花Q, 黑桃Q, 黑桃J, 红桃J, 红桃J, 方块10, 方块10, 黑桃10, 红桃10, 梅花9, 黑桃9, 黑桃9, 红桃9, 红桃9, 梅花8, 梅花8, 方块8, 红桃8, 梅花7, 方块7, 梅花6, 方块6, 方块6, 黑桃6, 方块5, 黑桃5, 方块4, 方块4, 黑桃4, 黑桃3]
[梅花2, 梅花2, 红桃2, 方块A, 黑桃A, 红桃A, 梅花K, 方块K, 黑桃K, 黑桃K, 红桃K, 梅花Q, 方块Q, 方块Q, 黑桃Q, 方块J, 黑桃J, 梅花10, 黑桃10, 红桃10, 梅花9, 梅花9, 方块8, 黑桃8, 黑桃8, 红桃8, 黑桃7, 红桃7, 红桃7, 黑桃6, 红桃6, 梅花5, 方块5, 红桃5, 黑桃4, 红桃4, 梅花3, 梅花3, 梅花3, 梅花3, 黑桃3, 黑桃3, 红桃3]
皇上是: 玩家3( 可自保 )
皇上的牌是:[皇上, 大王, 小王, 小王, 方块2, 黑桃2, 黑桃2, 梅花A, 方块A, 黑桃A, 红桃A, 红桃A, 梅花K, 方块K, 红桃Q, 红桃Q, 红桃Q, 红桃Q, 红桃J, 黑桃10, 方块9, 黑桃9, 黑桃9, 梅花8, 方块8, 梅花7, 方块7, 黑桃7, 红桃7, 红桃7, 梅花6, 红桃6, 梅花5, 黑桃5, 黑桃5, 黑桃5, 红桃5, 梅花4, 方块4, 方块4, 方块3, 红桃3, 红桃3]
测试结果3
玩家1-玩家5的牌为:
[大王, 大王, 梅花A, 梅花A, 梅花A, 黑桃A, 黑桃A, 红桃A, 黑桃K, 方块Q, 红桃Q, 红桃Q, 梅花J, 方块J, 方块10, 方块10, 方块10, 红桃10, 梅花9, 方块8, 红桃8, 红桃8, 黑桃7, 黑桃7, 红桃7, 梅花6, 方块6, 黑桃6, 黑桃6, 红桃6, 红桃6, 方块5, 方块5, 方块5, 黑桃5, 红桃5, 梅花4, 方块4, 红桃4, 梅花3, 方块3, 方块3, 黑桃3, 红桃3]
[小王, 梅花2, 梅花2, 黑桃2, 红桃2, 红桃2, 梅花A, 方块A, 红桃A, 梅花K, 梅花Q, 方块Q, 方块Q, 方块Q, 黑桃Q, 黑桃Q, 梅花J, 梅花J, 方块J, 黑桃J, 黑桃J, 红桃J, 方块10, 黑桃10, 红桃10, 红桃10, 梅花9, 梅花9, 方块9, 方块9, 黑桃8, 黑桃8, 红桃8, 方块7, 方块7, 黑桃7, 梅花5, 红桃5, 方块4, 方块4, 梅花3, 梅花3, 黑桃3]
[小王, 方块2, 方块2, 黑桃2, 黑桃A, 方块K, 方块K, 方块K, 黑桃K, 红桃K, 红桃K, 梅花Q, 梅花Q, 黑桃Q, 梅花J, 方块J, 红桃J, 梅花10, 梅花10, 黑桃10, 黑桃10, 红桃10, 黑桃9, 黑桃9, 红桃9, 红桃9, 红桃9, 梅花8, 梅花8, 梅花8, 方块8, 梅花7, 梅花6, 梅花6, 方块6, 方块6, 黑桃6, 黑桃5, 黑桃4, 红桃4, 梅花3, 方块3, 方块3]
[皇上, 大王, 大王, 小王, 梅花2, 方块2, 黑桃2, 红桃A, 红桃A, 梅花K, 梅花K, 红桃K, 红桃K, 黑桃Q, 方块J, 黑桃J, 红桃J, 梅花10, 黑桃10, 梅花9, 方块9, 黑桃9, 红桃9, 梅花8, 方块8, 方块8, 黑桃8, 红桃8, 梅花7, 方块7, 方块7, 黑桃7, 红桃7, 梅花6, 梅花5, 梅花5, 黑桃5, 红桃5, 梅花4, 方块4, 黑桃4, 红桃4, 红桃3]
[小王, 梅花2, 方块2, 黑桃2, 红桃2, 红桃2, 方块A, 方块A, 方块A, 黑桃A, 梅花K, 方块K, 黑桃K, 黑桃K, 梅花Q, 红桃Q, 红桃Q, 黑桃J, 红桃J, 梅花10, 方块9, 黑桃9, 黑桃8, 梅花7, 梅花7, 红桃7, 红桃7, 方块6, 黑桃6, 红桃6, 红桃6, 梅花5, 方块5, 黑桃5, 红桃5, 梅花4, 梅花4, 黑桃4, 黑桃4, 红桃4, 黑桃3, 黑桃3, 红桃3]
皇上有几个3个相同的: 0
皇上是: 玩家4( 无法获取侍卫 )
皇上的牌是:[皇上, 大王, 大王, 小王, 梅花2, 方块2, 黑桃2, 红桃A, 红桃A, 梅花K, 梅花K, 红桃K, 红桃K, 黑桃Q, 方块J, 黑桃J, 红桃J, 梅花10, 黑桃10, 梅花9, 方块9, 黑桃9, 红桃9, 梅花8, 方块8, 方块8, 黑桃8, 红桃8, 梅花7, 方块7, 方块7, 黑桃7, 红桃7, 梅花6, 梅花5, 梅花5, 黑桃5, 红桃5, 梅花4, 方块4, 黑桃4, 红桃4, 红桃3]