Zha Jinhua ゲームをコードで実装する方法

零下一度
リリース: 2017-06-26 14:10:30
オリジナル
2401 人が閲覧しました

Zha Jinhua のような小さなゲームのために、私はプログラマーになりたいです。ほとんどの人が子供の頃に遊んだことがあります!それでは、捜狐のインタビューの質問を見てみましょう!コードを使用して Zha Jinhua を実装する方法をご覧ください。


Q質問

原因

两个搜狐的程序员加了一个月班,终于放假了,于是他们决定扎金花渡过愉快的假期 。
ログイン後にコピー

ゲームルール:

普通のカード合計52枚、カードは2、3、4、5、6、7、8、9、 J、Q、K、A の 10 枚のうち 1 枚ずつサイズが増加し、各人が 3 枚ずつカードを引きます。 2人は自分の手元にある3枚のカードを比べ、より大きなカードを持っている人の勝ちとなります。

カードの種類のルールは次のとおりです:

  • 1. 3枚の同じカードがつながってストレートになります

  • 2.カードタイプが同じ場合、ペアとして同じカードが 2 枚だけあります。 (AAA>KKK、QAK>534、QQ2>10104 など) どちらのプレイヤーも特殊なカード タイプを持っていない場合は、3 枚のカードのうち最大のカードを順番に比較します。最も高いカードが同じ場合は、2 番目に高いカードが比較され、2 つのカードが同じ場合は引き分けとなります。

  • 入力説明:

    输入两个字符串代表两个玩家的牌(如”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) string配列 int配列に変換してソート
  • (4) 3枚のカードが等しいか判定
  • (5) 誰が負けて誰が勝ったかを比較
  • 2. 難易度分析

が存在します 10時に、文字列の分割の問題: 文字列の長さに応じて分割を判断できます

    文字を数字に変換します: まず、取得したすべての文字列を大文字に変換します。大文字は同じなので、if を使用してリターンを判断します
  • 誰が負けて誰が勝ったかを比較します。大きいものから小さいものまで比較し、最初にヒョウがいるかどうかを判断し、次にストレートを判断し、次にペアを判断します。カードなしのタイプを判断する
  • ストレートの処理に関する問題
  • 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回は違法です
Zha Jinhua ゲームをコードで実装する方法

Leopard
Zha Jinhua ゲームをコードで実装する方法

ストレートとペア
Zha Jinhua ゲームをコードで実装する方法

はすべて文字です、ストレートとペア
Zha Jinhua ゲームをコードで実装する方法

が表示されます0、2 ストレート
Zha Jinhua ゲームをコードで実装する方法

カードの種類はありません、サイズを直接比較してください
Zha Jinhua ゲームをコードで実装する方法

以上がZha Jinhua ゲームをコードで実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート