java实现斗地主发牌

说明

这是之前学习java时关于面向对象的一个实验,对面向对象思想的掌握有一定的帮助,刚好整理到了,就写出来。

斗地主发牌

要显示出底牌;以及同一轮中,当一张牌已经被发给第一个人时,再发牌给下一个人这张牌不可以再出现。

设计

首先考虑一个斗地主游戏中有什么对象,我认为斗地主中应该会有玩家,还有牌,另外还需要一个发牌的人,我比较懒,觉得玩家负责玩就好了,发牌,洗牌这种事就不自己动手了。所以分为Player,Dealer,Poker,另外还有一个主类,这里命名为Game。
直接看代码吧,代码中会有注释。

实验环境

JDKSE-1.8
eclipse2017

当时用的是JDK1.8版本,后来因为Android改用1.7版本了,相应的eclipse也不一样了。现在我又想把1.7卸了,下载1.8,但是不舍得动手,看看哪个节点能逼得我动手吧。

代码

首先看一下Poker类,可以看成就是一副扑克牌,那么扑克牌有什么,一副扑克牌当然有54张牌啦。本来花色是可以用图形显示的,但是因为我的eclipse没有设置好,所以花色会出现乱码,不过其他小伙伴还是可以试一下的。

package deal;

public class Poker {

   String[] numbers= {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};       //点数

   String[] colors= {"黑桃","红桃","方块","梅花"};                                     //花色

   String[] cards=new String[54];

   int[] array=new int[54];                                  //编号

   void setCards(String numbers[],String colors[],int array[])

   {

      for(int i=0;i<array.length;i++)

        array[i]=i;

      int k=0;

      for(int i=0;i<numbers.length;i++)

        for(int j=0;j<colors.length;j++)

        {

           cards[k]=colors[j]+numbers[i];     //将花色和点数拼接在一起存在cards数组中

           k=k+1;
         }

      cards[52]="大王";                 //将大王,小王加入牌中

      cards[53]="小王";

   }

}

然后看看Dealer类,把这个类看成一个洗牌的人,那么首先他需要有一副牌,然后需要洗牌,发牌,所以具有3个方法。注意:我这里的洗牌不是把牌数组给打乱,当然数组有打乱以及排序的功能,但是当时我还没有学到这里,所以用到的知识都是最简单的知识,希望能帮助到入门的人。我洗牌的过程其实是给了每张牌一个编号,从1到54,然后把这个编号打乱,再通过编号来取牌。数组中就是用另一个数组存储每张牌的下标,然后打乱这个数组,再通过这个下标数组来取牌,就像我发牌时不从第一个开始发,而是随机从牌中间抽一张发一样。


package deal;

import java.util.*;

public class Dealer {

   int[] hand=new int[3];

   void shuffleCard(int array[])               //洗牌

   {

      int temp=0;

      int rd1,rd2;

      for(int i=0;i<array.length;i++)

      {

        Random r1=new Random();            //产生两个随机数

        Random r2=new Random();

        rd1=r1.nextInt(54);

        rd2=r2.nextInt(54);

        temp=array[rd1];

        array[rd1]=array[rd2];

        array[rd2]=temp;

      }

   }

 

   void sendCards(int array[],int array1[],int array2[],int array3[])   //发牌

   {

      for(int i=0;i<array.length;i++)

      {

        if(i<51)

        {

           if(i%3==0)

              array1[i/3]=array[i];

           if(i%3==1)

              array2[i/3]=array[i];

           if(i%3==2)

              array3[i/3]=array[i];

        }

        else

           hand[i-51]=array[i];

      }

   }

   void showHand(int hand[],String cards[])                      //显示底牌

   {

      for(int i=0;i<hand.length;i++)

      {

        System.out.print(" "+cards[hand[i]]);

      }

   }

}

下面就是玩家类了,这里只给玩家两个方法,就是排序还有显示自己的牌。牌发下来了,当然是先把牌排好了。所以玩家得到的牌应该只有17张,共3个玩家,还剩3张牌作为底牌。说一下,排序算法有很多,这里采用的是冒泡排序法,更多方法可以看一下这篇文章排序算法

package deal;


public class Player {

   int[] card=new int[17];

   void sortCards(int card[])                       //将牌排序

   {

      int temp;

      for(int i=0;i<card.length-1;i++)              //冒泡排序法

        for(int j=0;j<card.length-1-i;j++)

        {

           if(card[j]>card[j+1])

           {

              temp=card[j];

              card[j]=card[j+1];

              card[j+1]=temp;

           }

        }

   }

   

   void showCards(int card[],String cards[])        
//将牌展示出来

   {

      for(int i=0;i<card.length;i++)

      {

        System.out.print(" "+cards[card[i]]);

      }

   }
   }

最后看一下主类,看在斗地主游戏中是怎么发牌的。

package deal;


public class Game {

   public static void main(String[] args) {

      // TODO 自动生成的方法存根

      Poker pk=new Poker();             //实例化一个Poker对象

      Player pl1,pl2,pl3;               //实例化3个Player对象

      pl1=new Player();

      pl2=new Player();

      pl3=new Player();

      Dealer de=new Dealer();          //实例化一个Dealer对象

      pk.setCards(pk.numbers, pk.colors,pk.array);        
//拿出一副扑克牌

      de.shuffleCard(pk.array);                            //发牌人洗牌

      de.sendCards(pk.array, pl1.card, pl2.card, pl3.card);  //发牌人发牌

      pl1.sortCards(pl1.card);                           //玩家1将牌排序

      pl2.sortCards(pl2.card);                           //玩家2将牌排序

      pl3.sortCards(pl3.card);                           //玩家3将牌排序

      System.out.println("\n玩家1的牌是:");

      pl1.showCards(pl1.card, pk.cards);

      System.out.println("\n玩家2的牌是:");

      pl2.showCards(pl2.card, pk.cards);

      System.out.println("\n玩家3的牌是:");

      pl3.showCards(pl3.card, pk.cards);

      System.out.println("\n底牌是:");

      de.showHand(de.hand, pk.cards);

   }

}

结果

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值