java編寫簡易撲克牌遊戲

遊戲功能描述

  1. 創建一副撲克牌:
    包括四種花色:黑桃,紅桃,梅花,方片
    包括十三種點數:2-10,J,Q,K,A
  2. 創建兩名玩家(or多名)
    玩家至少要有ID,姓名,手牌等屬性,手牌爲撲克牌的集合
  3. 將創建好的撲克牌進行隨機洗牌
  4. 從洗牌後的撲克牌的第一張開始,發給每個玩家,按照一人一張的方式,每人發兩張(or多張)
  5. 比較兩名玩家手中的撲克牌,比較規則爲:取兩人各自手中點數最大的牌進行比較,點數大的贏;若兩人各自的點數最大的牌相等,則再按照花色比較。

代碼

//Card.java

package card;

public class Card{
    private String color;
    private String number;

    public Card(String color, String number) {
        this.color = color;
        this.number = number;
    }

    public String getColor() {
        return color;
    }

    public String getNumber() {
        return number;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (!(obj instanceof Card))
            return false;
        Card other = (Card) obj;
        if (color == null) {
            if (other.color != null)
                return false;
        } else if (!color.equals(other.color))
            return false;
        if (number == null) {
            if (other.number != null)
                return false;
        } else if (!number.equals(other.number))
            return false;
        return true;
    }

}

//Cards.java

package card;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Cards {
    private List<Card> list = new ArrayList<Card>();

    //創建一副撲克牌
    public Cards(){
        System.out.println("-----------------創建撲克牌------------------");
        String[] color = {"黑桃", "紅桃", "梅花", "方片"};
        String[] number = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J","Q","K", "A"};
        for(int i=0;i<color.length;i++)
            for(int j=0;j<number.length;j++){
                list.add(new Card(color[i], number[j]));
            }   
        System.out.println("----------------撲克牌創建成功!---------------");
    }

    //獲取一副撲克牌
    public List<Card> getList() {
        return list;
    }

    //洗牌(打亂)
    public void shufCards(){
        System.out.println("----------------開始洗牌------------------------");
        Collections.shuffle(list);
        System.out.println("----------------洗牌結束------------------------");
    }

    //展示一副撲克牌
    public void showCards(){
        System.out.print("當前的撲克牌爲:");
        System.out.print("[ ");
        for(int i=0;i<list.size();i++){
            System.out.print(list.get(i).getColor() + list.get(i).getNumber()+ " ");
        }
        System.out.println(" ]");
    }

}

//Player.java

package card;

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

public class Player {
    private int id;
    private String name;
    private List<Card> handCards = new ArrayList<Card>();

    public Player(int id, String name){
        this.id = id;
        this.name = name;
    }

    public List<Card> getHandCards() {
        return handCards;
    }

    public void setHandCards(Card card) {
        handCards.add(card);
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

//CardComparator.java(自定義排序規則)

package card;

import java.util.Comparator;

public class CardComparator implements Comparator<Card> {

    @Override
    public int compare(Card c1, Card c2) {
        // 構建花色和牌值數組,通過比對,計算得到某張牌的價值(大小)
        String[] color = {"方片", "梅花", "紅桃", "黑桃"};
        String[] number = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J","Q","K", "A"};

        //由於比較規則是先比較牌值,如果相等再比較花色(黑紅梅方),所以將牌值賦予較高的權值
        int valueOfC1 = 0;
        int valueOfC2 = 0;
        for(int i=0;i<number.length;i++){
            if(c1.getNumber().equals(number[i])) valueOfC1 += i*10;
            if(c2.getNumber().equals(number[i])) valueOfC2 += i*10;
        }
        for(int i=0;i<color.length;i++){
            if(c1.getColor().equals(color[i])) valueOfC1 += i;
            if(c2.getColor().equals(color[i])) valueOfC2 += i;
        }

        if( valueOfC1 > valueOfC2 ) return -1;
        if( valueOfC1 < valueOfC2 ) return 1;

        return 0;
    }

}

//PlayDemo.java

package card;

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

public class PlayDemo {

    //創建玩家
    //要對玩家ID的異常處理,要求用戶只能輸入整數ID,否則需要重新輸入
    public Player setPlayer(){
        int id=0;
        String name="";
        Scanner console = new Scanner(System.in);
        boolean ready = true;
        do{
            try{
                System.out.println("輸入ID:");
                id = console.nextInt();
                ready = true;
            }catch(Exception e){
                System.out.println("請輸入整數類型的ID!");
                ready = false;
                console.nextLine();
            }
        }while(ready==false);

        System.out.println("輸入姓名:");
        name = console.next();      
        return new Player(id, name);
    }

    public static void main(String[] args) {
        //測試簡易撲克牌程序
        PlayDemo game = new PlayDemo();
        //(1)創建一副牌
        Cards cards = new Cards();
        //(2)展示新的撲克牌
        cards.showCards();
        //(3)洗牌
        cards.shufCards();
        //(4)創建玩家
        System.out.println("--------------創建兩個(or多個)玩家就可以開始遊戲啦!-------------");
        List<Player> p = new ArrayList<Player>();
        for(int i=0;i<2;i++)
        {
            System.out.println("請輸入第"+(i+1)+"位玩家的ID和姓名:");
            p.add(game.setPlayer());
        }
        for(int i=0;i<p.size();i++)
        {
            System.out.println("歡迎玩家:"+p.get(i).getName());
        }
        //(5)撲克牌比大小遊戲開始啦~
        int count = 0;
        System.out.println("------------------開始發牌---------------------");
        //設定每人分別拿兩張(or多張)
        for(int i=0; i<2;i++){
            //玩家輪流拿牌
            for(int j=0; j< p.size(); j++){
                System.out.println(">玩家"+p.get(j).getName()+"拿牌");
                p.get(j).setHandCards(cards.getList().get(count));
                count++;
            }
        }
        System.out.println("------------------發牌結束!--------------------");
        System.out.println("------------------開始遊戲 ---------------------");
        for(int i=0;i<p.size();i++){
            System.out.print("玩家"+p.get(i).getName()+"的手牌爲:[ ");
            for(int j=0;j<p.get(i).getHandCards().size();j++){
                Card cur = p.get(i).getHandCards().get(j);
                System.out.print(cur.getColor()+cur.getNumber()+" ");
            }
            System.out.println(" ]");
        }

        //排序得到每個玩家最大的手牌(排序規則自定義)
        for(int i=0;i<p.size();i++){
            Collections.sort(p.get(i).getHandCards(), new CardComparator());
        }
        List<Card> maxCard = new ArrayList<Card>();
        for(int i=0;i<p.size();i++){
            Card maxCur = p.get(i).getHandCards().get(0);
            System.out.println("玩家"+p.get(i).getName()+"最大的手牌爲:"+ maxCur.getColor()+maxCur.getNumber());
            maxCard.add(maxCur);
        }

        //得到最後的勝者
        List<Card> temp = new ArrayList<Card>();
        temp.addAll(maxCard);
        Collections.sort(temp, new CardComparator());
        for(int i=0;i<p.size();i++){
            if(maxCard.get(i).equals(temp.get(0))) System.out.println("恭喜玩家:"+p.get(i).getName()+"獲勝!"); 
        }

    }

}

遊戲運行截圖

這裏寫圖片描述
這裏寫圖片描述
還有一個地方需要優化,即不能輸入重複的ID和姓名,可以重寫Player的equals方法,將用戶的輸入與已有的輸入相比較,不滿足要求則需要重新輸入,不過就先不加了,我要回去睡覺啊啊啊啊!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章