首頁  >  文章  >  Java  >  如何用程式碼實現札金花遊戲

如何用程式碼實現札金花遊戲

零下一度
零下一度原創
2017-06-26 14:10:302363瀏覽

扎金花這種小遊戲,我想作為一名程式設計師。大部分小時候都玩過吧!現在我們一起來看看搜狐這道面試題吧!看看如何用程式碼實現札金花。


Q題目

#
两个搜狐的程序员加了一个月班,终于放假了,于是他们决定扎金花渡过愉快的假期 。

遊戲規則:

共52張普通牌,牌面為2,3,4,5,6,7,8,9,10,J,Q,K,A之一,大小遞增,各四張; 每人抓三張牌。兩人比較手中三張牌大小,大的人獲勝。

對於牌型的規則如下:

  • #1.三張牌一樣即為豹子

  • 2.三張牌相連為順子(A23不算順子)

  • 3.有且僅有兩張牌一樣為對子豹子>順子>對子>普通牌型在牌型一樣時,比較牌型數值大小(如AAA>KKK,QAK>534,QQ2> ;10104) 在兩人皆無特殊牌型時,依序比較三張牌中最大的。大的人獲勝,如果最大的牌一樣,則比較第二大,以此類推(如37K>89Q) 如二人牌面相同,則為平局。

輸入描述:

输入两个字符串代表两个玩家的牌(如”10KQ” “354”),
先输入的作为玩家1,后输入的作为玩家2

輸出描述:##
 1 代表 玩家1赢     
 0 代表 平局   
 -1 代表 玩家2赢 
 -2 代表不合法的输入

輸入範例:
KQ3 3Q9
10QA 6102
5810 7KK
632 74J
10102 K77
JKJ 926
68K 27A

輸出範例:
1
1
-1
-1
1
1
-1


##A解

1 .邏輯分析

    (1)拿到玩家1和2輸入的字串,判斷是否合法
  • (2)合法後,拆分字串為字串陣列
  • (3)將字串陣列轉換為int數組,並排序
  • ( 4)判斷3張牌的相等情況
  • (5)比較大小,誰輸誰贏
2.難點分析

    存在10時,字串的拆分問題:可以根據字串長度來判斷拆分
  • 將字母轉為數字:先將拿到的字串都轉為大寫,這樣小寫和大寫字母都一樣了,然後直接用if判斷return就可以了
  • 比較誰輸誰贏:採用從大到小的方式比較,先判斷是否有豹子,在判斷順子,再判斷對子,最後判斷無牌型的
  • 對順子的處理問題
3.程式碼實作

package 搜狐面试2016;

import java.util.Arrays;
import java.util.Scanner;

public class Test1 {
    public static void main(String[] args) {
        // 2,3,4,5,6,7,8,9,10,J,Q,K,A
        Scanner scanner = new Scanner(System.in);
        boolean isContinue=true;
        while (isContinue) {
            //1.游戏规则
            System.out.println("游戏规则:共52张普通牌,牌面为2,3,4,5,6,7,8,9,10,J,Q,K,A之一,大小递增,各四张; 每人抓三张牌。两人比较手中三张牌大小,大的人获胜。");
            System.out.println("对于牌型的规则如下:");
            System.out.println("1.三张牌一样即为豹子");
            System.out.println("2.三张牌相连为顺子(A23不算顺子)");
            System.out.println("3.有且仅有两张牌一样为对子 豹子>顺子>对子>普通牌型 在牌型一样时,比较牌型数值大小");
            System.out.println("谁输谁赢:1 --代表玩家1赢;0 --代表 平局   ;-1 --代表玩家2赢 ;-2 --代表不合法的输入");
             
            //2.分别出牌
            System.out.println("请玩家1出牌:");
            String num1 = scanner.next();
            System.out.println("请玩家2出牌:");
            String num2 = scanner.next();
            
            //3.判断是否合法
            boolean flag=isValid(num1, num2);
            if(!flag){
                //不合法
                System.out.println("-2");
            }else {
                //输入合法---先拆分字符串---再转化为int数组
                //4.拆分字符串
                String[] nums1=getStrArray(num1);
                String[] nums2=getStrArray(num2);
                System.out.println("拆分后的字符串数组A:"+Arrays.toString(nums1));
                System.out.println("拆分后的字符串数组B:"+Arrays.toString(nums2));
                
                //5.转化为int数组
                int[] nums11=strToNumber(nums1);
                int[] nums22=strToNumber(nums2);
                System.out.println("转化为int后的数组A:"+Arrays.toString(nums11));
                System.out.println("转化为int后的数组B:"+Arrays.toString(nums22));
                
                //6.获得三张牌的相等情况
                int[] equalNum11=equalNum(nums11);
                int[] equalNum22=equalNum(nums22);
                System.out.println("三张牌的相等情况--数组A:"+Arrays.toString(equalNum11));
                System.out.println("三张牌的相等情况--数组B:"+Arrays.toString(equalNum22));
                
                //7.判断输赢
                int whoWin=whoWin(equalNum11, nums11, equalNum22, nums22);
                System.out.println(""+whoWin);
                
            }
            
            //是否继续
            System.out.println("是否继续?输入N或n退出,其他任意键继续!");
            String string = scanner.next();
            string=string.toUpperCase();
            if("N".equals(string)){
                isContinue=false;
            }
        }

    }

