public class MainActivity extends Activity implements OnClickListener {
    private TextView tv;
    private Button bt1;
    private Button bt2;
    private Button bt3;
    private Button bt4;
    private Button bt5;
    private Button bt6;
    private Button bt7;
    private Button bt8;
    private Button bt9;
    private Button bt10;
    private Button bt11;
    private Button bt12;
    private Button bt13;
    private Button bt21;
    private Button bt22;
    private Button bt23;
    private Button bt24;
    private Button bt25;
    private Button bt26;
    private Button bt27;
    private Button bt28;
    private Button bt29;
    private Button bt30;

    private String estr;
    private Jishuan jishuan;
    private String string;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findView();
        setOnListener();
        String string = tv.getText().toString();

    }

    // ///////////////////////////////
    public void waiHu(String string) {
        jishuan = new Jishuan();
        if (jishuan.IsHupai(jishuan.toChangePai(string))) {
            Toast.makeText(this, "恭喜您! 看有息没,有息就胡牌了,别漏了大胡子哟", Toast.LENGTH_LONG)
                    .show();
        } else {
            Toast.makeText(this, "不好意思您没有胡牌,继续加油!", Toast.LENGTH_LONG).show();
        }
    }
//
    public void tinPai(String string) {
        jishuan = new Jishuan();
        if (jishuan.IsTinPai(jishuan.toChangePai(string))) {
            Toast.makeText(this, "恭喜您!听牌了, 看有息没!", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(this, "不好意思您没有听牌,继续加油!", Toast.LENGTH_LONG).show();
        }
    }

    // //////////////////////////////////////////////////
    private void setOnListener() {
        bt1.setOnClickListener(this);
        bt2.setOnClickListener(this);
        bt3.setOnClickListener(this);
        bt4.setOnClickListener(this);
        bt5.setOnClickListener(this);
        bt6.setOnClickListener(this);
        bt7.setOnClickListener(this);
        bt8.setOnClickListener(this);
        bt9.setOnClickListener(this);
        bt10.setOnClickListener(this);
        bt21.setOnClickListener(this);
        bt22.setOnClickListener(this);
        bt23.setOnClickListener(this);
        bt24.setOnClickListener(this);
        bt25.setOnClickListener(this);
        bt26.setOnClickListener(this);
        bt27.setOnClickListener(this);
        bt28.setOnClickListener(this);
        bt29.setOnClickListener(this);
        bt30.setOnClickListener(this);
        bt11.setOnClickListener(this);
        bt12.setOnClickListener(this);
        bt13.setOnClickListener(this);
    }

    private void findView() {
        tv = (TextView) findViewById(R.id.tv);
        bt1 = (Button) findViewById(R.id.btn1);
        bt2 = (Button) findViewById(R.id.btn2);
        bt3 = (Button) findViewById(R.id.btn3);
        bt4 = (Button) findViewById(R.id.btn4);
        bt5 = (Button) findViewById(R.id.btn5);
        bt6 = (Button) findViewById(R.id.btn6);
        bt7 = (Button) findViewById(R.id.btn7);
        bt8 = (Button) findViewById(R.id.btn8);
        bt9 = (Button) findViewById(R.id.btn9);
        bt10 = (Button) findViewById(R.id.btn10);
        bt11 = (Button) findViewById(R.id.btn11);
        bt12 = (Button) findViewById(R.id.btn12);
        bt13 = (Button) findViewById(R.id.btn13);
        bt21 = (Button) findViewById(R.id.btn21);
        bt22 = (Button) findViewById(R.id.btn22);
        bt23 = (Button) findViewById(R.id.btn23);
        bt24 = (Button) findViewById(R.id.btn24);
        bt25 = (Button) findViewById(R.id.btn25);
        bt26 = (Button) findViewById(R.id.btn26);
        bt27 = (Button) findViewById(R.id.btn27);
        bt28 = (Button) findViewById(R.id.btn28);
        bt29 = (Button) findViewById(R.id.btn29);
        bt30 = (Button) findViewById(R.id.btn30);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn12:
            String myStr = tv.getText().toString();// TextView的字符。
            try {
                tv.setText(myStr.substring(0, myStr.length() - 1));//退回最后一个字符
            } catch (Exception e) {
                tv.setText("");
            }

            break;
        case R.id.btn1:
            String myString1 = tv.getText().toString();
            myString1 += bt1.getText();
            tv.setText(myString1);
            break;
        case R.id.btn2:
            String myString2 = tv.getText().toString();
            myString2 += bt2.getText();
            tv.setText(myString2);
            break;
        case R.id.btn3:
            String myString3 = tv.getText().toString();
            myString3 += bt3.getText();
            tv.setText(myString3);
            break;
        case R.id.btn4:
            String myString4 = tv.getText().toString();
            myString4 += bt4.getText();
            tv.setText(myString4);
            break;
        case R.id.btn5:
            String myString5 = tv.getText().toString();
            myString5 += bt5.getText();
            tv.setText(myString5);
            break;
        case R.id.btn6:
            String myString6 = tv.getText().toString();
            myString6 += bt6.getText();
            tv.setText(myString6);
            break;
        case R.id.btn7:
            String myString7 = tv.getText().toString();
            myString7 += bt7.getText();
            tv.setText(myString7);
            break;
        case R.id.btn8:
            String myString8 = tv.getText().toString();
            myString8 += bt8.getText();
            tv.setText(myString8);
            break;
        case R.id.btn9:
            String myString9 = tv.getText().toString();
            myString9 += bt9.getText();
            tv.setText(myString9);
            break;
        case R.id.btn10:
            String myString10 = tv.getText().toString();
            myString10 += bt10.getText();
            tv.setText(myString10);
            break;
        case R.id.btn21:
            String myString21 = tv.getText().toString();
            myString21 += bt21.getText();
            tv.setText(myString21);
            break;
        case R.id.btn22:
            String myString22 = tv.getText().toString();
            myString22 += bt22.getText();
            tv.setText(myString22);
            break;
        case R.id.btn23:
            String myString23 = tv.getText().toString();
            myString23 += bt23.getText();
            tv.setText(myString23);
            break;
        case R.id.btn24:
            String myString24 = tv.getText().toString();
            myString24 += bt24.getText();
            tv.setText(myString24);
            break;
        case R.id.btn25:
            String myString25 = tv.getText().toString();
            myString25 += bt25.getText();
            tv.setText(myString25);
            break;
        case R.id.btn26:
            String myString26 = tv.getText().toString();
            myString26 += bt26.getText();
            tv.setText(myString26);
            break;
        case R.id.btn27:
            String myString27 = tv.getText().toString();
            myString27 += bt27.getText();
            tv.setText(myString27);
            break;
        case R.id.btn28:
            String myString28 = tv.getText().toString();
            myString28 += bt28.getText();
            tv.setText(myString28);
            break;
        case R.id.btn29:
            String myString29 = tv.getText().toString();
            myString29 += bt29.getText();
            tv.setText(myString29);
            break;
        case R.id.btn30:
            String myString30 = tv.getText().toString();
            myString30 += bt30.getText();
            tv.setText(myString30);
            break;
        case R.id.btn11:
            string = tv.getText().toString();
            waiHu(string);
        case R.id.btn13:
            string = tv.getText().toString();
            tinPai(string);
        }

    }

}
////////////////////////////////////////////////////////////////////////
//计算类
public class Jishuan {
    public final static String[] pai = { "一", "二", "三", "四", "五", "六", "七",
            "八", "九", "十", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖", "拾" };

    // 把相同的牌放在数组的一个下标,便于_del(int[] dealpai )处理。

    public int[] toChangePai(String str) {
        int[] dealpai = new int[20];
        String ch = "";
        int k = str.length();
        for (int i = 0; i < k; i++) {
            ch = str.substring(i, i + 1);
            for (int j = 0; j < 20; j++) {
                if (ch.equals(pai[j])) {
                    dealpai[j] = dealpai[j] + 1;
                }
            }
        }
        return dealpai;
    }

    public boolean _del(int[] dealpai) // 此方法有21只牌(增加了1支),不考虑2 7
                                        // 10的情况。看是否此数组完全清0;
    {
        int i;

        for (i = 0; i < 20; i++) {
            if (dealpai[i] >= 3) {// 大,小字都是三个的情况
                dealpai[i] -= 3;
            }
            if (dealpai[i] == 1 && i < 8) // 处理连续的小字
            {
                if (dealpai[i + 1] > 0 && dealpai[i + 2] > 0) {
                    dealpai[i]--;
                    dealpai[i + 1]--;
                    dealpai[i + 2]--;
                }

            }

            if (dealpai[i] == 2 && i < 8) // 处理连续的小字
            {
                if (dealpai[i + 1] > 1 && dealpai[i + 2] > 1) {
                    dealpai[i] -= 2;
                    dealpai[i + 1] -= 2;
                    dealpai[i + 2] -= 2;
                }

            }

            if (dealpai[i] == 1 && i >= 10 && i < 18) // 处理连续的大字
            {
                if (dealpai[i + 1] > 0 && dealpai[i + 2] > 0) {
                    dealpai[i]--;
                    dealpai[i + 1]--;
                    dealpai[i + 2]--;
                }

            }

            if (dealpai[i] == 2 && i >= 10 && i < 18) // 处理连续的大字
            {
                if (dealpai[i + 1] > 1 && dealpai[i + 2] > 1) {
                    dealpai[i] -= 2;
                    dealpai[i + 1] -= 2;
                    dealpai[i + 2] -= 2;
                }

            }

        }
        int sum = 0;
        for (i = 0; i < 20; i++)
            sum += dealpai[i];
        if (sum == 0) {// 代表此数组为空了。符合条件可以符牌。
            return true;
        } else
            return false;
    }

    // ///////////////////////////////增加一只牌,
    // 数组长度是3的倍数。并处理二七十及贰柒拾,不行就回朔。/////////////////////////////////////////////////
    public boolean IsHupai(int[] dealpai) {

        int[] temp1 = new int[20];
        for (int k = 0; k < 20; k++) { // 保存未作处理的情况。
            temp1[k] = dealpai[k];// a
        }

        for (int j = 0; j < 20; j++) { // 試探增加每張牌,看否能和其他組合成一句話//
                                        // 或三個相同的數,或2,7,10的组合。

            for (int k = 0; k < 20; k++) { // 还原a上次处理不成功的情况。
                dealpai[k] = temp1[k];
            }

            dealpai[j] = dealpai[j] + 1; // 新增的牌。

            int min = dealpai[1] < dealpai[6] ? dealpai[1] : dealpai[6];
            min = min < dealpai[9] ? min : dealpai[9];// 求小字中二,七,十中最少的那個牌

            int MIN = dealpai[11] < dealpai[16] ? dealpai[11] : dealpai[16];
            MIN = MIN < dealpai[19] ? MIN : dealpai[19]; // 求大字中二,七,十中最少的那個牌

            int[] temp2 = new int[20];
            for (int k = 0; k < 20; k++) { // 保存增加某张牌的当时情况。
                temp2[k] = dealpai[k];
            }

            for (int l = 0; l <= min; l++) {// 以便處理考慮小字2 7 10 的情況。为0时代表不作2710处理。
                for (int m = 0; m < 20; m++) {// 保存处理2710之前时的牌
                    dealpai[m] = temp2[m];// 上次不符牌时已修改了。此时还原数组dealpai。
                }
                switch (l) {
                case 1:
                    dealpai[1]--;
                    dealpai[6]--;
                    dealpai[9]--;
                    break;// 2,7,10减一
                case 2:
                    dealpai[1] -= 2;
                    dealpai[6] -= 2;
                    dealpai[9] -= 2;
                    break;
                default:
                    break;
                }
                int[] temp3 = new int[20];
                for (int q = 0; q < 20; q++) {
                    temp3[q] = dealpai[q];// 保存还未处理大字2710时的情况
                }
                for (int t = 0; t <= MIN; t++) {// //t 为0时代表不作2710处理。t最多为2。

                    for (int n = 0; n < 20; n++) {
                        dealpai[n] = temp3[n];// 还原上次修改的。
                    }
                    switch (t) {
                    case 1:
                        dealpai[11]--;
                        dealpai[16]--;
                        dealpai[19]--;
                        break;// 大字2,7,10减一
                    case 2:
                        dealpai[11] -= 2;
                        dealpai[16] -= 2;
                        dealpai[19] -= 2;
                        break;

                    default:
                        break;
                    }
                    if (_del(dealpai)) {
                        for (int i = 0; i < 20; i++)
                            // System.out.println("dealpai: "+dealpai[i]);
                            return true;
                    }
                }

            }
        }
        return false;
    }

    public boolean IsTinPai(int[] dealpai) {//是否听牌

        int[] temp = new int[20];
        for (int i = 0; i < 20; i++) {
            temp[i] = dealpai[i];// 处理前先保存
        }

        for (int j = 0; j < 20; j++) {// 試探增加每張牌,看是否能符牌;

            for (int k = 0; k < 20; k++) { // 还原上次处理不成功的情况。
                dealpai[k] = temp[k];
            }

            dealpai[j] = dealpai[j] + 1; 
            if (IsHupai(dealpai)) {
                return true;
            }

        }
        return false;
    }

    // /////////////////////////////////////////////////////////////////////////////////
//
//  public static void main(String[] args) {
//      String strpai = "一二二二三三四五六七七八九十 肆伍陆";
//      Jishuan js = new Jishuan();
//      js.toChangePai(strpai);
//      System.out.println("strpai: " + strpai);
//      if (js.IsHupai(js.toChangePai(strpai))) {
//          System.out.println("ok!");
//      } else {
//          System.out.println("no!");
//      }
//  }

}
//////////////////////////////////////////////////////////////////////

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TableRow
        android:id="@+id/tableRow1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:maxLength="20"
            android:textSize="30sp" >
        </TextView>
    </TableRow>

