内容要求:
编写程序,项目名和类名均为PokerGame。实现功能如下:
1. 共有m幅扑克牌,每幅扑克牌不包括大王和小王共52张牌。
2. 可能有n个人参与扑克游戏,2<=n<=52。
3. 程序运行时输入扑克牌幅数m和人数n,然后所有牌分别依次分发给n个人。不能整除时,每个人的牌数可以不同,如3个人1幅牌,则第1个人18张,第2个和第3个人17张牌。
4. 发牌完成后按花色(顺序为黑桃、红心、草花、方块)和牌面大小输出每个人得到的牌。
下面是一个运行示例:
输入扑克牌幅数:1 输入人数:3 输出如下: 第1个人: 黑桃:K 10 5 A 红心:10 3 2 草花:K 10 8 6 3 A 方块:Q J 5 2 第2个人: ....... 第3个人: ......
分析:构建两个类,一位玩家类和一副牌类,玩家有清空手牌(初始化)方法和展示手牌(输出)方法,牌有取一副新牌(初始化)方法和随机发一张方法。游戏开始前,输入牌的副数和玩家人数,建立一群玩家对象(对象数组)和一副牌对象。
游戏开始,发牌方式为每轮次每人发一张,避开不整除的问题。每次取一副牌发,52张后判断是否要再发一副牌,直到牌发完为止。
游戏结束,循环调用展示手牌方法输出每位玩家的手牌。
难点在于发牌的逻辑思维要足够清晰,一群玩家对象数组需要先实例化否则会报空指针的错误。
代码片段如下:
public class Poker {//一副牌类
boolean[] out=new boolean[53];
public void init()//取一副牌开始发(初始化)
{
for(int i=0;i<53;i++)
out[i]=true;
}
public int getpoker()//随机发一张牌
{
int x;
while(true) {
x = (int) (Math.random() * 52) + 1;
if(out[x]==true){out[x]=false;break;}
}
return x;
}
}
public class Gamer {//一位玩家类
int[] hand=new int[53];
public void init(){//清空玩家手中的牌(初始化)
for(int i=0;i<53;i++)
hand[i]=0;
}
public void show(int[] hand){//输出玩家手中所有花色牌
System.out.print("黑桃:");
for(int i=13;i>=1;i--)
for(int j=hand[i];j>0;j--)
{
int k=i%13;
if(k==11)System.out.print("J ");
else if(k==12)System.out.print("Q ");
else if(k==0)System.out.print("K ");
else System.out.printf("%d ",k);
}
System.out.println();
System.out.print("红心:");
for(int i=26;i>=14;i--)
for(int j=hand[i];j>0;j--)
{
int k=i%13;
if(k==11)System.out.print("J ");
else if(k==12)System.out.print("Q ");
else if(k==0)System.out.print("K ");
else System.out.printf("%d ",k);
}
System.out.println();
System.out.print("草花:");
for(int i=39;i>=27;i--)
for(int j=hand[i];j>0;j--)
{
int k=i%13;
if(k==11)System.out.print("J ");
else if(k==12)System.out.print("Q ");
else if(k==0)System.out.print("K ");
else System.out.printf("%d ",k);
}
System.out.println();
System.out.print("方块:");
for(int i=52;i>=40;i--)
for(int j=hand[i];j>0;j--)
{
int k=i%13;
if(k==11)System.out.print("J ");
else if(k==12)System.out.print("Q ");
else if(k==0)System.out.print("K ");
else System.out.printf("%d ",k);
}
System.out.println();
}
}
import java.util.Scanner;
public class PokerGame {
public static void main(String[] args) {
int pokernum;//牌的副数
int gamernum;//玩家人数
Scanner sc=new Scanner(System.in);
System.out.print("输入扑克牌幅数:");
pokernum=sc.nextInt();
System.out.print("输入人数:");
gamernum=sc.nextInt();
Poker onepoker=new Poker();//创建一个对象,表示一副牌
Gamer[] onegamer=new Gamer[gamernum+1];//创建一个对象数组并实例化,表示一群玩家
for(int i=1;i<=gamernum;i++) {
onegamer[i] = new Gamer();
onegamer[i].init();
}
onepoker.init();
for(int i=1,j=1,k=1;;){//i表示第i张牌,j表示第j位玩家,k表示第k副牌
onegamer[j].hand[onepoker.getpoker()] += 1;//给第j位玩家随机发一张牌
j++;//发完一轮后发下一轮,j从第一位玩家开始
if(j==gamernum+1)j=1;
i++;//发完第52张牌时判断是否需要发下一副牌
if(i==53){
if(k<pokernum){i=1;k+=1;onepoker.init();}
else break;
}
}
for(int i=1;i<=gamernum;i++){//循环输出每位玩家手里的牌
System.out.printf("第%d个玩家的手牌:\n",i);
onegamer[i].show(onegamer[i].hand);
}
}
}