最近写了一个比较大的java作业文件,由于是自己一点一点写的,遇到了一些问题,收获了很多,所以放在这里保存一下。
题目:
模拟保皇游戏开始的发牌过程。规则: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.*;
class Card{
String color;
String no;
boolean isk;
public Card(String c,String n,boolean i ){
color = c;
no = n;
isk = i;
}
public Card(String c,String n ){
color = c;
no = n;
isk = false;
}
public boolean getIsk(){
return isk;
}
public String getColor(){
return color;
}
public String getNo(){
return no;
}
public int getN(){
if(no.equals("大王")) return 17;
else if(no.equals("小王")) return 16;
else if(no.equals("2")) return 15;
else if(no.equals("A")) return 14;
else if(no.equals("K")) return 13;
else if(no.equals("Q")) return 12;
else if(no.equals("J")) return 11;
else return Integer.parseInt(no);
}
public int getM(){
if(color.equals("方片")) return 0;
else if(color.equals("梅花")) return 1;
else if(color.equals("黑桃")) return 2;
else if(color.equals("红桃")) return 3;
return 0;
}
}
class preCard{
ArrayList<Card> c = new ArrayList<Card>();//总牌堆
static int count = 0;
public preCard(int n){
for(int i=0;i<n;i++){
makeCard();
}
}
public void makeCard(){//准备一副牌 洗完加入总牌堆
ArrayList<Card> c1 = new ArrayList<Card>();
String[] co = new String[4];// 四花色赋值数组
co[0] = "红桃";
co[1] = "方片";
co[2] = "黑桃";
co[3] = "梅花";
for(int i=1;i<=13;i++){ // 开始往一副初始牌 装填
if(i==11){
for(int j=0;j<4;j++){
c1.add(new Card(co[j],"J"));
}
}
else if(i==12){
for(int j=0;j<4;j++){
c1.add(new Card(co[j],"Q"));
}
}
else if(i==13){
for(int j=0;j<4;j++){
c1.add(new Card(co[j],"K"));
}
}
else if(i==1){
for(int j=0;j<4;j++){
c1.add(new Card(co[j],"A"));
}
}
else{
for(int j=0;j<4;j++){
c1.add(new Card(co[j],String.valueOf(i)));
}
}
}
if(count == 0){
c1.add(new Card("无","小王"));
c1.add(new Card("无","大王",true));
}
else{
c1.add(new Card("无","小王"));
c1.add(new Card("无","大王"));
}
Collections.shuffle(c1);//洗牌
for(int i=0;i<54;i++){ //加入总牌堆
c.add(c1.get(i));
}
count ++;
}
public ArrayList<Card> getCard(){ //取出牌堆
return c;
}
}
class giveCard{
ArrayList<ArrayList<Card>> a= new ArrayList<ArrayList<Card>>();
public giveCard(ArrayList<Card> h,int n){
for(int i=0;i<n;i++){
a.add(new ArrayList<Card>());
}
int i;
int n1 = h.size()/n; //每个人分一张的轮数
int n2 = h.size()%n; //单独分出来的
for(i=0;i<n1*n;){
for(int j=0;j<n;j++){
a.get(j).add(h.get(i)); i++;
}
}
for(int j=0;j<n2;j++){
a.get(j).add(h.get(i)); i++;
}
}
public ArrayList<ArrayList<Card>> getC(){
return a;
}
}
class So implements Comparator<Card>{
public int compare(Card a,Card b){
if(a.getN()==b.getN()){
return a.getM()-b.getM();
}
else{
return b.getN()-a.getN();
}
}
}
class Player{
ArrayList<Card> a = new ArrayList<Card>();
int n;
boolean King = false;
boolean isDf = false;
public Player(ArrayList<Card> b){//创建玩家
a = b;
Collections.sort(a,new So());
}
public boolean isKing(){
for(int i=0;i<a.size();i++){
if(a.get(i).getIsk()==true){
King = true;
return true;
}
}
return false;
}
public HashMap.Entry <Card,Integer> hasD(){//寻找是否有三个以上
Map<Card,Integer> b = new HashMap<Card,Integer>();
Comparator<Card> m = new So();
for(int i=0;i<a.size();i++){
Iterator<HashMap.Entry<Card,Integer>> p = b.entrySet().iterator();
int c=0;
while(p.hasNext()){// 注意 不能在迭代器中添加元素
Map.Entry<Card,Integer> t = p.next();
if(m.compare(a.get(i),t.getKey())==0){
c=t.getValue();
}
}
if(c==0)
b.put(a.get(i),1);
else b.put(a.get(i),c+1);
}
Iterator<HashMap.Entry<Card,Integer>> p = b.entrySet().iterator();
while(p.hasNext()){
HashMap.Entry<Card,Integer> t = p.next();
if(t.getValue()>=3){
return t;
}
}
Iterator<HashMap.Entry<Card,Integer>> t = b.entrySet().iterator();
return t.next();
}
public boolean isD(Card h){//判断是不是侍卫
Iterator<Card> p = a.iterator();
Comparator <Card> t = new So();
while(p.hasNext()){
if(t.compare(p.next(),h)==0)
return true;
}
return false;
}
public void showC(){
System.out.print("[");
for(int i=0;i<a.size();i++){
if(a.get(i).getColor().equals("无")){
if(i==0)
System.out.print(a.get(i).getNo());
else System.out.print(", "+a.get(i).getNo());
}
else{
if(i==0)
System.out.print(a.get(i).getColor()+a.get(i).getNo());
else System.out.print(", "+a.get(i).getColor()+a.get(i).getNo());
}
}
System.out.print("]");
}
}
public class Main{// 没有排除三张是2或者3 的情况
public static void main(String[] args) {
preCard a = new preCard(4);
giveCard b = new giveCard(a.getCard(),5);
ArrayList<ArrayList<Card>> h = b.getC();
Player[] p = new Player[5];
int k = 0;
for(int i=0;i<5;i++){
p[i] = new Player(h.get(i));
if(p[i].isKing()){
k=i;
}
}
HashMap.Entry<Card,Integer> t1 = p[k].hasD();
if(t1.getValue()==3){
int tt=-1;
for(int i=0;i<5;i++){
if(i!=k){
if(p[i].isD(t1.getKey())){
tt=i;
}
}
}
if(tt!=-1){
System.out.println("皇帝是: 玩家"+(k+1));
System.out.print("皇帝的牌是: ");
p[k].showC();
System.out.println("\n"+"侍卫对应的牌是: "+t1.getKey().getColor()+t1.getKey().getNo());
System.out.println("侍卫是: 玩家"+(tt+1));
System.out.print("侍卫的牌是: "+"\n");
p[tt].showC();
}
}
else if(t1.getValue()==4){
System.out.println("皇帝是: 玩家"+(k+1));
System.out.print("皇帝的牌是: ");
p[k].showC();
System.out.println("\n"+"侍卫对应的牌是: "+t1.getKey().getColor()+t1.getKey().getNo());
System.out.println("侍卫是: 玩家"+(k+1));
System.out.print("侍卫的牌是: "+"\n");
p[k].showC();
}
else{
System.out.println("无侍卫");
}
}
}
其中一种随机输出:
皇帝是: 玩家3
皇帝的牌是: [大王, 大王, 梅花2, 黑桃2, 红桃2, 方片A, 方片A, 黑桃A, 红桃A, 梅花K, 黑桃K, 红桃K, 红桃Q, 红桃Q, 梅花J, 黑桃J, 方片10, 黑桃10, 黑桃10, 梅花9, 梅花9, 梅花9, 黑桃9, 黑桃9, 黑桃9, 方片7, 梅花7, 黑桃7, 方片6, 梅花6, 梅花6, 黑桃6, 黑桃6, 红桃6, 方片5,
梅花5, 方片4, 黑桃4, 方片3, 方片3, 黑桃3, 黑桃3, 黑桃3]
侍卫对应的牌是: 黑桃9
侍卫是: 玩家1
侍卫的牌是:
[大王, 小王, 方片2, 黑桃2, 红桃2, 红桃2, 梅花A, 梅花A, 黑桃A, 红桃A, 红桃A, 方片K, 方片K, 红桃K, 红桃K, 梅花Q, 黑桃Q, 方片J, 方片J, 方片J, 梅花J, 方片10, 梅花10, 黑桃10, 方片9, 黑桃9, 红桃9, 红桃9, 方片8, 梅花8, 方片7, 梅花7, 黑桃7, 梅花6, 黑桃6, 红桃6, 方片5, 方片5, 梅花5, 黑桃5, 方片4, 方片4, 梅花4, 红桃3]
当没有侍卫 那就输出 无侍卫
题目中主要用到两种容器 ArrayList 以及 HashSet
类有Card (用来描述每一片牌)
preCard (构造初始所有牌放在一起的牌堆)
So (Card类的排序方法 comparator)
Player(每一个玩家的牌以及性质描述)