线性表练习扑克牌游戏(炸金花)

简介: 线性表练习扑克牌游戏(炸金花)

数据结构是很重要的,一个好的程序员语法可以略微不好但是数据结构绝对是一个可以拉开优略程序员的一个分水岭,我写了一个关于炸金花的小练习巩固线性表的知识如果大家对线性表不是很熟悉,我可以尽快带大家写一遍根据源码讲解线性表的实现和原理。

一、思路:


我们需要先有个大概的框架进行起来才能更加高效有条理。要玩炸金花我们需要一副牌,有了牌我们需要将牌打乱,打乱了我们要发牌,好吧听起来很简单是不是突然感觉没那么难了

image.png

编辑确实是这样,不要急我们再来丰富一下细节,我们要一副牌就需要定义扑克牌是含有什么内容的,我们以哪种方式存放它?(看题目都知道肯定是线性表!!) 我们怎么洗牌呢,洗了牌怎么发牌???

二、实战:


我们就不废话了直接开始!系好安全带!!!

image.png

2.1:我们先定义扑克牌,他有大小和花色我们需要写一个类专搞扑克牌,并且我们要重写toString方法在打印扑克牌的时候我们要打出扑克牌的效果,这个肯定难不倒聪明的你


代码如下:

public class Poker {
    public int rank;//牌值
    public String suit;//花色
    @Override
    public String toString() {
        return String.format("[%s %d]",suit,rank);
    }
}

2.2:有了扑克牌的属性,我们知道扑克牌长什么样子了


image.png

编辑

还不错挺好看的哈我们需要买扑克牌了结果你发现你没有钱都给女朋友买奶茶了(囊中羞涩) 那就只能自己造扑克牌了,造扑克牌我们就思考肯定要一张张来造从A开始吧我们用1代替A,于是聪明的你又写出来了如下代码

class BuyPoker {
  public static String[] Suits= {"♥", "♠","♦","♣"};
    public static ArrayList<Poker> buyPoker() {
        ArrayList<Poker> Cards=new ArrayList<>(52);
        //13个数值的牌从A-K我们都用1-13表示
        for (int i = 1; i <= 13; i++) {
            //4花色
            for (int j = 0; j < 4; j++) {
                //先将每一数值的牌的花色定义上
                String suit1=Suits[j];
                Poker poker=new Poker();
                poker.suit=suit1;
                poker.rank=i;
                Cards.add(poker);
            }
        }
    }
    //更好的体现封装的思想,我们将buyPokere封装起来留getPoker接口来得到牌
    public ArrayList<Poker> getPoker() {
        return buyPoker();
    }
}

这里我们用ArrayList顺序表来存放扑克牌ArrayList 数据存放的内存空间是连续的出去大小王一共52张牌所以我们定义大小为52。

上面我们就可以得到一副扑克牌效果是这样的

image.png

编辑

还可以吧,咱敲代码的审美到这很不错了!image.png编辑

2.3:我们都有扑克牌了肯定要洗牌,不洗牌你说怎么玩!那我们肯定就是随机交换牌的位置你肯定想到使用Random的nextInt方法,你怎么这么聪明!!! 行了行了,那你就忍一忍让我给你继续讲下面的操作吧!我们得到了随机的index值也就是随机的位置就可以交换位置了那我们再写一个swap方法,让它看起来不是那么繁琐


public class Shuffle {
    //交换扑克牌
    private static void swap(ArrayList<Poker> Cards,int i,int index) {
        Poker poker=Cards.get(i);
        Cards.set(i,Cards.get(index));
        Cards.set(index,poker);
    }
    public static void swap(ArrayList<Poker> Cards) {
        Random random=new Random();
        int index;//随机位置
        //从13(K)牌开始随机洗牌这里i注意用size()-1不然越界了
        for (int i = Cards.size()-1; i >0 ; i--) {
            index=random.nextInt(i);
            swap(Cards,i,index);
        }
    }
}

image.png

编辑

这就是洗完牌的效果,不要在意我们的卡拉米同志,他从来不赌博image.png编辑

2.4:都能洗牌了肯定可以发牌了,我们现在实现发牌的逻辑我们默认是5个人


image.png

编辑

这里我们将5位玩家的牌也放在ArrayList中并且放在ArrayList类型的数组中你细细品players的每一个元素类型是一个ArrayList,我们将他们组合在一起就是一个二维数组

public class Game {
    public static ArrayList<ArrayList<Poker>>  boomGoldFlower(ArrayList<Poker> pokers) {
        ArrayList<ArrayList<Poker>> players=new ArrayList<>(PlayersNumber);
        ArrayList<Poker> pokers1=new ArrayList<>();
        ArrayList<Poker> pokers2=new ArrayList<>();
        ArrayList<Poker> pokers3=new ArrayList<>();
        ArrayList<Poker> pokers4=new ArrayList<>();
        ArrayList<Poker> pokers5=new ArrayList<>();
        players.add(pokers1);
        players.add(pokers2);
        players.add(pokers3);
        players.add(pokers4);
        players.add(pokers5);
        ArrayList<Poker> temp;
        int k=0;
        //一人5张牌轮着发
        for (int j = 0; j < Cardsnumbers; j++) {
            for (int i = 0; i < 5; i++) {
                temp=players.get(i);
                temp.add(pokers.get(k++));
            }
        }
        return players;
    }
}

2.5:接下来就是让游戏开始了,编辑看把他高兴的都跳起来了直接上代码让前面的所用部分连接起来让程序动起来!!!


public class playPoker {
    public static final int PlayersNumber=5;
    public static final int Cardsnumbers=3;
    public static void main(String[] args) {
        ArrayList<Poker> Cards=new ArrayList<>();
        BuyPoker buyPoker=new BuyPoker();
        Cards= buyPoker.getPoker();
        System.out.println(Cards);
        //Shuffle shuffle=new Shuffle();
        Shuffle.swap(Cards);
        System.out.println("小卡拉米很专业的洗完了牌");
        System.out.println(Cards);
        System.out.println("性感小卡拉米在线发牌");
        ArrayList<ArrayList<Poker>> players=new ArrayList<>(PlayersNumber);
        players=Game.boomGoldFlower(Cards);
        for (int i = 0; i < PlayersNumber; i++) {
            System.out.println("玩家"+i+1);
            System.out.println(players.get(i));
        }
    }
}

这就是我们努力的成果了!!!恭喜你坚持学完了这简单的扑克牌游戏!!!可以敲但是不要赌博哦!!!!不然就会像我们的卡拉米一样输了一直急跳


image.png

相关文章
|
7月前
LeetCode题:174. 地下城游戏
LeetCode题:174. 地下城游戏
68 0
LeetCode题:174. 地下城游戏
|
2月前
|
算法
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
51 0
|
7月前
|
算法
2024春晚纸牌魔术原理----环形链表的约瑟夫问题
2024春晚纸牌魔术原理----环形链表的约瑟夫问题
|
存储
剑指Offer - 面试题14:剪绳子
剑指Offer - 面试题14:剪绳子
87 0
|
存储
剑指offer 36. 复杂链表的复刻
剑指offer 36. 复杂链表的复刻
53 0
|
机器学习/深度学习
剑指offer 13. 剪绳子
剑指offer 13. 剪绳子
77 0
牛客 买礼物(链表 线段树)
牛客 买礼物(链表 线段树)
67 0
牛客 买礼物(链表 线段树)
LeetCode每日一题——1823.找出游戏的获胜者(约瑟夫环问题)
共有 n 名小伙伴一起做游戏。小伙伴们围成一圈,按 顺时针顺序 从 1 到 n 编号。确切地说,从第 i 名小伙伴顺时针移动一位会到达第 (i+1) 名小伙伴的位置,其中 1 <= i < n ,从第 n 名小伙伴顺时针移动一位会回到第 1 名小伙伴的位置。
163 0
LeetCode每日一题——1823.找出游戏的获胜者(约瑟夫环问题)
|
开发工具
扑克牌问题
扑克牌问题
扑克牌问题