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