题目描述:
模拟保皇游戏开始的发牌过程。规则: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]
近期老师出了一个实现保皇发牌功能作业,美名其package曰happybaohuang,并开始写代码,结果写了三个小时左右,能力不够,代码较长,欢迎大佬们指教。
以下是本项目代码:
首先需要建立一个包,把所有的类的代码放在包里面,并且在每个代码前面都是package XXX;(自己的包的名字)。
Main.java (主函数)
//2021.6.25
//注释掉的代码都是测试例子,可以对没有输出的数据进行测试
package XXXX;//输入你自己的包的名字
import java.util.LinkedList;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
MyMap shiweicard;
loops:
while(true)
{
Card allcard =new Card();
int shiweiid;
//System.out.println("所有的牌为:");
int flag=0;
Player shiwei=new Player();
//allcard.showCard();//输出所有的牌
//System.out.println();
LinkedList<Player> players=new LinkedList<Player>();
for(int i=0;i<5;i++)
{
LinkedList<MyMap> l=new LinkedList<MyMap>();
Player player=new Player("玩家"+(i+1),l);
players.add(player);
}
int i;
for(i=0;i<43;i++)
{
players.get(0).cards.add(allcard.get(i));
}
for(i=43;i<86;i++)
{
players.get(1).cards.add(allcard.get(i));
}
for(i=86;i<129;i++)
{
players.get(2).cards.add(allcard.get(i));
}
for(i=129;i<172;i++)
{
players.get(3).cards.add(allcard.get(i));
}
for(i=172;i<216;i++)
{
players.get(4).cards.add(allcard.get(i));
}
//System.out.println("玩家1的牌数为:"+players.get(0).cards.size());
//System.out.println("玩家2的牌数为:"+players.get(1).cards.size());
//System.out.println("玩家3的牌数为:"+players.get(2).cards.size());
//System.out.println("玩家4的牌数为:"+players.get(3).cards.size());
//System.out.println("玩家5的牌数为:"+players.get(4).cards.size());
//System.out.println(i);
int huangnum=0;
for(i=0;i<5;i++)
{
if(players.get(i).ishuangdi())
{
System.out.println("皇帝是:"+(players.get(i).getname()));
System.out.println("皇帝的牌是:"+players.get(i).huangdipai());
huangnum=i;
}
}
LinkedList<Linkedclass> chose =new LinkedList<Linkedclass>();
Linkedclass l1=new Linkedclass(players.get(huangnum).getcard().get(0));
chose.add(l1);
for(i=1;i<players.get(huangnum).getcard().size();i++)
{
Linkedclass m=new Linkedclass(players.get(huangnum).getcard().get(i));
for(int j=0;j<chose.size();j++)
{
if(m.equals(chose.get(j)))
{
chose.get(j).addnum();
flag=1;
}
}
if(flag==0)
{
chose.add(m);
}
flag=0;
}
/*
for(i=0;i<chose.size();i++)
{
System.out.println(chose.get(i));
}
*/
int j;
for(j=0;j<chose.size();j++)
{
if(chose.get(j).getnum()==4)
{
System.out.println("侍卫对应的牌是:"+chose.get(j).getmymap());
System.out.println("侍卫是:皇帝本身");
}
if(chose.get(j).getnum()==3)
{
System.out.println("侍卫对应的牌是:"+chose.get(j).getmymap());
shiweicard=chose.get(j).getmymap();
MyMap m1=new MyMap("","大王");
MyMap m2=new MyMap("","小王");
MyMap m3=new MyMap("黑桃","3");
MyMap m4=new MyMap("红桃","2");
MyMap m5=new MyMap("黑桃","2");
MyMap m6=new MyMap("红桃","3");
MyMap m7=new MyMap("方片","2");
MyMap m8=new MyMap("方片","3");
MyMap m9=new MyMap("梅花","2");
MyMap m10=new MyMap("梅花","3");
if(shiweicard.equals(m1)||shiweicard.equals(m2)||shiweicard.equals(m3)||shiweicard.equals(m4)||shiweicard.equals(m5)||shiweicard.equals(m6)||shiweicard.equals(m7)||shiweicard.equals(m8)||shiweicard.equals(m9)||shiweicard.equals(m10))
{
System.out.println("该牌不能当侍卫牌,即将从新发牌。");
continue loops;
}
for(i=0;i<allcard.showsize();i++)
{
if(shiweicard.equals(allcard.get(i))&&!shiweicard.equals("大王")&&!shiweicard.equals("小王")&&!shiweicard.equals("黑桃3")&&!shiweicard.equals("红桃2")&&!shiweicard.equals("黑桃2")&&!shiweicard.equals("红桃3")&&!shiweicard.equals("方片2")&&!shiweicard.equals("方片3")&&!shiweicard.equals("梅花2")&&!shiweicard.equals("梅花3"))
{
shiweiid=i;
if(i<43&&huangnum!=0)
{
shiwei=players.get(0);
System.out.println("侍卫是:玩家1");
System.out.println("侍卫的牌是:"+players.get(0).huangdipai());
break;
}
else if(i>=43&&i<86&&huangnum!=1)
{
shiwei=players.get(1);
System.out.println("侍卫是:玩家2");
System.out.println("侍卫的牌是:"+players.get(1).huangdipai());
break;
}
else if(i>=86&&i<129&&huangnum!=2)
{
shiwei=players.get(2);
System.out.println("侍卫是:玩家3");
System.out.println("侍卫的牌是:"+players.get(2).huangdipai());
break;
}
else if(i>=129&&i<172&&huangnum!=3)
{
shiwei=players.get(3);
System.out.println("侍卫是:玩家4");
System.out.println("侍卫的牌是:"+players.get(3).huangdipai());
break;
}
if(i>=172&&i<216&&huangnum!=4)
{
shiwei=players.get(4);
System.out.println("侍卫是:玩家5");
System.out.println("侍卫的牌是:"+players.get(4).huangdipai());
break;
}
}
}
break loops;
}
}
System.out.println("没有侍卫,即将重新发牌!");
/*
for(i=0;i<players.size();i++)
{
System.out.println(players.get(i));
}
*/
}
}
}
Card.Java
主要用于把牌准备好
package XXX;
import java.util.Collections;
import java.util.LinkedList;
public class Card {
LinkedList<MyMap> c=new LinkedList<MyMap>();
Card()
{
String[] huase= {"黑桃","红桃","方片","梅花"};
String[] number= {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
for(int i=0;i<huase.length;i++)
{
for(int j=0;j<number.length;j++)
{
MyMap thiscard=new MyMap(huase[i],number[j]);
c.add(thiscard);
}
}
for(int i=0;i<huase.length;i++)
{
for(int j=0;j<number.length;j++)
{
MyMap thiscard=new MyMap(huase[i],number[j]);
c.add(thiscard);
}
}
for(int i=0;i<huase.length;i++)
{
for(int j=0;j<number.length;j++)
{
MyMap thiscard=new MyMap(huase[i],number[j]);
c.add(thiscard);
}
}
for(int i=0;i<huase.length;i++)
{
for(int j=0;j<number.length;j++)
{
MyMap thiscard=new MyMap(huase[i],number[j]);
c.add(thiscard);
}
}
MyMap dawang =new MyMap("","大王");
MyMap xiaowang =new MyMap("","小王");
c.add(dawang);
c.add(xiaowang);
MyMap dawang2 =new MyMap("","大王");
MyMap huangshang =new MyMap("","皇上");
huangshang.biaoji=1;
c.add(huangshang);
c.add(xiaowang);
c.add(dawang2);
c.add(xiaowang);
c.add(dawang2);
c.add(xiaowang);
Collections.shuffle(c);//随机排序
}
public int showsize()
{
return c.size();
}
public MyMap get(int i)
{
return c.get(i);
}
public void showCard()
{
for(int i=0;i<c.size();i++)
{
System.out.print(c.get(i)+" ");
}
}
}
MyMap.java
因为自己不喜欢用set,(LinkedList永远的神),所以就建立了一个类似map的类,建立一个此类的链表,比较灵活,还挺好用的。
package XXX;
import java.util.Comparator;
public class MyMap {
String a;
String b;
int biaoji=0;
MyMap(String a,String b)
{
this.a=a;
this.b=b;
}
public int getbiaoji()
{
return this.biaoji;
}
public String geta()
{
return this.a;
}
public String getb()
{
return this.b;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((a == null) ? 0 : a.hashCode());
result = prime * result + ((b == null) ? 0 : b.hashCode());
return result;
}
public int paixuzhunbei()
{
if(this.b=="3")
{
return 16;
}
if(this.b=="4")
{
return 15;
}
if(this.b=="5")
{
return 14;
}
if(this.b=="6")
{
return 13;
}
if(this.b=="7")
{
return 12;
}
if(this.b=="8")
{
return 11;
}
if(this.b=="9")
{
return 10;
}
if(this.b=="10")
{
return 9;
}
if(this.b=="J")
{
return 8;
}
if(this.b=="Q")
{
return 7;
}
if(this.b=="K")
{
return 6;
}
if(this.b=="A")
{
return 5;
}
if(this.b=="2")
{
return 4;
}
if(this.b=="小王")
{
return 2;
}
if(this.b=="大王")
{
return 3;
}
if(this.b=="皇上")
{
return 1;
}
return 0;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MyMap other = (MyMap) obj;
if (a == null) {
if (other.a != null)
return false;
} else if (!a.equals(other.a))
return false;
if (b == null) {
if (other.b != null)
return false;
} else if (!b.equals(other.b))
return false;
return true;
}
@Override
public String toString() {
return a +b ;
}
}
Player.java
此函数主要是用来建立玩家类的,包括玩家的姓名还有玩家手里面的牌。
package XXX;
import java.util.LinkedList;
public class Player {
String name;
LinkedList<MyMap> cards=new LinkedList<MyMap> ();
Player()
{
}
Player(String name,LinkedList<MyMap> cards)
{
this.cards=cards;
this.name=name;
}
public String getname()
{
return this.name;
}
public boolean ishuangdi()
{
for(int i=0;i<cards.size();i++)
{
int j=cards.get(i).getbiaoji();
if(j==1)
{
return true;
}
}
return false;
}
public LinkedList<MyMap> getcard()
{
return this.cards;
}
public LinkedList<MyMap> huangdipai() {
cards.sort(new MyComp());
return cards;
}
@Override
public String toString() {
return name + "的牌是:" + cards ;
}
}
MyComp.java
此函数就是一个实现排序的函数,由于没有什么更好的办法,所以就用了上面的,将每个字母重新赋值了一个int,然后根据这个int排序(一开始是真的没有想到什么好办法,怎么排序都不对)
package XXX;
import java.util.Comparator;
public class MyComp implements Comparator<MyMap>
{
public int compare(MyMap o1, MyMap o2) {
if(!o1.getb().equals(o2.getb()))
{
return o1.paixuzhunbei()-o2.paixuzhunbei();
}
else
return o1.geta().compareTo(o2.geta());
}
}
将这些代码全部组合起来,每个放到一个class中,然后统一放入一个package里面,就可以在自己的电脑上面运行了。