發牌器
阿新 • • 發佈:2021-01-26
設計一個隨機發牌器,該發牌器每次發牌十三張,程式執行後顯示所得牌組的資訊,包括紙牌的大小花色
個人思路(不對的地方歡迎來錘):
建立一個撲克類,其含有屬性變數大小 和 花色
將生成的撲克放進一個集合容器
生成隨機數,隨機在容器裡取出
例項程式碼:
public class Task114 {
public static void main(String[] args) {
System.out.println("老九學堂組織打撲克,小新、靜香、大雄、胖達參與了本次活動");
//建立玩家列表
String player[ ] = {"小新", "靜香", "大雄", "胖達"};
//先生成一副牌(本程式也可以生成多幅撲克牌,和選擇的不同遊戲人數)
List<Poker> list1 = pokerProd(1);
List<List<Poker>> listplayer = deal(list1, 4);
for (int i = 0; i < 4; i++) {
System.out.println(player[i] + "得手牌:" + listplayer. get(i));
}
}
//發牌器,根據人數發牌
public static List<List<Poker>> deal(List<Poker> pokerList, int num) {
List<List<Poker>> listPlayer = new ArrayList<>();
List<Integer> randomList = new ArrayList<>(); //存放隨機數
Random random = new Random();
int rand = 0;
//先生成一個撲克牌數量的隨機數列表
for(int i = 0;i < pokerList.size();i++){
rand = random.nextInt(pokerList.size());
if(randomList.contains(rand)){//如果列表中已存在,重新在這一次迴圈新增隨機數
i--;
continue;
}
randomList.add(rand);
}
//生成了num個玩家的撲克牌列表
for(int i = 0; i < num; i++) {
listPlayer.add(new ArrayList<Poker>());
}
//發牌問題,涉及到是否可以整除
if(pokerList.size() % num == 0) { //如果可以整除,num個人均勻分牌
int temp = pokerList.size() / num;
for(int j = 0; j < num; j++) {
for(int i = 0 + temp * j; i < temp + temp * j; i++) {
//玩家列表裡面的第j個玩家新增撲克牌,撲克牌根據隨機列表中的隨機數在撲克牌列表中隨機取出
listPlayer.get(j).add(pokerList.get(randomList.get(i)));
}
}
} else { //如果不能整除,說明牌不能均分
int temp1 = pokerList.size() % num; //存放多餘的牌的數量
int temp2 = pokerList.size() / num; //先每人分得這些牌,後面的牌一張一張勻開,勻完為止
for(int j = 0; j < num; j++) {
for(int i = 0 + temp2 * j; i < temp2 + temp2 * j; i++) {
//從後往前摸牌,這是一個一個非常牛逼的技能,在三國殺中
listPlayer.get(j).add(pokerList.get(randomList.get(i)));
}
}
//勻剩餘的牌,剩餘的牌肯定不會大於玩家數量
for(int i = 0; i < temp1; i++) {
listPlayer.get(i).add(pokerList.get(randomList.get(pokerList.size() - 1 - i)));
}
}
return listPlayer;
}
//撲克生成
public static List<Poker> pokerProd(int n){
//建立一個撲克容器
List<Poker> pokerList = new ArrayList<Poker>();
//幾副牌就製造幾次
for (int j = 0; j < n; j++) {
// 此處不考慮大小王了,根據傳入引數判斷幾副牌
for (int i = 0; i < 13; i++) {
pokerList.add(new Poker("♥", (i + 1) + ""));
pokerList.add(new Poker("♦", (i + 1) + ""));
pokerList.add(new Poker("♠", (i + 1) + ""));
pokerList.add(new Poker("♣", (i + 1) + ""));
}
}
return pokerList;
}
}
class Poker {
private String num; //數字1-k
private String color; //花色,紅桃,黑桃,方片,梅花
public Poker() {
// TODO 自動生成的建構函式存根
}
//撲克是通過構造方法建造的,所以對其修改要在構造方法中
public Poker(String color, String num) {
if(num.equals("11")) {
this.num = "J";
}else if(num.equals("12")) {
this.num = "Q";
}else if(num.equals("13")) {
this.num = "K";
}else {
this.num = num;
}
this.color = color;
}
public String getNum() {
return num;
}
public String getColor() {
return color;
}
public void setNum(String num) {
this.num = num;
}
public void setColor(String color) {
this.color = color;
}
@Override
public String toString() {
return color + num;
}
}