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; } } } }
コメント