扑克牌,丁钩钓鱼

本文主要讲解扑克牌的简单组成,以及游戏的运行过程,使用控制台运行。

代码中注释讲解的比较清楚,就不在做额外解释。

一、定义扑克牌的面及对应大小

static {
        String[] color = {"♠", "♥", "♣", "♦"};//花色
        String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};//数字
        int count = 1;//定义牌的对应大小
        for (String n : number) {
            for (String c : color) {
                cardBox.put(c + n, count);
            }
            count++;//递增
        }
        cardBox.put("joker", count);//开头小写是小王
        cardBox.put("Joker", count);//开头大写是大王
    }

二、打乱以及发牌

        ArrayList<String> player1 = new ArrayList<>();//玩家一的牌
        ArrayList<String> player2 = new ArrayList<>();//玩家二的牌
        ArrayList<String> deck = new ArrayList<>();//牌堆
        Collections.shuffle(list);//打乱牌堆

        //发牌,给每个玩家轮流发一张牌
        for (int i = 0; i < list.size(); i++) {
            if (i % 2 == 0) {
                player1.add(list.get(i));
            } else {
                player2.add(list.get(i));
            }
        }

        //也可以直接截取前一半牌给玩家一,后一半牌给玩家二
        for (int i = 0; i < list.size() / 2; i++) {
            player1.add(list.get(i));
        }
        for (int i = list.size() / 2; i < list.size(); i++) {
            player2.add(list.get(i));
        }

三、游戏的运行

        String str = player.remove(0);//获取该玩家牌堆最上面的牌
        System.out.println(playerStr + ": " + str);//打印该玩家以及此张牌
        deck.add(str);//加入牌堆
        for (int i = 0; i < deck.size() - 1; i++) {//获取牌堆的每张牌
            if (cardBox.get(str) == 9) {//如果是J
                System.out.println("----------牌被" + playerStr + "钓走了----------");//一样则开启新一轮
                while (!deck.isEmpty()) player.add(deck.remove(i));//把牌堆里所有的牌加入到该玩家手牌中
            } else if (cardBox.get(str) == cardBox.get(deck.get(i))) {//比较是否和本回合玩家出的牌一样
                System.out.println("----------" + playerStr + "碰牌----------");//一样则开启新一轮
                while (deck.size() > i) player.add(deck.remove(i));//把牌堆里一样的牌到末尾的牌加入到该玩家手牌中
                for (String s : deck) {//遍历剩余牌堆的牌
                    System.out.println(s);
                }
            }
        }

四、获胜条件

        if (player1.isEmpty()) {//判断玩家1的牌是否为空
            System.out.println("player2获胜");
            return true;
        } else if (player2.isEmpty()) {//判断玩家2的牌是否为空
            System.out.println("player1获胜");
            return true;
        }
        return false;

五、代码总览

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class DGDYGame {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new DGDYGame();//开启一局丁钩钓鱼
        }
    }

    static Map<String, Integer> cardBox = new HashMap<>();//牌盒,键为牌的花色和数字,值为对应大小

    static {
        String[] color = {"♠", "♥", "♣", "♦"};//花色
        String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};//数字
        int count = 1;//定义牌的对应大小
        for (String n : number) {
            for (String c : color) {
                cardBox.put(c + n, count);
            }
            count++;//递增
        }
        cardBox.put("joker", count);//开头小写是小王
        cardBox.put("Joker", count);//开头大写是大王
    }

    public DGDYGame() {
        ArrayList<String> list = new ArrayList<>();
        cardBox.forEach((integer, s) -> list.add(integer));
        GameStart(list);
    }

    public void GameStart(ArrayList<String> list) {
        ArrayList<String> player1 = new ArrayList<>();//玩家一的牌
        ArrayList<String> player2 = new ArrayList<>();//玩家二的牌
        ArrayList<String> deck = new ArrayList<>();//牌堆
        Collections.shuffle(list);//打乱牌堆

        //发牌,给每个玩家轮流发一张牌
        for (int i = 0; i < list.size(); i++) {
            if (i % 2 == 0) {
                player1.add(list.get(i));
            } else {
                player2.add(list.get(i));
            }
        }

        //也可以直接截取前一半牌给玩家一,后一半牌给玩家二
//        for (int i = 0; i < list.size() / 2; i++) {
//            player1.add(list.get(i));
//        }
//        for (int i = list.size() / 2; i < list.size(); i++) {
//            player2.add(list.get(i));
//        }

        //System.out.println("player1:" + player1);//打印玩家1的牌
        //System.out.println("player2:" + player2);//打印玩家2的牌
        
        while (!player1.isEmpty() || !player2.isEmpty()) {
            round(player1, deck, "player1");//运行
            if (extracted(player1, player2)) break;//判断
            round(player2, deck, "player2");//运行
            if (extracted(player1, player2)) break;//判断
        }
    }

    private static boolean extracted(ArrayList<String> player1, ArrayList<String> player2) {
        if (player1.isEmpty()) {//判断玩家1的牌是否为空
            System.out.println("player2获胜");
            return true;
        } else if (player2.isEmpty()) {//判断玩家2的牌是否为空
            System.out.println("player1获胜");
            return true;
        }
        return false;
    }

    private void round(ArrayList<String> player, ArrayList<String> deck, String playerStr) {//回合
        String str = player.remove(0);//获取该玩家牌堆最上面的牌
        System.out.println(playerStr + ": " + str);//打印该玩家以及此张牌
        deck.add(str);//加入牌堆
        for (int i = 0; i < deck.size() - 1; i++) {//获取牌堆的每张牌
            if (cardBox.get(str) == 9) {//如果是J
                System.out.println("----------牌被" + playerStr + "钓走了----------");//一样则开启新一轮
                while (!deck.isEmpty()) player.add(deck.remove(i));//把牌堆里所有的牌加入到该玩家手牌中
            } else if (cardBox.get(str) == cardBox.get(deck.get(i))) {//比较是否和本回合玩家出的牌一样
                System.out.println("----------" + playerStr + "碰牌----------");//一样则开启新一轮
                while (deck.size() > i) player.add(deck.remove(i));//把牌堆里一样的牌到末尾的牌加入到该玩家手牌中
                for (String s : deck) {//遍历剩余牌堆的牌
                    System.out.println(s);
                }
            }
        }

        try {
            Thread.sleep(1000);//延时1秒,可以修改或删除
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

    }

}

六、最终效果

由于中间过程较长,只放出开头及结尾,有兴趣的小伙伴可自行试试。

开始处:

结尾处:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值