    <TableRow
        android:id="@+id/tableRow2"
        android:layout_width="fill_parent"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/btn1"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="一" />

        <Button
            android:id="@+id/btn2"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="二" />

        <Button
            android:id="@+id/btn3"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="三" />

        <Button
            android:id="@+id/btn4"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="四" />

        <Button
            android:id="@+id/btn5"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="五" />
    </TableRow>

    <TableRow
        android:id="@+id/tableRow3"
        android:layout_width="0dip"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/btn6"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="六" />

        <Button
            android:id="@+id/btn7"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="七" />

        <Button
            android:id="@+id/btn8"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="八" />

        <Button
            android:id="@+id/btn9"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="九" />

        <Button
            android:id="@+id/btn10"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="十" />
    </TableRow>
     <TableRow
        android:id="@+id/tableRow4"
        android:layout_width="fill_parent"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/btn21"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="壹" />

        <Button
            android:id="@+id/btn22"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="贰" />

        <Button
            android:id="@+id/btn23"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="叁" />

        <Button
            android:id="@+id/btn24"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="肆" />

        <Button
            android:id="@+id/btn25"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="伍" />
    </TableRow>
     <TableRow
        android:id="@+id/tableRow5"
        android:layout_width="fill_parent"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/btn26"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="陆" />

        <Button
            android:id="@+id/btn27"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="柒" />

        <Button
            android:id="@+id/btn28"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="捌" />

        <Button
            android:id="@+id/btn29"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="玖" />

        <Button
            android:id="@+id/btn30"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="拾" />
    </TableRow>

    <TableRow
        android:id="@+id/tableRow4"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/btn11"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:text="是否胡牌" />
        <Button
            android:id="@+id/btn13"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:text="是否听牌" />

        <Button
            android:id="@+id/btn12"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="x" />
    </TableRow>

</TableLayout>

/////////////////////////////////////////////////////////////