控制台实现斗地主

最近给大家分享一个在学习过程中比较有意义的面向对象的思想的控制台实现斗地主

要求大概就是有一个地主、两个农民,一副牌,谁先出完牌谁就获胜,简单的思路。

遇到这种面向对象的题目时首先需要分析一下,理清一下思路。

1、分析

首先我们需要一个人物类,人物类有一个集合装每个人的牌(农民17张,地主20张),有姓名(地主,或者农民),还有一个判断是否是地主的属性,人物还有出牌的方法

还要有一个游戏类,有一个集合装54张牌,有花色和大小两个属性,有发牌,洗牌,判断地主等方法

初步分析就大概这些东西,编写过程中遇到问题再慢慢修复

首先,写一个游戏类里面有花色和牌的大小

 private static final String[] pokecard = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2", "小王", "大王"};  //牌的值
    private static final String[] pokecolor = {"♠", "♥", "♣", "♦"};   //牌的花色

然后,构造一个54张牌的容器用来装牌

  //生成一副牌的方法
    public  static ArrayList makePoke(){
        //将牌装入集合中
        ArrayList poke = new ArrayList<>();
        for(int i=0;i<pokecard.length-2;i++){
            for(int j=0;j<pokecolor.length;j++){
                String s = pokecolor[j] + pokecard[i];
                poke.add(s);
            }
        }
        //大小王没有花色,单独装进集合中
        poke.add(pokecard[pokecard.length-2]);
        poke.add(pokecard[pokecard.length-1]);
        return poke;
    }

然后也要洗牌,用集合的shuffle方法打乱牌的顺序即可

private   ArrayList xipai(ArrayList list){
        Collections.shuffle(list);
        return list;
    }

写的详尽一点的话,可以写一个选地主的一个方法,随机挑选地主,如下:

   public void xuandizhu(Person p1,Person p2, Person p3){
        Random random = new Random();
        int n=random.nextInt(3)+1;
        if(n==1){
            System.out.println(p1.getName()+"当选地主");
            p1.setDiZhu(true);
        }else if(n==2){
            System.out.println(p2.getName()+"当选地主");
            p2.setDiZhu(true);
        }else if(n==3){
            System.out.println(p3.getName()+"当选地主");
            p3.setDiZhu(true);
        }
    }

然后进行发牌,写一个发牌的方法,里面传入三个人物,用每个集合单独装,地主的话最后三张牌给它即可

  public void fapai(ArrayList list,Person p1,Person p2,Person p3){
        ArrayList list1 = xipai(list);
        xuandizhu(p1,p2,p3);
       for(int i=0;i<list.size()-3;i+=3){
               p1.getPoke().add(list1.get(i));
               p2.getPoke().add(list1.get(i+1));
               p3.getPoke().add(list1.get(i+2));
       }
       if(p1.isDiZhu()){
           p1.getPoke().add(list1.get(list1.size()-3));
           p1.getPoke().add(list1.get(list1.size()-2));
           p1.getPoke().add(list1.get(list1.size()-1));
       }
       else if(p2.isDiZhu()){
           p2.getPoke().add(list1.get(list1.size()-3));
           p2.getPoke().add(list1.get(list1.size()-2));
           p2.getPoke().add(list1.get(list1.size()-1));
       }
       else if(p3.isDiZhu()){
           p3.getPoke().add(list1.get(list1.size()-3));
           p3.getPoke().add(list1.get(list1.size()-2));
           p3.getPoke().add(list1.get(list1.size()-1));
       }

    }

那么有一个问题就是,打乱了牌的顺序,如何能够正确的在控制台上显示牌呢?所以需要用到排序,那么在斗地主中,JQKA2这些牌是没办法通过自然排序的,所以我们这里自定义一个比较器

如下,我想到的是用asii码来比较

 @Override
    public int compare(String o1, String o2) {
        char m = 0 ,n = 0;
        if(o1.charAt(1) == '2'){
            m = 'M';
        }
        else if(o1.charAt(1) == '1'){
            m = ':';
        }
        else if(o1.charAt(1) == 'J'){
            m = 'I';
        }
        else if(o1.charAt(1) == 'Q'){
            m = 'J';
        }
        else  if(o1.charAt(1) == 'A'){
            m = 'L';
        }
        else if(o1.charAt(0) == '大'){
            m = 'O';
        }
        else if(o1.charAt(0) == '小'){
            m = 'N';
        }
        else{
            m = o1.charAt(1);
        }
        if(o2.charAt(1) == '2'){
            n = 'M';
        }
        else if(o2.charAt(1) == '1'){
            n = ':';
        }
        else if(o2.charAt(1) == 'J'){
            n = 'I';
        }
        else if(o2.charAt(1) == 'Q'){
            n = 'J';
        }
        else if(o2.charAt(1) == 'A'){
            n = 'L';
        }
        else if(o2.charAt(0) == '大'){
            n = 'O';
        }
        else if(o2.charAt(0) == '小'){
            n = 'N';
        }
        else{
            n = o2.charAt(1);
        }
        return m - n;
    }

