扑克牌小游戏,寻找 ♠A(来一场和赌王的争霸)

顺序表 实现一个扑克牌小游戏

一副扑克牌(不含大小王) 52张

基本游戏规则:
1、洗牌(打乱牌的顺序)
2、给五名玩家,各发两张牌 依次发牌
3、判断最后 ♠A 在谁手里 谁获胜

升级玩法:
4、让每名玩家,依次抽取他的下家一张随机手牌。。。 然后再去找 ♠A
5、因为周润发是赌神,所以他有变牌的能力: 他一旦手中没有黑桃A,就可以把第一张牌和有黑桃A的玩家互换
(交换牌之前,有机会变一次;交换牌以后,有机会变一次)

话不多说,直接上代码:

首先我们新建两个类 玩家类手牌类,用来定义我们玩游戏所需要的变量
玩家类:

class Player{
     
    public String name; // 玩家姓名
    public List<Card> cards = new ArrayList<>();

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

手牌类:

class Card {
     
    public String suit; // 花色
    public int rank; // 数值

    public Card(String suit, int rank) {
     
        this.suit = suit;
        this.rank = rank;
    }

    @Override
    public String toString() {
     
        return "{'" + suit + '\'' + ", " + rank + '}';
    }

    @Override
    // 重写equals 方法,用来比较两个对象
    public boolean equals(Object o) {
     
        if (this == o) return true;
        if (o == null || !(o instanceof Card)) return false;
        Card card = (Card) o;
        return rank == card.rank &&
                Objects.equals(suit, card.suit);
    }

}

接下来就到了我们玩游戏的公共类中,在类中实现操作:

public class Game {
     

}

1、我们先把我们一块玩游戏的小伙伴实例出来:

        List<Card> cards = new ArrayList<>(); // 实例化扑克牌
        List<Player> players = new ArrayList<>(); // 实例化玩家
        players.add(new Player("周润发"));
        players.add(new Player("刘德华"));
        players.add(new Player("周星驰"));
        players.add(new Player("作者乔"));
        players.add(new Player("帅气的你"));

2、玩家我们找齐了,现在我们得找一副扑克牌,即初始化扑克牌:

// 初始化扑克牌
    private static void initializeCards(List<Card> cards) {
     
        for(String suit : new String[] {
     "♠","♥","♦","♣"}) {
     
            for(int rank = 1;rank <= 13;rank++) {
     
                Card card = new Card(suit,rank);
                // 把扑克牌放入牌组中
                cards.add(card);
            }
        }
    }

3、发了扑克牌以后,我们得把玩家的手牌给打印出来:

// 打印出每位玩家的 手牌
    public static void printPlayerHandCardList(List<Player> players) {
     
        for (Player player : players) {
     
            System.out.printf(" %s 的手牌是: %s%n", player.name, player.cards);
        }
    }

4、现在我们都准备好了,游戏马上开始:
(1)洗牌:(洗完牌后我们不需要打印,这里打印只是为了方便调试)

// 调用 Collections 下的 Shuffle(洗牌)方法
        // 进行洗牌
        Collections.shuffle(cards);
        System.out.println("洗牌完成后的牌");
        System.out.println(cards);

(2)发牌:

// 发牌
        int n = 2; // 每名玩家发几张牌
        for(int i = 0; i < n ; i++) {
      // 一共发两轮牌
            for(Player player : players) {
      // 每名玩家依次抽牌
                Card card = cards.remove(0); // 从牌组中,抽一张牌出来
                player.cards.add(card); // 把这张牌放到当前玩家的手中
            }
        }
        System.out.println("现在牌组中剩余的牌: ");
        System.out.println(cards);

(3)现在大家都拿到牌了,我们就得判断是谁获胜了,即 ♠A 在谁手里

    // 找出 ♠A
        Card toFoundCard = new Card("♠",1); // toFoundCard 就当成我们的 ♠A
        for (Player player : players) {
     
            for (Card card : player.cards) {
     
                // 比较每张牌和要找的那张牌是否是同一张牌
                if(card.equals(toFoundCard)) {
     
                    System.out.println(player.name+ " 获胜 !!!");
                    return;
                }
            }
        }
        System.out.println("这把大家打平了!!!");
    }
    System.out.println("交换牌之前: ");
    printPlayerHandCardList(players);

你以为游戏到这里就结束了嘛。。。不,才刚刚开始
(4)我们现在在让每位玩家依次随机摸取下家的一张手牌

// 交换牌(每名玩家抽取下家的一张随机手牌)
        Random random = new Random(); // 生成一个随机数
        for (int i = 0; i < players.size();i++) {
     
            Player currentPlayer = players.get(i); // 当前对象的牌
            Player nextPlayer = players.get(i != players.size() - 1 ? i+1 : 0);
            int toDrawIndex = random.nextInt(nextPlayer.cards.size()); // 获取下一个玩家的随机一张牌
            Card drawCard = nextPlayer.cards.remove(toDrawIndex); // 删除被取出的牌在原玩家中的信息
            currentPlayer.cards.add(drawCard); // 将取出牌的信息加到当前对象中
        }
        System.out.println("交换牌之后: ");
        printPlayerHandCardList(players);

