实验类型:验证性
实验目的:掌握Java数组、方法、类的基本定义。
实验内容:编写程序,项目名和类名均为PokerGame。
描述:
共有1幅扑克牌,不包括大王和小王共52张牌。
可能有n个人参与扑克游戏,2<=n<=6。
程序运行时输入n,然后52张牌分别依次分发给n个人。不能整除时,每个人的牌数可以不同,如3个人,则第1个人18张,第2个和第3个人17张牌。
发牌完成后按花色(顺序为黑桃、红心、草花、方块)和牌面大小输出每个人得到的牌。
例如:
输入人数:3
输出如下:
第1个人:
黑桃:K 10 5A
红心:10 3 2
草花:K 10 8 6 3 A
方块:Q J 5 2
第2个人:
…
第3个人:
…
要求:
(1)使用数组存放发牌情况。
(2)编写不同方法完成不同功能。
提交要求:打包为可以执行的JAR文档,其中要包含源程序文件。
package game;
import java.util.Arrays;
import java.util.Scanner;
/*
描述:
共有1幅扑克牌,不包括大王和小王共52张牌。
可能有n个人参与扑克游戏,2<=n<=6。
程序运行时输入n,然后52张牌分别依次分发给n个人。
不能整除时,每个人的牌数可以不同,如3个人,则第1个人18张,第2个和第3个人17张牌。
发牌完成后按花色(顺序为黑桃、红心、草花、方块)和牌面大小输出每个人得到的牌。
*/
public class PokerGame {
public static void Get(int[] poker,int n){
//初始化扑克数组
for(int i=1;i<poker.length;i++){
poker[i]=i;
}
//打乱扑克数组
for(int i=poker.length-1;i>1;i--){
int temp=(int)(Math.random()*i); //生成随机下标
if(temp!=0){ //0下标无效
int k=poker[i];
poker[i]=poker[temp];
poker[temp]=k;
}
}
int[] people=new int[52/n+1]; //存放每个人得到的数字1-52
//轮流发放扑克牌
for(int loc=1;loc<=n;loc++){ //n个人
int k=0; //记录第n个人发到的牌数
for(int j=loc;j<poker.length;j=j+n){ //对第n个人发放扑克牌
people[k]=poker[j];
k++;
}
printGet(people,loc,k); //打印输出第n个人得到的扑克牌,loc是第几个人,k是得到了多少张牌
}
}
public static void printGet(int [] people,int loc,int k){
String[] str={"黑桃:","红心:","草花:","方块:"};
String[] menber={"A ","2 ","3 ","4 ","5 ","6 ","7 ","8 ","9 ","10 ","J ","Q ","K "};
System.out.println("第"+loc+"个人:");
//对每个花色的数字进行打印
for(int i=0;i<4;i++){ //共有4个花色
int p=0; //记录该花色的牌数
int[] number=new int[k]; //存放该花色对应的数字1-13
System.out.print(str[i]); //打印花色
//遍历people数组,将得到的数字转化为数字1-13
for(int j=0;j<k;j++){
if((people[j]%52/13)==i){ //说明为i花色
int b=people[j]%13;
if(b==0){
b=13; //!!!
}
number[p]=b;
p++;
}
}
//排序
Arrays.sort(number,0,p);
//将得到的数字1-13转化成A-10-JQK,倒序输出
for(int t=p-1;t>=0;t--){
System.out.print(menber[number[t]-1]);
}
System.out.println();
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入参与人数:");
int n= sc.nextInt();
int[] poker=new int[53]; //第0个位置不用
Get(poker,n);
}
}
升级版:m副扑克
package game;
import java.util.Arrays;
import java.util.Scanner;
/*
描述:
共有m幅扑克牌,不包括大王和小王共52*m张牌。
可能有n个人参与扑克游戏,2<=n<=6。
程序运行时输入n,然后52张牌分别依次分发给n个人。
不能整除时,每个人的牌数可以不同,如3个人,则第1个人18张,第2个和第3个人17张牌。
发牌完成后按花色(顺序为黑桃、红心、草花、方块)和牌面大小输出每个人得到的牌。
*/
public class PokerGame {
public static void Get(int[] poker,int n,int m){
//初始化扑克数组
for(int i=1;i<poker.length;i++){
poker[i]=i;
}
//打乱扑克数组
for(int i=poker.length-1;i>1;i--){
int temp=(int)(Math.random()*i); //生成随机下标
if(temp!=0){ //0下标无效
int k=poker[i];
poker[i]=poker[temp];
poker[temp]=k;
}
}
int[] people=new int[52*m/n+1]; //存放每个人得到的数字1-52*m
//轮流发放扑克牌
for(int loc=1;loc<=n;loc++){ //n个人
int k=0; //记录第n个人发到的牌数
for(int j=loc;j<poker.length;j=j+n){ //对第n个人发放扑克牌
people[k]=poker[j];
k++;
}
printGet(people,loc,k); //打印输出第n个人得到的扑克牌,loc是第几个人,k是得到了多少张牌
}
}
public static void printGet(int [] people,int loc,int k){
String[] str={"黑桃:","红心:","草花:","方块:"};
String[] menber={"A ","2 ","3 ","4 ","5 ","6 ","7 ","8 ","9 ","10 ","J ","Q ","K "};
System.out.println("第"+loc+"个人:");
//对每个花色的数字进行打印
for(int i=0;i<4;i++){ //共有4个花色
int p=0; //记录该花色的牌数
int[] number=new int[k]; //存放该花色对应的数字1-13
System.out.print(str[i]); //打印花色
//遍历people数组,将得到的数字转化为数字1-13
for(int j=0;j<k;j++){
if((people[j]%52/13)==i){ //说明为i花色
int b=people[j]%13;
if(b==0){
b=13; //!!!
}
number[p]=b;
p++;
}
}
//排序
Arrays.sort(number,0,p);
//将得到的数字1-13转化成A-10-JQK,倒序输出
for(int t=p-1;t>=0;t--){
System.out.print(menber[number[t]-1]);
}
System.out.println();
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入有几副牌:");
int m= sc.nextInt();
System.out.println("请输入参与人数:");
int n= sc.nextInt();
int[] poker=new int[52*m+1]; //第0个位置不用
Get(poker,n,m);
}
}