    /*1.判断输入的内容是否合法
     *          不合法两种情况:(1)出现的字符不是2,3,4,5,6,7,8,9,10,J,Q,K,A
                                (2)每种牌只有4张,超过4张则不合法了
     *方法说明:
     *该方法只处理情况(1),情况(2)放在判断输赢的时候处理,因为第二种情况涉及牌面转化后计算的问题*/
    public static boolean isValid(String num1, String num2) {
        String reg = "([2-9JQKA]|10){3}";// 正则匹配,只能出现2,3,4,5,6,7,8,9,10,J,Q,K,A,并且一共只能出现3次
        boolean a = num1.matches(reg);
        boolean b = num2.matches(reg);

        // 有一方不合法就返回false
        if (a == false || b == false) {
            return false;
        } else {
            // 都合法
            return true;
        }
    }

    // 1.拆分字符串,得到三个数字
    public static String[] getStrArray(String num) {
        // 字符串的长度和拆分后的数组
        int length = num.length();
        String[] nums = new String[3];
        // 无论输入的J,Q,K,A是否为大写,都改为大写
        num.toUpperCase();

        // 字符串不含10时,长度都为3
        if (length == 3) {
            // nums=num.split("");//使用该方法拆分会多出一个空格位--比如33a-->[,3,3,1]
            for (int i = 0; i  2) {
                nums[0] = nums[2] = "10";
                nums[1] = num.substring(2, 3);
            } else {
                // 两个1距离等于2时,说明两个10是挨在一起的
                if (first == 0) {
                    nums[0] = nums[1] = "10";
                    nums[2] = num.substring(4);
                } else {
                    nums[0] = num.substring(0, 1);
                    nums[1] = nums[2] = "10";
                }
            }

        } else {
            // 字符串为3个10
            for (int i = 0; i  b[1]) {
                return 1;
            } else if (a[1]  primaryB[0]) {
                    return 1;
                } else if (primaryA[0]  b[1]) {
                        return 1;
                    } else if (a[1]  thirdB) {
                            return 1;
                        } else if (thirdA  primaryB[2]) {
                        return 1;
                    } else if (primaryA[2]  primaryB[1]) {
                            return 1;
                        } else if (primaryA[1]  primaryB[0]) {
                                return 1;
                            } else if (primaryA[0] 

#執行測試

##長度不合法


如何用程式碼實現札金花遊戲單牌6出現了5次,不合法


如何用程式碼實現札金花遊戲豹子


如何用程式碼實現札金花遊戲順子和對子


如何用程式碼實現札金花遊戲#都是字母,順子和對子


如何用程式碼實現札金花遊戲#出現10,兩個順子


如何用程式碼實現札金花遊戲#都沒有牌型,直接比大小

#

以上是如何用程式碼實現札金花遊戲的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn