目錄
如何用程式碼實現札金花遊戲
Jun 26, 2017 pm 02:10 PM
員工
搜狐
演算法
面試
扎金花這種小遊戲,我想作為一名程式設計師。大部分小時候都玩過吧!現在我們一起來看看搜狐這道面試題吧!看看如何用程式碼實現札金花。
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 代表不合法的输入
登入後複製
1 代表 玩家1赢 0 代表 平局 -1 代表 玩家2赢 -2 代表不合法的输入
登入後複製
輸入範例:KQ3 3Q9
10QA 6102
5810 7KK
632 74J
10102 K77
JKJ 926
68K 27A
登入後複製
KQ3 3Q9 10QA 6102 5810 7KK 632 74J 10102 K77 JKJ 926 68K 27A
登入後複製
輸出範例:1
1
-1
-1
1
1
-1
登入後複製
1 1 -1 -1 1 1 -1
登入後複製
##A解
1 .邏輯分析
- (1)拿到玩家1和2輸入的字串,判斷是否合法
- (2)合法後,拆分字串為字串陣列
- (3)將字串陣列轉換為int數組,並排序
- ( 4)判斷3張牌的相等情況
- (5)比較大小,誰輸誰贏
- 存在10時,字串的拆分問題:可以根據字串長度來判斷拆分
- 將字母轉為數字:先將拿到的字串都轉為大寫,這樣小寫和大寫字母都一樣了,然後直接用if判斷return就可以了
- 比較誰輸誰贏:採用從大到小的方式比較,先判斷是否有豹子,在判斷順子,再判斷對子,最後判斷無牌型的
- 對順子的處理問題
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]
登入後複製
#執行測試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

熱門文章
擊敗分裂小說需要多長時間?
3 週前
By DDD
倉庫:如何復興隊友
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
公眾號網頁更新緩存難題:如何避免版本更新後舊緩存影響用戶體驗?
3 週前
By 王林
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前
By 尊渡假赌尊渡假赌尊渡假赌

熱門文章
擊敗分裂小說需要多長時間?
3 週前
By DDD
倉庫:如何復興隊友
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
公眾號網頁更新緩存難題:如何避免版本更新後舊緩存影響用戶體驗?
3 週前
By 王林
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前
By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

CLIP-BEVFormer:明確監督BEVFormer結構,提升長尾偵測性能