(5)周润发可是我们心中的赌神哎,所以我们应该给发哥点超能力,允许我们的发哥可以换牌,将自己的第一张牌和玩家中持有♠A的玩家换牌。(其他玩家不知道,所以是超能力,偷换)

        Player 周润发 = players.get(0); 
        winFaGe (周润发,toFoundCard,players);
        // 周润发 换牌发功
    public static void winFaGe (Player 周润发,Card toFoundCard,List<Player> players) {
     
        if(!周润发.cards.contains(toFoundCard)) {
      // 若发哥手中没有 黑桃A
            Card card = 周润发.cards.get(0);
            周润发.cards.set(0,toFoundCard); 
            for(int i = 1; i < players.size(); i++) {
     
                if(players.get(i).cards.contains(toFoundCard)) {
      // 找到拿黑桃A的那个玩家
                    /*players.get(i).cards.remove(toFoundCard); // 先把发哥手着的第一张牌移除
                    players.get(i).cards.add(card); // 将黑桃A放入发手中*/
                    int j = players.get(i).cards.indexOf(toFoundCard);
                    players.get(i).cards.set(j,card);
                }
            }
        }
    }

结果会有两种情况:
①五个玩家中有人拿到 ♠A ,但是被发哥给换走了,所以发哥获胜

②五个玩家中没人拿到 ♠A,所以大家打平了

最后我们给出全部的代码:

import java.util.*;

class Player{
     
    public String name; // 玩家姓名
    public List<Card> cards = new ArrayList<>();

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

class Card {
     
    public String suit; // 花色
    public int rank; // 面值

    public Card(String suit, int rank) {
     
        this.suit = suit;
        this.rank = rank;
    }

    @Override
    public String toString() {
     
        return "{'" + suit + '\'' + ", " + rank + '}';
    }

    @Override
    public boolean equals(Object o) {
     
        if (this == o) return true;
        if (o == null || !(o instanceof Card)) return false;
        Card card = (Card) o;
        return rank == card.rank &&
                Objects.equals(suit, card.suit);
    }

}

public class ArrayListDemo {
     
    public static void main(String[] args) {
     
        List<Card> cards = new ArrayList<>();
        List<Player> players = new ArrayList<>();
        players.add(new Player("周润发"));
        players.add(new Player("刘德华"));
        players.add(new Player("周星驰"));
        players.add(new Player("作者乔"));
        players.add(new Player("帅气的你"));


        // 初始化扑克牌
        initializeCards(cards);

        // 调用 Collections 下的 Shuffle(洗牌)方法
        // 进行洗牌
        Collections.shuffle(cards);
        System.out.println("洗牌完成后的牌");
        System.out.println(cards);

        // 发牌
        int n = 2; // 每名玩家发几张牌
        for(int i = 0; i < n ; i++) {
      // 一共发两轮牌
            for(Player player : players) {
      // 每名玩家依次抽牌
                Card card = cards.remove(0); // 从牌组中,抽一张牌出来
                player.cards.add(card); // 把这张牌放到当前玩家的手中
            }
        }
        System.out.println("现在牌组中剩余的牌: ");
        System.out.println(cards);

        System.out.println("交换牌之前: ");
        printPlayerHandCardList(players);

        Card toFoundCard = new Card("♠",1);
        Player 周润发 = players.get(0);
        winFaGe(周润发,toFoundCard,players);
        System.out.println("发哥第一次发功之后的牌: ");
        printPlayerHandCardList(players);

        // 交换牌(每名玩家抽取下家的一张随机手牌)
        Random random = new Random(); // 生成一个随机数
        for (int i = 0; i < players.size();i++) {
     
            Player currentPlayer = players.get(i); // 当前对象的牌
            Player nextPlayer = players.get(i != players.size() - 1 ? i+1 : 0);
            int toDrawIndex = random.nextInt(nextPlayer.cards.size()); // 获取下一个玩家的随机一张牌
            Card drawCard = nextPlayer.cards.remove(toDrawIndex); // 删除被取出的牌在原玩家中的信息
            currentPlayer.cards.add(drawCard); // 将取出牌的信息加到当前对象中
        }

        System.out.println("交换牌之后: ");
        printPlayerHandCardList(players);

        winFaGe (周润发,toFoundCard,players);
        System.out.println("发哥第二次成功之后: ");
        printPlayerHandCardList(players);

        // 找出 ♠A
        for (Player player : players) {
     
            // 比较每张牌和要找的那张牌是否是同一张牌
            if(player.cards.indexOf(toFoundCard) != -1) {
     
                System.out.println(player.name+ " 获胜 !!!");
                return;
            }
        }
        System.out.println("这把大家打平了!!!");
    }

    // 打印出每位玩家的 手牌
    public static void printPlayerHandCardList(List<Player> players) {
     
        for (Player player : players) {
     
            System.out.printf(" %s 的手牌是: %s%n", player.name, player.cards);
        }
    }

    // 周润发 换牌发功
    public static void winFaGe (Player 周润发,Card toFoundCard,List<Player> players) {
     
        if(!周润发.cards.contains(toFoundCard)) {
      // 若发哥手中没有 黑桃A
            Card card = 周润发.cards.get(0);
            周润发.cards.set(0,toFoundCard); // 得到发哥的第一张手牌
            for(int i = 1; i < players.size(); i++) {
     
                if(players.get(i).cards.contains(toFoundCard)) {
      // 找到拿黑桃A的那个玩家
                    /*players.get(i).cards.remove(toFoundCard); // 先把发哥手着的第一张牌移除
                    players.get(i).cards.add(card); // 将黑桃A放入发手中*/
                    int j = players.get(i).cards.indexOf(toFoundCard);
                    players.get(i).cards.set(j,card);
                }
            }
        }
    }

    // 初始化扑克牌
    private static void initializeCards(List<Card> cards) {
     
        for(String suit : new String[] {
     "♠","♥","♦","♣"}) {
     
            for(int rank = 1;rank <= 13;rank++) {
     
                Card card = new Card(suit,rank);
                // 把扑克牌放入牌组中
                cards.add(card);
            }
        }
    }


}

你可能感兴趣的:(数据结构,游戏,顺序表)