瘋狂Java講義第六章下“梭哈遊戲練習”
阿新 • • 發佈:2019-01-13
定義一個類,該類用於封裝一桌梭哈遊戲,這個類應該包含桌上剩下的牌的資訊,幷包含5個玩家的狀態資訊:他們各自的位置,遊戲狀態(正在遊戲或已放棄)、手上已有的牌等資訊。如果有可能,這個類還應該實現發牌方法,這個方法需要控制從誰開始發牌,不要發牌給放棄的人,並修改桌上剩下的牌。
一些思路:
1.發牌前先洗牌,可以呼叫Collections.shuffle(List)。預設撲克的一種有序的排列,然後進行編號,將這52個編號打亂,在找到對應的撲克。
2.發牌按照座位號的順序,玩家隨意入座。考慮到放棄遊戲的玩家將不會發到牌,庫頂的牌需要做“歸位”處理。
3.五張牌的組合判斷:同花和順子的判斷較為簡單,對於兩對,三對這類的組合只需要統計重複撲克的次數即可,方法同“判斷陣列中各元素出現的次數”,可參考
程式碼如下:
import java.util.*;
public class Stud {
private static final int ROYAL_FLUSH = 10;
private static final int SRTAIGHT_FLUSH = 9;
private static final int FOUR = 8;
private static final int FULLHOUSE = 7;
private static final int FLUSH = 6;
private static final int STRAIGHT = 5;
private static final int THREE = 4;
private static final int TWO_PAIRS = 3;
private static final int ONE_PAIRS = 2;
private static final int ZILCH = 1;
private static final int GIVE_UP = 0;
private static final int PLAYER_ALL = 5;
//0:♠ 1:♣ 2:♥ 3:♦
public static String[] sPoker = new String[52]; //after shuffle
private static int topcard = 0;
private static int top = 0;
private static int dealTimes = 0;
private static int seatStart = 0; // 0~4
private static int rounds = 1;
private static int space = 0;
private static int[] winner = new int[5];
private class Player {
String pName;
boolean state = true;
String[] handPoker = new String[5];
int[] handPokerNum = new int[5];
char[] handPokerColor = new char[5];
}
static Player seat[] = new Player[PLAYER_ALL];
//Initialization
public void studInit() {
String[][] Poker = new String[4][13];
String[] color = {"♠", "♣", "♥", "♦"};
String[] num = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
String[] name = {"player1", "player2", "player3", "player4", "player5"};
for(int i =0 ; i < PLAYER_ALL; i++) {
seat[i] = new Player();
}
for (int i = 0; i <4; i++) {
for (int j = 0; j <13; j++) {
Poker[i][j] = color[i]+num[j];
}
}
//Shuffle
List<Integer> cardList = new ArrayList<Integer>();
for (int i = 0; i < 52; i++) {
cardList.add(i+1);
}
Collections.shuffle(cardList);
//exchange list to poker
for (int n = 0; n < 52; n++) {
sPoker[n] = Poker[(cardList.get(n)-1)/13][(cardList.get(n)-1)%13];
System.out.print(sPoker[n]+" ");
}
System.out.print("\n");
//take a seat
List<Integer> pList = new ArrayList<Integer>();
for (int i = 0; i < PLAYER_ALL; i++) {
pList.add(i);
}
Collections.shuffle(pList);
for (int n = 0; n < PLAYER_ALL; n++) {
seat[n].pName = name[pList.get(n)];
}
}
public void match(Player p, int k) {
switch(p.handPoker[k].charAt(1)) {
case 'A' :
p.handPokerNum[k] = 1;
break;
case 'J' :
p.handPokerNum[k] = 11;
break;
case 'Q' :
p.handPokerNum[k] = 12;
break;
case 'K' :
p.handPokerNum[k] = 13;
break;
default :
p.handPokerNum[k] =(int)(p.handPoker[k].charAt(1)) - 48;
}
}
//deal cards 存在放棄的玩家,需要space對topcard進行“歸位”
public void deal(int sStrat) {
sStrat = seatStart;
for(int i = 0; i < PLAYER_ALL; i++) {
top = topcard - space;
switch(topcard%5) {
case 0:
if(seat[sStrat%5].state) {
seat[sStrat%5].handPoker[dealTimes] = sPoker[top];
seat[sStrat%5].handPokerColor[dealTimes] = seat[sStrat%5].handPoker[dealTimes].charAt(0);
match(seat[sStrat%5], dealTimes);
}
else space ++;
break;
case 1:
if(seat[(sStrat+1)%5].state) {
seat[(sStrat+1)%5].handPoker[dealTimes] = sPoker[top];
seat[(sStrat+1)%5].handPokerColor[dealTimes] = seat[(sStrat+1)%5].handPoker[dealTimes].charAt(0);
match(seat[(seatStart+1)%5], dealTimes);
}
else space ++;
break;
case 2:
if(seat[(sStrat+2)%5].state) {
seat[(sStrat+2)%5].handPoker[dealTimes] = sPoker[top];
seat[(sStrat+2)%5].handPokerColor[dealTimes] = seat[(sStrat+2)%5].handPoker[dealTimes].charAt(0);
match(seat[(sStrat+2)%5], dealTimes);
}
else space ++;
break;
case 3:
if(seat[(sStrat+3)%5].state) {
seat[(sStrat+3)%5].handPoker[dealTimes] = sPoker[top];
seat[(sStrat+3)%5].handPokerColor[dealTimes] = seat[(sStrat+3)%5].handPoker[dealTimes].charAt(0);
match(seat[(sStrat+3)%5], dealTimes);
}
else space ++;
break;
case 4:
if(seat[(sStrat+4)%5].state) {
seat[(sStrat+4)%5].handPoker[dealTimes] = sPoker[top];
seat[(sStrat+4)%5].handPokerColor[dealTimes] = seat[(sStrat+4)%5].handPoker[dealTimes].charAt(0);
match(seat[(sStrat+4)%5], dealTimes);
}
else space ++;
break;
}
topcard ++;
}
dealTimes++;
}
//STRAIGHT
public boolean jStraight(Player p) {
//Sort
boolean flag = false;
Arrays.sort(p.handPokerNum);
for (int i = 0; i < p.handPokerNum.length-1; i++) {
if(p.handPokerNum[i]+1 == p.handPokerNum[i+1])
flag = true;
else {
flag = false;
break;
}
}
return flag;
}
//FLUSH
public boolean jFlush(Player p) {
boolean flag = false;
for (int i = 0; i < p.handPokerColor.length-1; i++) {
if(p.handPokerColor[i] == p.handPokerColor[i+1])
flag = true;
else {
flag = false;
break;
}
}
return flag;
}
// FOUR, FULLHOUSE, THREE, TWO_PAIRS, ONE_PAIRS
public int repetition(Player p) {
int reFour = 0;
int reThree = 0;
int reTwo= 0;
HashMap<Integer, Integer> pokers = new HashMap<Integer, Integer>();
for(int num : p.handPokerNum) {
Integer key = pokers.get(num);
pokers.put(num, key == null ? 1 : key+1);
}
Iterator<Integer> itr = pokers.keySet().iterator();
while(itr.hasNext()) {
Object key = itr.next();
if(pokers.get(key) == 4) {
reFour ++;
break;
}
else if(pokers.get(key) == 3)
reThree ++;
else if(pokers.get(key) ==2)
reTwo ++;
}
if(reFour == 1) return FOUR;
if(reThree == 1 && reTwo == 1) return FULLHOUSE;
if(reThree == 1 && reTwo == 0) return THREE;
if(reTwo == 2) return TWO_PAIRS;
if(reThree == 0 && reTwo ==1) return ONE_PAIRS;
else return ZILCH;
}
public int type(Player p) {
int TYPE = 0;
if(p.state) {
if(jStraight(p)) {
if(jFlush(p)) {
if(p.handPokerNum[0] == 1)
TYPE = ROYAL_FLUSH;
else
TYPE = SRTAIGHT_FLUSH;
}
else TYPE = STRAIGHT;
}
else if(jFlush(p)) TYPE = FLUSH;
else TYPE = repetition(p);
return TYPE;
}
else return GIVE_UP;
}
//其他輔助函式
public char[] change(String str) {
String s;
s = str.replace(" ", ""); //刪除字串中的空格
char[] stringArr = s.toCharArray(); //字串轉換為陣列
return stringArr;
}
public int max(int data[]) {
int m = 0;
for (int i = 0; i < data.length; i++)
{
if(m < data[i]) m= data[i];
}
return m;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Stud s = new Stud();
s.studInit();
Scanner in = new Scanner(System.in);
System.out.println("=======5人梭哈遊戲=======");
System.out.print("隨機分配座位... 回車開始遊戲");
while(in.nextLine() == null);
for (int i = 0; i < PLAYER_ALL; i++) {
System.out.print(" || "+(i+1)+"號座位: "+seat[i].pName+" || ");
}
System.out.println();
//以下不考慮輸入錯誤
System.out.print("確認從幾號座位開始發牌(輸入1~5):");
int sSt = 0;
sSt = in.nextInt();
seatStart = sSt