>  기사  >  Java  >  코드로 Zha Jinhua 게임을 구현하는 방법

코드로 Zha Jinhua 게임을 구현하는 방법

零下一度
零下一度원래의
2017-06-26 14:10:302397검색

자진화 같은 작은 게임에서 프로그래머가 되고 싶어요. 그들 중 대부분은 어렸을 때 그것을 가지고 놀았습니다! 이제 소후 면접 질문을 살펴보겠습니다! 코드를 사용하여 Zha Jinhua를 구현하는 방법을 알아보세요.


질문

원인

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

게임 규칙:

총 52장의 일반 카드, 카드는 2,3,4,5,6,7,8,9, 10개의 J, Q, K, A 중 하나(크기가 증가함), 각 사람은 3장의 카드를 받습니다. 두 사람이 손에 들고 있는 카드 3장을 비교하여 더 큰 카드를 가진 사람이 승리합니다.

카드 종류에 대한 규칙은 다음과 같습니다.

  • 1. 3개의 동일한 카드는 표범입니다.

  • 2. 3개의 카드가 서로 연결되어 직선을 이룹니다(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를 사용하여 반환을 판단하세요

  • 누가 지고 누가 이겼는지 비교하세요. 큰 것부터 작은 것까지 비교하고 먼저 표범이 있는지 판단한 다음 스트레이트를 판단하고 쌍을 판단하고 마지막으로 카드 없는 타입으로 판단

  • 스트레이트 처리 문제

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] <h2><strong>테스트 실행</strong></h2><p><strong>길이가 불법입니다</strong><br><img src="https://img.php.cn/upload/article/000/000/001/383c341ff337c87b48f4468a5b9909cf-0.png" alt="코드로 Zha Jinhua 게임을 구현하는 방법"></p><p><strong>카드 1장 6이 나타납니다 5번은 불법입니다</strong> <br><img src="https://img.php.cn/upload/article/000/000/001/112731fc5aabcfefb7340343c06be2b1-1.png" alt="코드로 Zha Jinhua 게임을 구현하는 방법"></p><p><strong>Leopard</strong><br><img src="https://img.php.cn/upload/article/000/000/001/112731fc5aabcfefb7340343c06be2b1-2.png" alt="코드로 Zha Jinhua 게임을 구현하는 방법"></p><p><strong>스트레이트와 페어</strong><br><img src="https://img.php.cn/upload/article/000/000/001/112731fc5aabcfefb7340343c06be2b1-3.png" alt="코드로 Zha Jinhua 게임을 구현하는 방법"></p><p><strong>는 모두 문자, 스트레이트와 페어</strong><br><img src="https://img.php.cn/upload/article/000/000/001/4d65838ea7c1c524e17fdc04439ab32c-4.png" alt="코드로 Zha Jinhua 게임을 구현하는 방법"></p><p><strong> 1개가 나타납니다. 0, 두 직진</strong> <br><img src="https://img.php.cn/upload/article/000/000/001/4d65838ea7c1c524e17fdc04439ab32c-5.png" alt="코드로 Zha Jinhua 게임을 구현하는 방법"></p> <p> <strong>카드 종류는 없고 직접 사이즈를 비교해 보세요</strong><br><img src="https://img.php.cn/upload/article/000/000/001/4d65838ea7c1c524e17fdc04439ab32c-6.png" alt="코드로 Zha Jinhua 게임을 구현하는 방법"></p>

위 내용은 코드로 Zha Jinhua 게임을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.