那么游戏类就大致写好了,再来看看人物类

private  String name;
    private ArrayList poke=new ArrayList();
    private boolean isDiZhu;

    static Scanner sc=new Scanner(System.in);
    public Person(String name, ArrayList poke) {
        this.name = name;
        this.poke = poke;
        this.isDiZhu=false;
    }

    public Person() {
    }

    public String getName() {
        return name;
    }

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

    public ArrayList getPoke() {
        return poke;
    }

    public void setPoke(ArrayList poke) {
        this.poke = poke;
    }

    public boolean isDiZhu() {
        return isDiZhu;
    }

    public void setDiZhu(boolean diZhu) {
        isDiZhu = diZhu;
    }

这是基本的属性的封装和构造方法

还有一个理牌的功能实现,即调用上面写好的比较器即可

public void lipai(ArrayList list){
        Collections.sort(list,new Game());
    }

那么进行到了关键性的一步,也是最难的地方,就是出牌的方法,我们出牌的时候首先要判断手里有没有这些牌,出完牌后还要从集合中移除这些牌,所以可以用一个临时集合来存储,如果删除牌张的数量和出牌的数量相等,那么就出牌成功,反之则失败。如果失败就返回之前的不变的集合,如果成功就返回临时的集合来改变原有的集合,大概就是这样的思路。

 /**
     * 出牌的方法
     */
    public ArrayList sendPoke(ArrayList list){
        System.out.println(this.getPoke());
        ArrayList listTemp = new ArrayList<>();
        for(int i=0;i<list.size();i++){
            listTemp.add(list.get(i));
        }
        String str=sc.next();
        String[] split = str.split("");

        int i=0,n=0;
        Iterator iterator = listTemp.iterator();
        while(i<split.length){  //34567  3334
            while (iterator.hasNext()){
                String num = (String) iterator.next();
                if(num.contains(split[i])){
                    iterator.remove();
                    n++;
                    break;
                }
            }
            i++;
        }
        if(n==split.length){
            this.setPoke(listTemp);
            System.out.println("出牌成功");
        }else {
            System.out.println("出牌失败,没有这些牌");
        }
        return  this.getPoke();


    }

那么此时我们的一些小方法就写完了,来写测试类。构建对象,调用方法等可以封装到一个开始的方法里,并且判定,如果谁的牌出完了,谁就赢了。

public static  void start(){
        ArrayList list = Game.makePoke();  //54张牌的牌集合
        ArrayList list1 = new ArrayList<>(); //p1集合
        ArrayList list2 = new ArrayList<>(); //p2集合
        ArrayList list3 = new ArrayList<>(); //p3集合
        Person p1=new Person("zs",list1);
        Person p2=new Person("ls",list2);
        Person p3=new Person("ww",list3);
        Game game=new Game();
        game.fapai(list,p1,p2,p3);
        p1.lipai(list1);
        p2.lipai(list2);
        p3.lipai(list3);
        if (p1.isDiZhu()){
            while (true){
                System.out.print("地主出牌:");
                p1.sendPoke(p1.getPoke());
                if(p1.getPoke().size() == 0 ){
                    System.out.println("地主胜利");
                    break;
                }
                System.out.print("农民一出牌:");
                p2.sendPoke(p2.getPoke());
                if (p2.getPoke().size() == 0|| p3.getPoke().size() == 0){
                    System.out.println("农民胜利");
                    break;
                }
                System.out.print("农民二出牌:");
                p3.sendPoke(p3.getPoke());

                if (p2.getPoke().size() == 0|| p3.getPoke().size() == 0){
                    System.out.println("农民胜利");
                    break;
                }
            }

        }
        if (p2.isDiZhu()){
            while (true){
                System.out.print("地主出牌:");
                p2.sendPoke(p2.getPoke());
                if(p2.getPoke().size() == 0 ){
                    System.out.println("地主胜利");
                    break;
                }
                System.out.print("农民一出牌:");
                p3.sendPoke(p3.getPoke());
                if (p1.getPoke().size() == 0|| p3.getPoke().size() == 0){
                    System.out.println("农民胜利");
                    break;
                }
                System.out.print("农民二出牌:");
                p1.sendPoke(p1.getPoke());
                if (p1.getPoke().size() == 0|| p3.getPoke().size() == 0){
                    System.out.println("农民胜利");
                    break;
                }
            }

        }
        if (p3.isDiZhu()){
            while (true){
                System.out.print("地主出牌:");
                p3.sendPoke(p3.getPoke());
                if(p3.getPoke().size() == 0 ){
                    System.out.println("地主胜利");
                    break;
                }
                System.out.print("农民一出牌:");
                p1.sendPoke(p1.getPoke());
                if (p2.getPoke().size() == 0|| p1.getPoke().size() == 0){
                    System.out.println("农民胜利");
                    break;
                }
                System.out.print("农民二出牌:");
                p2.sendPoke(p2.getPoke());

                if (p2.getPoke().size() == 0|| p1.getPoke().size() == 0){
                    System.out.println("农民胜利");
                    break;
                }
            }

        }
    }

我这里还要分别判断谁是地主,地主先出牌。那么基本的方法就写完了,在main方法里直接调用开始的方法即可完成控制台实现斗地主。

效果如下

 

写的不是很好,但是对面向对象的思维性有很大的帮助!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你好! 要实现斗地主,你需要了解游戏的规则和基本流程。然后,你可以使用 Python 的类来模拟游戏的各个部分,包括玩家、牌堆、牌组、游戏流程等。 下面是一个简单的示例,展示了如何使用 Python 类来模拟斗地主游戏: ``` # 定义一个 Card 类表示单张牌 class Card: def __init__(self, suit, value): self.suit = suit self.value = value # 定义一个 Deck 类表示一副牌 class Deck: def __init__(self): self.cards = [] self.build_deck() def build_deck(self): suits = ['Spades', 'Hearts', 'Clubs', 'Diamonds'] values = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'] for suit in suits: for value in values: self.cards.append(Card(suit, value)) def shuffle(self): random.shuffle(self.cards) def deal(self): return self.cards.pop() # 定义一个 Player 类表示玩家 class Player: def __init__(self, name): self.name = name self.hand = [] def draw(self, deck): self.hand.append(deck.deal()) return self def show_hand(self): for card in self.hand: print(card.suit, card.value) # 定义一个 Game 类表示游戏 class Game: def __init__(self): self.deck = Deck() self.players = [] def add_player(self, player): self.players.append(player) def start(self): self.deck.shuffle() for i in range(3): for player in self.players: player.draw(self.deck) # 创建游戏实例,添加玩家,并开始游戏 game = Game() game.add_player(Player('张三')) game.add_player(Player('李四')) game.add ### 回答2: Python实现斗地主是一个非常有趣和具有挑战性的项目。下面是一个简单的实现思路: 首先,我们需要创建一副扑克牌,包含52张不含大小王的牌,可以使用列表来表示,每张牌用一个整数来表示。例如,1代表红桃A,2代表红桃2,以此类推。 接下来,需要实现洗牌功能,可以使用random模块的shuffle函数来随机打乱扑克牌列表的顺序。 然后,我们需要编写发牌函数,将一副洗好的牌平分给三个玩家,并将剩余的三张底牌放置在桌面上。 接下来,进入游戏阶段。轮流出牌,每位玩家根据当前的牌面情况,决定出哪些牌。可以实现一个简单的AI算法,根据牌面大小和规则来决定出牌策略。 在每次出牌之后,需要判断当前出牌是否符合规则,比如是否是合法的单牌、对子、三张牌、炸弹等等。并且需要更新当前的牌面情况,记录当前出牌的玩家是谁,以及当前的牌型和大小。 游戏过程中,需要实现一个计分系统,记录每位玩家的得分情况。根据谁先出完牌、谁先出完全部手上的牌以及底牌,来决定得分的分配。 最后,根据玩家的得分情况,判断谁是最终的胜者。 以上是一个简单的斗地主实现思路,Python作为一种高级编程语言,提供了丰富的数据结构和库函数,非常适合用来实现这样的项目。通过编写斗地主这样的小程序,能够锻炼我们的编程能力和逻辑思维,并且提供了一个有趣的游戏来娱乐自己和他人。 ### 回答3: Python实现斗地主是一种通过编程语言Python来编写斗地主游戏的实现方式。斗地主是一种中国常见的扑克牌游戏,通过编写Python代码来模拟和实现这种游戏,可以让玩家在电脑上进行斗地主游戏。 在Python中实现斗地主,首先需要定义并创建一副扑克牌,通常使用52张牌,不包括大小王。然后需要创建玩家类,可以通过编写Python的类来实现。玩家类可以包含一些属性,如玩家的姓名、手牌等信息,并提供一些方法用于玩家出牌、抢地主等操作。 接下来,需要实现斗地主的游戏逻辑。这包括洗牌、发牌、叫地主、出牌、判断胜负等步骤。可以通过编写一些函数或者方法来实现这些逻辑,例如洗牌函数、发牌函数、判断出牌类型函数等。 在实现斗地主的过程中,还可以考虑添加一些可视化的功能,如使用Python的图形库显示玩家的手牌、出牌等,在控制台或者图形界面中显示游戏进程和结果。 总之,通过使用Python编程语言实现斗地主,可以让玩家在电脑上进行这种扑克牌游戏,提供了一种便捷、有趣的娱乐方式。同时,通过编写斗地主的代码,还可以提高自己的编程能力和逻辑思维能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值