快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

新的麻将和牌程序(递归)

昨天写的那个太幼稚了,今天写的使用了递归,我用九连宝灯(麻将的一种和法)进行测试,可以通过。比昨天的精简了一些,去掉了那个实际上没有用的类。没有考虑十三幺和七小对。

public class MaJiang2
{
    private boolean jiang=false;//是否找到将
    public MaJiang2(){}

    //花色,判定这个花色是否被减完了(假如没有减完自然没有和)
    private int huase(int[] hua)
    {
        if (hua.length==7)
        {
            //判定字,自比较特别,没有顺
            for (int i=0;i<hua.length ;i++ )
            {
                if (hua[i]==3||hua[i]==4)
                {
                    hua[i]=0;
                    huase(hua);
                }
                //假如字有两个,肯定是将
                if (hua[i]==2&&!jiang)
                {
                    hua[i]=0;
                    jiang=true;
                    huase(hua);
                }
            }
        }
        else
        {
            for (int i=0;i<hua.length ;i++ )
            {
                //假如没有将,先把将减出去
                if (!jiang&&hua[i]>=2)
                {
                    hua[i]=hua[i]-2;
                    jiang=true;
                    int fanhui=huase(hua);
                    //假如递归回来依旧没有减完,则把将加回去
                    if (fanhui!=0)
                    {
                        hua[i]=hua[i]+2;
                        jiang=false;
                    }
                }
                if (hua[i]!=0&&i<7&&hua[i+1]!=0&&hua[i+2]!=0)
                {
                    hua[i]--;
                    hua[i+1]--;
                    hua[i+2]--;
                    huase(hua);
                    int fanhui=huase(hua);
                    //假如递归回来依旧没有减完,减去的加回去
                    if (fanhui!=0)
                    {
                        hua[i]++;
                        hua[i+1]++;
                        hua[i+2]++;
                    }
                }
                if (hua[i]==3||hua[i]==4)
                {
                    int temp=hua[i];
                    hua[i]=0;
                    huase(hua);
                    int fanhui=huase(hua);
                    //假如递归回来依旧没有减完,减去的加回去
                    if (fanhui!=0)
                    {
                        hua[i]++;
                        hua[i]=temp;
                    }
                }
            }
        }
        int re=0;
        //最后判定减没减完
        for (int i=0;i<hua.length ;i++ )
        {
            re=re+hua[i];
        }
        return re;
    }


    public void Hu(int[] aWan,int[] aTiao,int[] aTong,int[] aZi)
    {
        //先从字开始,假如某一花色计算完之后依旧不为0,则肯定不和。假如所有的花色全部减完了,就和了,呵呵:-〉
        int jieguo=huase(aZi);
        if (jieguo!=0)
        {
            System.out.println("没和");
        }
        else if ((jieguo=huase(aWan))!=0)
        {
            System.out.println("没和");
        }
        else if ((jieguo=huase(aTiao))!=0)
        {
            System.out.println("没和");
        }
        else if ((jieguo=huase(aTong))!=0)
        {
            System.out.println("没和");
        }
        else
        {
            System.out.println("和了,真不轻易,一脑门子汉");
        }
    }
    public static void main(String[] args)
    {
        MaJiang2 mj=new MaJiang2();
        int[] w={3,1,1,2,1,1,1,1,3};
        int[] ti={0,0,0,0,0,0,0,0,0};
        int[] to={0,0,0,0,0,0,0,0,0};
        int[] z={0,0,0,0,0,0,0};

        mj.Hu(w,ti,to,z);
    }
}

假如有什么错误的话,请告诉我,谢谢!!!



返回类别: 教程
上一教程: 取时间的小类
下一教程: JavaScript正则表达式

您可以阅读与"新的麻将和牌程序(递归)"相关的教程:
· java程序的递归算法,列出某个目录下的所有子目录和文件
· JAVA做一个最简朴的SOCKET通话程序
· JAVA程序员必读:基础篇(3)
· 在JAVA应用程序中如何实现FTP的功能 (转)
· 程序安装,升级及卸载核心部分(java编写)
    微笑服务 优质保证 索取样品