Java入門第三季7-1簡易撲克牌作業

highhand發表於2021-09-09

自己根據前三季的學習,嘗試編寫了這個程式,期間也參考了一些同學的寫法,這裡我還自學了enum的用法,並將其應用在程式中。
  程式總共由三個檔案組成,程式碼中的註釋不是很多,但是透過輸出的文字大家還是能夠了解到某段程式碼的意思的。
  程式透過簡單的修改能快速實現多人的遊戲,有少部分易出錯的地方沒有加丟擲異常,這裡就暫時不做最佳化了···

執行效果如圖所示
圖片描述

package com.game;

public class Card implements Comparable {

    private SuitEnum suit;//花色
    private NumberEnum number;//點數

    /**
     * 構造方法
     */
    public Card (SuitEnum suit, NumberEnum number) {
//      this.suit = suit;
        //這樣在setter中可以對輸入進行判斷
        this.setSuit(suit);
//      this.number = NumberEnum.valueOf(number);
        this.setNumber(number);
    }

    public String getSuit() {
        return suit.toString();
    }

    public void setSuit(SuitEnum suit) {
        try {
            this.suit = suit;
        } catch (Exception e) {
            System.out.println("發牌錯誤");//不過由於是程式發牌,這句就簡單處理了,不會有錯的
            //String類輸入改為enum類,這樣不會有錯了
        }
    }

    public String getNumber() {
        return number.toString();
    }

    public void setNumber(NumberEnum number) {
        try {
            this.number = number;
        } catch (Exception e) {
            System.out.println("發牌錯誤");//不過由於是程式發牌,這句就簡單處理了,不會有錯的
        }

    }

    @Override //比較牌的大小
    public int compareTo(Card o) {
        // TODO Auto-generated method stub
        if (this.number.equals(o.number)) {
            return this.suit.compareTo(o.suit);
        } else {
            return this.number.compareTo(o.number);
        }
    }

    @Override//輸出牌的名稱
    public String toString () {
        return suit.toString()+number.toString();
    }

    public enum SuitEnum {
        DIAMONDS("方塊"),CLUBS("梅花"),HEARTS("紅桃"),SPADES("黑桃");

        private String suitName;

        //構造方法
        private SuitEnum (String suitName) {
            this.suitName = suitName;
        }

        @Override
        public String toString () {
            return this.suitName;
        }
    }

    public enum NumberEnum {
        //點數,從大到小3-10,J,Q,K,A,2
        THREE("3"),FOUR("4"),FIVE("5"),SIX("6"),SEVEN("7"),EIGHT("8"),NINE("9"),TEN("10"),
        JACK("J"),QUEEN("Q"),KING("K"),ACE("A"),TWO("2");

        private String numberName;

        private NumberEnum (String numberName) {
            this.numberName = numberName;
        }

        @Override
        public String toString () {
            return this.numberName;
        }
    }
}
package com.game;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Player {

    private String id;
    private String name;
    private List handCards;

    public Player () {
        this.setId();
        this.setName();
        this.handCards  = new ArrayList();
    }

    public String getId() {
        return id;
    }
    public void setId() {
        System.out.println("請輸入1~4位長度玩家ID");
        Scanner in = new Scanner(System.in);
        while (true) {
            try {
                this.id = String.valueOf(in.nextInt());
                if (this.id.length()4) {
                    throw new IllegalArgumentException();
                }
                break;
            } catch (Exception e) {
                System.out.println("格式錯誤,請重新輸入1~4位長度玩家ID");
                this.id = in.next();
            }
        }

    }

    public String getName() {
        return name;
    }
    public void setName() {
        System.out.println("請輸入1~10位長度玩家姓名");
        Scanner in = new Scanner(System.in);
        this.name = in.next();
        while (this.name.length()10) {
            System.out.println("請重新輸入1~10位長度玩家姓名");
            this.name = in.next();
        }
    }

    public void getHandCards() {
        System.out.print("玩家:"+id+","+name+"手中的全部牌為:[");
        for (Card card : handCards) {
            System.out.print(card.getSuit()+card.getNumber()+" ");
        }
        System.out.println("]");
    }
    public void setHandCards(Card card) {
        this.handCards.add(card);
    }

    public Card getMaxCard () {
        Card maxCard = handCards.get(0);
        for (Card card : handCards) {
            if (card.compareTo(maxCard)>0)
                maxCard = card;
        }
        return maxCard;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (!(obj instanceof Player))
            return false;
        Player other = (Player) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (id.equals(other.id))
            return true;//被我修改過了,不是最初生成的equals,id和name有一個對到就算重複
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (name.equals(other.name))
            return true;
        return false;
    }   
}
package com.game;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Game {

    private List aPoker;//建立一副撲克牌
    private List players;//所有玩家

    public static void main(String[] args) {
        Game newGame = new Game();
        newGame.initialPoker();
        newGame.shuffle();
        newGame.initialPlayer();
        newGame.deal();
        newGame.compareCard();

    }

    /**
     * 遊戲類構造方法,功能未擴充套件,暫時只有兩位玩家一副牌
     */
    public Game() {
        this.aPoker = new ArrayList();
        this.players = new ArrayList();
    }

    public void initialPoker() {
        System.out.println("-------建立撲克牌-------");
        System.out.println("撲克牌為:");
        for (Card.SuitEnum se : Card.SuitEnum.values()) {
            //values()方法網上有介紹,但是java API中找不到,比較詭異
            System.out.print("[");
            for (Card.NumberEnum ne : Card.NumberEnum.values()) {
                aPoker.add(new Card(se,ne));
                System.out.print(se.toString()+ne.toString()+",");
            }
            System.out.println("]");
        }
        System.out.println("-------建立撲克牌成功!-------");
    }

    public void shuffle() {
        System.out.println("-------開始洗牌-------");
        List pokerTemp = new ArrayList(aPoker);//這裡沒法用aPoker.clone()方法
        Random random = new Random();
        for (int i=52; i>0; i--) {
            int r = random.nextInt(i);
            aPoker.set(52-i, pokerTemp.remove(r));
        }
        System.out.println("-------洗牌結束-------");
//      for (Card card : aPoker) {
//          System.out.print(card.getSuit()+card.getNumber()+" ");
//      }
    }

    public void initialPlayer() {
        System.out.println("-------建立玩家-------");
        for (int i=0; i0) {
                winPlayer = player;
            }
        }
        System.out.println("-------玩家:"+winPlayer.getName()+"獲勝!-------");
        System.out.println("玩家各自的手牌為:");
        for (Player player : players) {
            player.getHandCards();
        }
    }
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/810/viewspace-2807738/,如需轉載,請註明出處,否則將追究法律責任。

相關文章