Created
July 4, 2019 01:19
-
-
Save SkBull/3584bf1ee0408c3d93afa254c0e5f53c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| package master; | |
| import java.util.List; | |
| import java.util.ArrayList; | |
| import java.util.Collections; | |
| import java.util.Scanner; | |
| class Sevens{ | |
| private List<Integer> cards = new ArrayList<Integer>(); | |
| private boolean ctable [][] = new boolean [4][13]; | |
| private int availableCards [][] = new int [4][2]; | |
| private int playersCards [][]; | |
| private int playersNum; | |
| private int maxPass; | |
| private int playerPassCount []; | |
| Sevens(int playersNum,int maxPass){ | |
| this.playersNum = playersNum; | |
| this.maxPass = maxPass; | |
| makeCardsAndSetup(); | |
| Collections.shuffle(cards); | |
| deal(); | |
| } | |
| private void makeCardsAndSetup(){ | |
| String tmpcard; | |
| int card; | |
| for(int i = 1; i < 5; i++){ | |
| for(int j = 1; j < 14; j++){ | |
| tmpcard = String.valueOf(i)+String.format("%02d",j); | |
| card = Integer.parseInt(tmpcard); | |
| if(j != 7){ | |
| cards.add(card); | |
| }else{ | |
| this.ctable[i-1][j-1] = true; | |
| this.availableCards[i-1][0] = card-1; | |
| this.availableCards[i-1][1] = card+1; | |
| } | |
| } | |
| } | |
| this.playerPassCount = new int [this.playersNum]; | |
| } | |
| private int [] distribution(int pnum,int cnum){ | |
| int res [] = new int [pnum]; | |
| int tmp = cnum%pnum; | |
| for(int i = 0; i < pnum; i++){ | |
| if(tmp != 0){ | |
| res[i] = cnum/pnum +1; | |
| tmp--; | |
| continue; | |
| } | |
| res[i] = cnum/pnum; | |
| } | |
| return res; | |
| } | |
| private void deal(){ | |
| int pn = this.playersNum; | |
| int dis [] = distribution(pn,this.cards.size()); | |
| this.playersCards = new int [pn][]; | |
| for(int i = 0; i < pn; i++){ | |
| this.playersCards[i] = new int [dis[i]]; | |
| } | |
| for(int i = 0; i < cards.size(); i++){ | |
| this.playersCards[i%pn][i/pn] = cards.get(i); | |
| } | |
| } | |
| private int [] getCtableElement(int card){ | |
| String strcard = String.valueOf(card); | |
| String nest0 = strcard.substring(0,1); | |
| String nest1 = strcard.substring(1); | |
| int retval[] = {Integer.parseInt(nest0)-1 ,Integer.parseInt(nest1)-1}; | |
| return retval; | |
| } | |
| private boolean referCtable(int card){ | |
| int celem [] = getCtableElement(card); | |
| return this.ctable[celem[0]][celem[1]]; | |
| } | |
| private List<Integer> getArrayListOfPlayerCards(int player){ | |
| List<Integer> cards = new ArrayList<Integer>(); | |
| for(int i:this.playersCards[player-1]){ | |
| cards.add(i); | |
| } | |
| return cards; | |
| } | |
| private boolean referPlayerCards(int player,int card){ | |
| List<Integer> pcards = getArrayListOfPlayerCards(player); | |
| return pcards.contains(card); | |
| } | |
| //Check if others cards is empty | |
| //retval = "" ,"lose" | |
| String beforeCheckIssue(int player){ | |
| String retval = ""; | |
| int emptyCount = 0; | |
| for(int i = 0; i < this.playersNum; i++){ | |
| List<Integer> pcards = getArrayListOfPlayerCards(player); | |
| if((pcards.isEmpty())&&(player-1 != i)){ | |
| emptyCount++; | |
| } | |
| if(emptyCount == playersNum-1){ | |
| retval = "lose"; | |
| } | |
| } | |
| return retval; | |
| } | |
| //Check if pass is maxpass and players cards is empty | |
| //retval = "win","","lose" | |
| String afterCheckIssue(int player){ | |
| String retval = ""; | |
| List<Integer> pcards = getArrayListOfPlayerCards(player); | |
| if(pcards.isEmpty()){ | |
| retval = "win"; | |
| } | |
| return retval; | |
| } | |
| private void updateCtableAndPlayersCards(int player,int card){ | |
| //update ctable | |
| int celem [] = getCtableElement(card); | |
| this.ctable[celem[0]][celem[1]] = true; | |
| //update playersCards | |
| List<Integer> pcards = getArrayListOfPlayerCards(player); | |
| pcards.remove(pcards.indexOf(card)); | |
| int newPlayersCards [][] = new int [this.playersNum][]; | |
| for(int i = 0 ; i < this.playersCards.length; i++){ | |
| if(i == player-1){ | |
| newPlayersCards[i] = new int [pcards.size()]; | |
| for(int j = 0; j < pcards.size(); j++){ | |
| newPlayersCards[i][j] = pcards.get(j); | |
| } | |
| }else{ | |
| newPlayersCards[i] = new int [playersCards[i].length]; | |
| for(int j = 0; j < this.playersCards[i].length; j++){ | |
| newPlayersCards[i][j] = this.playersCards[i][j]; | |
| } | |
| } | |
| } | |
| this.playersCards = newPlayersCards; | |
| } | |
| //overload | |
| private void updateCtableAndPlayersCards(int player,int cards[]){ | |
| for(int i : cards){ | |
| updateCtableAndPlayersCards(player, i); | |
| } | |
| } | |
| private boolean checkAvailableCards(int card){ | |
| for(int i [] : this.availableCards){ | |
| for(int j : i){ | |
| if(j == card){ | |
| return true; | |
| } | |
| } | |
| } | |
| return false; | |
| } | |
| private void updateAvailableCards(){ | |
| int suit = 0; | |
| for(int i = 0; i < this.ctable.length; i++){ | |
| suit = (i+1)*100; | |
| int cnum = 6; | |
| boolean mvRightFlag = false; | |
| //cnum = 6..1,13..7 | |
| //mvLeft | |
| while(true){ | |
| if(cnum == 0)cnum = 13; | |
| int celem [] = getCtableElement(suit+cnum); | |
| if(!this.ctable[celem[0]][celem[1]]){ | |
| this.availableCards[i][0] = suit+cnum; | |
| mvRightFlag = true; | |
| break; | |
| } | |
| //card suit is complete | |
| if(cnum == 7){ | |
| this.availableCards[i][0] = 0; | |
| this.availableCards[i][1] = 0; | |
| break; | |
| } | |
| cnum--; | |
| } | |
| if(mvRightFlag){ | |
| int count = 7; | |
| cnum = 7; | |
| //cum = 8..13,1.. | |
| while(true){ | |
| cnum = count%13+1; | |
| int celem [] = getCtableElement(suit+cnum); | |
| if(!this.ctable[celem[0]][celem[1]]){ | |
| this.availableCards[i][1] = suit+cnum; | |
| mvRightFlag = true; | |
| break; | |
| } | |
| count++; | |
| } | |
| } | |
| mvRightFlag = false; | |
| } | |
| } | |
| String play(int player,int card){ | |
| String retval = "fail"; | |
| boolean loseFlag = false; | |
| if(!(referCtable(card)){ | |
| if(referPlayerCards(player,card))){ | |
| updateCtableAndPlayersCards(player,card); | |
| if(checkAvailableCards(card)){ | |
| retval = "accept"; | |
| System.out.println("ok:"+card); | |
| updateAvailableCards(); | |
| }else{ | |
| System.out.println("not available"); | |
| loseFlag = true; | |
| } | |
| }else{ | |
| System.out.println("ctable exist"); | |
| loseFlag = true; | |
| } | |
| }else{ | |
| System.out.println("player haven't card"); | |
| loseFlag = true; | |
| } | |
| if(loseFlag){ | |
| } | |
| return retval; | |
| } | |
| void disp(String option){ | |
| switch(option){ | |
| case "p": | |
| System.out.println("players:" + playersNum); | |
| break; | |
| case "t": | |
| System.out.println("talbe:"); | |
| for(int i = 0; i < ctable.length; i++){ | |
| for(int j = 0; j < ctable[i].length; j++){ | |
| System.out.print(ctable[i][j] + ","); | |
| } | |
| System.out.println(); | |
| } | |
| break; | |
| case "ac": | |
| System.out.println("avaiable cards:"); | |
| for(int i = 0; i < availableCards.length; i++){ | |
| for(int j = 0; j < availableCards[i].length; j++){ | |
| System.out.print(availableCards[i][j] + ","); | |
| } | |
| System.out.println(); | |
| } | |
| break; | |
| case "c": | |
| System.out.println("cards:"); | |
| for(int i = 0; i < cards.size(); i++){ | |
| System.out.print(cards.get(i) + ","); | |
| if(i%12 == 11){ | |
| System.out.println(); | |
| } | |
| } | |
| break; | |
| case "pc": | |
| System.out.println("playersCards:"); | |
| for(int i = 0; i < playersCards.length; i++){ | |
| System.out.print("player " + (i+1) + " : "); | |
| for(int j = 0; j < playersCards[i].length; j++){ | |
| System.out.print(playersCards[i][j] + ","); | |
| } | |
| System.out.println(); | |
| } | |
| break; | |
| case "ppc": | |
| System.out.print("player pass count:"); | |
| for(int i = 0; i < this.playerPassCount.length; i++){ | |
| System.out.print(this.playerPassCount[i]); | |
| } | |
| System.out.println(); | |
| break; | |
| } | |
| } | |
| } | |
| class Control{ | |
| } | |
| public class SevensMaster{ | |
| public static void main(String[] args){ | |
| Sevens s = new Sevens(4,3); | |
| s.disp("ac"); | |
| s.disp("pc"); | |
| //System.out.println(s.play(1,206)); | |
| Scanner scanner = new Scanner(System.in); | |
| int co = 0; | |
| while(true){ | |
| co %= 4; | |
| System.out.println((co+1) +" player turn"); | |
| String str = scanner.nextLine(); | |
| if(str.equals("exit")){ | |
| System.out.println("end!"); | |
| break; | |
| } | |
| int c = 0; | |
| c = Integer.parseInt(str); | |
| System.out.println(s.play(co+1,c)); | |
| s.disp("t"); | |
| s.disp("ac"); | |
| s.disp("pc"); | |
| co++; | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment