Q
ババ抜きゲームを作成せよ。
人数を入れると自動実行され、順位が表示されるものとする。
詳しくは実行例を参照のこと
[実行例]
****ババ抜きゲーム!****
何人で遊びますか>3
手札を表示します。
Player1*********************************
H6 D3 C4 H4 C8 H9 H5 C1 S7 S1 H8 C2 H1 C10 H13 H10 S8 C9
Player2*********************************
D9 H3 D8 D11 D7 H2 C11 D5 C12 Joker C5 S11 S6 C3 D12 D10 C13 S2
Player3*********************************
S3 D4 D6 S9 H12 H11 S13 S5 H7 S10 C6 S4 D2 D13 D1 S12 C7
全員のペアを場に捨てました。
手札を表示します。
Player1*********************************
H6 D3 C8 H5 C1 S7 C2 H13
Player2*********************************
D9 D8 D11 D7 Joker S6 D10 C13
Player3*********************************
S3 S9 H11 S5 S10 D2 D1
Player1のターン(ターン1)
Player1*****************************
H6 D3 C8 H5 C1 S7 C2 H13
Player2*****************************
D9 D8 D11 D7 Joker S6 D10 C13
S6を引いた
Player1*****************************
H6 D3 C8 H5 C1 S7 C2 H13 S6
Player2*****************************
D9 D8 D11 D7 Joker D10 C13
ペアになったカードを捨てた。
Player2のターン(ターン2)
Player2*****************************
D9 D8 D11 D7 Joker D10 C13
Player3*****************************
S3 S9 H11 S5 S10 D2 D1
D2を引いた
Player2*****************************
D9 D8 D11 D7 Joker D10 C13 D2
Player3*****************************
S3 S9 H11 S5 S10 D1
カードは揃わなかった。
Player3のターン(ターン3)
Player3*****************************
S3 S9 H11 S5 S10 D1
Player1*****************************
D3 C8 H5 C1 S7 C2 H13
D3を引いた
Player3*****************************
S3 S9 H11 S5 S10 D1 D3
Player1*****************************
C8 H5 C1 S7 C2 H13
ペアになったカードを捨てた。
Player1のターン(ターン4)
Player1*****************************
C8 H5 C1 S7 C2 H13
Player2*****************************
D9 D8 D11 D7 Joker D10 C13 D2
D10を引いた
Player1*****************************
C8 H5 C1 S7 C2 H13 D10
Player2*****************************
D9 D8 D11 D7 Joker C13 D2
カードは揃わなかった。
Player2のターン(ターン5)
Player2*****************************
D9 D8 D11 D7 Joker C13 D2
Player3*****************************
S9 H11 S5 S10 D1
S10を引いた
Player2*****************************
D9 D8 D11 D7 Joker C13 D2 S10
Player3*****************************
S9 H11 S5 D1
カードは揃わなかった。
Player3のターン(ターン6)
Player3*****************************
S9 H11 S5 D1
Player1*****************************
C8 H5 C1 S7 C2 H13 D10
C1を引いた
Player3*****************************
S9 H11 S5 D1 C1
Player1*****************************
C8 H5 S7 C2 H13 D10
ペアになったカードを捨てた。
Player1のターン(ターン7)
Player1*****************************
C8 H5 S7 C2 H13 D10
Player2*****************************
D9 D8 D11 D7 Joker C13 D2 S10
C13を引いた
Player1*****************************
C8 H5 S7 C2 H13 D10 C13
Player2*****************************
D9 D8 D11 D7 Joker D2 S10
ペアになったカードを捨てた。
Player2のターン(ターン8)
Player2*****************************
D9 D8 D11 D7 Joker D2 S10
Player3*****************************
S9 H11 S5
S9を引いた
Player2*****************************
D9 D8 D11 D7 Joker D2 S10 S9
Player3*****************************
H11 S5
ペアになったカードを捨てた。
Player3のターン(ターン9)
Player3*****************************
H11 S5
Player1*****************************
C8 H5 S7 C2 D10
C8を引いた
Player3*****************************
H11 S5 C8
Player1*****************************
H5 S7 C2 D10
カードは揃わなかった。
Player1のターン(ターン10)
Player1*****************************
H5 S7 C2 D10
Player2*****************************
D8 D11 D7 Joker D2 S10
Jokerを引いた
Player1*****************************
H5 S7 C2 D10 Joker
Player2*****************************
D8 D11 D7 D2 S10
カードは揃わなかった。
Player2のターン(ターン11)
Player2*****************************
D8 D11 D7 D2 S10
Player3*****************************
H11 S5 C8
C8を引いた
Player2*****************************
D8 D11 D7 D2 S10 C8
Player3*****************************
H11 S5
ペアになったカードを捨てた。
Player3のターン(ターン12)
Player3*****************************
H11 S5
Player1*****************************
H5 S7 C2 D10 Joker
H5を引いた
Player3*****************************
H11 S5 H5
Player1*****************************
S7 C2 D10 Joker
ペアになったカードを捨てた。
Player1のターン(ターン13)
Player1*****************************
S7 C2 D10 Joker
Player2*****************************
D11 D7 D2 S10
D2を引いた
Player1*****************************
S7 C2 D10 Joker D2
Player2*****************************
D11 D7 S10
ペアになったカードを捨てた。
Player2のターン(ターン14)
Player2*****************************
D11 D7 S10
Player3*****************************
H11
H11を引いた
Player2*****************************
D11 D7 S10 H11
Player3*****************************
あがり!
Player3は1位であがった!
ペアになったカードを捨てた。
Player1のターン(ターン15)
Player1*****************************
S7 D10 Joker
Player2*****************************
D7 S10
S10を引いた
Player1*****************************
S7 D10 Joker S10
Player2*****************************
D7
ペアになったカードを捨てた。
Player2のターン(ターン16)
Player2*****************************
D7
Player1*****************************
S7 Joker
Jokerを引いた
Player2*****************************
D7 Joker
Player1*****************************
S7
カードは揃わなかった。
Player1のターン(ターン17)
Player1*****************************
S7
Player2*****************************
D7 Joker
D7を引いた
Player1*****************************
S7 D7
Player2*****************************
Joker
ペアになったカードを捨てた。
Player1は2位であがった!
Player2の負けでした。合計ターン:17
*****結果*****
1位:Player3
2位:Player1
負け:Player2
もう一度やりますか?yes…1 no…2>1
何人で遊びますか>2
手札を表示します。
Player1*********************************
D5 H11 S1 H7 H8 D13 C4 C13 H3 D2 C5 D4 D8 D11 C12 D10 D9 H10 Joker D6 S10 D3 H13 H12 H5 C2 C8
Player2*********************************
S9 S4 S6 H2 S3 D7 C11 H9 C3 C6 C7 H6 S7 D12 S2 D1 S5 C9 S12 H1 S13 C1 S11 H4 C10 S8
全員のペアを場に捨てました。
手札を表示します。
Player1*********************************
D5 S1 H7 H8 D13 D10 D9 Joker D6
Player2*********************************
S9 S6 D7 D1 S5 S13 C10 S8
Player1のターン(ターン1)
Player1*****************************
D5 S1 H7 H8 D13 D10 D9 Joker D6
Player2*****************************
S9 S6 D7 D1 S5 S13 C10 S8
D7を引いた
Player1*****************************
D5 S1 H7 H8 D13 D10 D9 Joker D6 D7
Player2*****************************
S9 S6 D1 S5 S13 C10 S8
ペアになったカードを捨てた。
Player2のターン(ターン2)
Player2*****************************
S9 S6 D1 S5 S13 C10 S8
Player1*****************************
D5 S1 H8 D13 D10 D9 Joker D6
D10を引いた
Player2*****************************
S9 S6 D1 S5 S13 C10 S8 D10
Player1*****************************
D5 S1 H8 D13 D9 Joker D6
ペアになったカードを捨てた。
Player1のターン(ターン3)
Player1*****************************
D5 S1 H8 D13 D9 Joker D6
Player2*****************************
S9 S6 D1 S5 S13 S8
S8を引いた
Player1*****************************
D5 S1 H8 D13 D9 Joker D6 S8
Player2*****************************
S9 S6 D1 S5 S13
ペアになったカードを捨てた。
Player2のターン(ターン4)
Player2*****************************
S9 S6 D1 S5 S13
Player1*****************************
D5 S1 D13 D9 Joker D6
D13を引いた
Player2*****************************
S9 S6 D1 S5 S13 D13
Player1*****************************
D5 S1 D9 Joker D6
ペアになったカードを捨てた。
Player1のターン(ターン5)
Player1*****************************
D5 S1 D9 Joker D6
Player2*****************************
S9 S6 D1 S5
S9を引いた
Player1*****************************
D5 S1 D9 Joker D6 S9
Player2*****************************
S6 D1 S5
ペアになったカードを捨てた。
Player2のターン(ターン6)
Player2*****************************
S6 D1 S5
Player1*****************************
D5 S1 Joker D6
D6を引いた
Player2*****************************
S6 D1 S5 D6
Player1*****************************
D5 S1 Joker
ペアになったカードを捨てた。
Player1のターン(ターン7)
Player1*****************************
D5 S1 Joker
Player2*****************************
D1 S5
S5を引いた
Player1*****************************
D5 S1 Joker S5
Player2*****************************
D1
ペアになったカードを捨てた。
Player2のターン(ターン8)
Player2*****************************
D1
Player1*****************************
S1 Joker
S1を引いた
Player2*****************************
D1 S1
Player1*****************************
Joker
ペアになったカードを捨てた。
Player2は1位であがった!
Player1の負けでした。合計ターン:8
*****結果*****
1位:Player2
負け:Player1
もう一度やりますか?yes…1 no…2>2
アプリケーションを終了します。
[解答例]
●Card.java

public class Card {
	String suit;
	int no;
	String show(){
		return suit.equals("Joker")? "Joker":suit+no;
	}
}

●Member.java

import java.util.ArrayList;

public class Member {
	String name;
	ArrayList<Card> hand=new ArrayList<>();
	int rank;
	boolean hasBaton;
	static int totalRanking=0;
	
}

●BabanukiApp.java

import java.util.*;
public class BabanukiApp {
	static Random rand=new Random();
	static Scanner scan=new Scanner(System.in);
	static ArrayList<Card> Deck=new ArrayList<>();
	static ArrayList<Member> members;
	static boolean hasFirstFinish=false;
	static ArrayList<String> result;
	static int turnCount;
	public static void main(String[] args) {
		System.out.println("****ババ抜きゲーム!****");
		int select;
		do {
			createDeck();
			initMemberHands();
			showAllhands();
			discardAll();
			showAllhands();
			mainGame();
			System.out.print("もう一度やりますか?yes...1 no...2>");
			select = scan.nextInt();	
		} while (select==1);
		System.out.println("アプリケーションを終了します。");
		scan.close();
	}
	public static void createDeck(){
		String[] suits={"S","D","H","C"};
		for(int i=0;i<suits.length;i++){
			for(int j=1;j<=13;j++){
				Card card=new Card();
				card.suit=suits[i];
				card.no=j;
				Deck.add(card);
			}
		}
		Card card = new Card();
		card.suit="Joker";
		Deck.add(card);
	}
	public static void initMemberHands(){
		Member.totalRanking=0;
		turnCount=0;
		members=new ArrayList<>();
		result=new ArrayList<>();
		System.out.print("何人で遊びますか>");
		int memberNum=scan.nextInt();
		for(int i=0;i<memberNum;i++){
			Member member=new Member();
			member.name="Player"+(i+1);
			members.add(member);
		}
		for(int i=0,count=Deck.size();i<count;i++){
			int index=rand.nextInt(Deck.size());
			Card drawn=Deck.remove(index);
			members.get(i%members.size()).hand.add(drawn);
		}
	}
	public static String createHandStr(ArrayList<Card> hand){
		String str="";
		for(Card c:hand){
			str+=c.show()+" ";
		}
		return str;
	}
	public static String createHandStr(Member member){
		String str=member.name+"*****************************\n";
		if(member.hand.size()==0){
			str+="あがり!";
		}else{
			str+=createHandStr(member.hand);
		}	
		return str;	
	}
	public static void showAllhands(){
		System.out.println("手札を表示します。");
		for(int i=0;i<members.size();i++){
			System.out.printf("%s*********************************%n",members.get(i).name);
			System.out.println(createHandStr(members.get(i).hand));
		}
	}
	public static void discardPair(ArrayList<Card> hands){
		int[] numbers=new int[14];
		int[] discardCount=new int[14];
		for(Card c:hands){
			numbers[c.no]++;
		}
		for(int i=hands.size()-1;i>=0;i--){
			int no=hands.get(i).no;
			if(numbers[no]%2==0){
				hands.remove(i);
			}
			if(numbers[no]==3 && discardCount[no] != 2){
				hands.remove(i);
				discardCount[no]++;
			}
		}	
	}
	public static void discardAll(){
		System.out.println("全員のペアを場に捨てました。");
		Iterator<Member> it=members.iterator();
		while(it.hasNext()){
			Member m=it.next();
			discardPair(m.hand);
			if(m.hand.size()==0){
				hasFirstFinish=true;
				Member.totalRanking++;
				m.rank=Member.totalRanking;
				System.out.println(m.name+"は"+m.rank+"位であがった!");
				result.add(Member.totalRanking+"位:"+m.name+" 天和!!");
				it.remove();
			}
		}	
	}
	public static void drawOthers(Member turn,Member other){
		
		System.out.printf("%sのターン%n",turn.name);
		System.out.println(createHandStr(turn));
		System.out.println(createHandStr(other));
		int before=turn.hand.size();
		Card taken=other.hand.remove(rand.nextInt(other.hand.size()));
		System.out.printf("%sを引いた%n", taken.show());
		
		turn.hand.add(taken);
		System.out.println(createHandStr(turn));
		System.out.println(createHandStr(other));
		if(other.hand.size()==0){
			Member.totalRanking++;
			other.rank=Member.totalRanking;
			System.out.println(other.name+"は"+other.rank+"位であがった!");
			result.add(Member.totalRanking+"位:"+other.name);
			members.remove(other);
		}
		discardPair(turn.hand);
		if(turn.hand.size() < before){
			System.out.println("ペアになったカードを捨てた。");
		}else{
			System.out.println("カードは揃わなかった。");
		}
		if(turn.hand.size()==0){
			Member.totalRanking++;
			turn.rank=Member.totalRanking;
			System.out.println(turn.name+"は"+turn.rank+"位であがった!");
			result.add(Member.totalRanking+"位:"+turn.name);
			members.remove(turn);
		}		
	}
	public static void mainGame(){
		Member first=null;
		Member next=null;
		members.get(0).hasBaton=true;
		while(true){
			turnCount++;
			for(int i=0;i<members.size();i++){
				if(members.get(i).hasBaton){
					first=members.get(i);
					first.hasBaton=false;
					next=i==members.size()-1 ? members.get(0) :members.get(i+1);
					next.hasBaton=true;
					break;
				}
			}
			System.out.printf("%sのターン(ターン%d)%n",first.name,turnCount);
			System.out.println(createHandStr(first));
			System.out.println(createHandStr(next));
			int before=first.hand.size();
			Card taken=next.hand.remove(rand.nextInt(next.hand.size()));
			System.out.printf("%sを引いた%n", taken.show());	
			first.hand.add(taken);
			System.out.println(createHandStr(first));
			System.out.println(createHandStr(next));
			if(next.hand.size()==0){
				Member.totalRanking++;
				next.rank=Member.totalRanking;
				System.out.println(next.name+"は"+next.rank+"位であがった!");
				result.add(Member.totalRanking+"位:"+next.name);
				int index=members.indexOf(next);
				if(index==members.size()-1){
					members.get(0).hasBaton=true;
				}else{
					members.get(index+1).hasBaton=true;
				}
				members.remove(next);
			}
			discardPair(first.hand);
			if(first.hand.size() < before){
				System.out.println("ペアになったカードを捨てた。");
			}else{
				System.out.println("カードは揃わなかった。");
			}
			if(first.hand.size()==0){
				Member.totalRanking++;
				first.rank=Member.totalRanking;
				System.out.println(first.name+"は"+first.rank+"位であがった!");
				result.add(Member.totalRanking+"位:"+first.name);
				members.remove(first);
			}	
			if(members.size()==1){
				if(hasFirstFinish){
					System.out.println("FirstFinish");
				}
				System.out.println(members.get(0).name+"の負けでした。合計ターン:"+turnCount);
				result.add("負け:"+members.get(0).name);
				System.out.println("*****結果*****");
				for(String str:result){
					System.out.println(str);
				}
				return;
			}		
		}	
	}
}