Skip to content

Instantly share code, notes, and snippets.

@SkBull
Created July 4, 2019 01:19
Show Gist options
  • Select an option

  • Save SkBull/3584bf1ee0408c3d93afa254c0e5f53c to your computer and use it in GitHub Desktop.

Select an option

Save SkBull/3584bf1ee0408c3d93afa254c0e5f53c to your computer and use it in GitHub Desktop.
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