Javaでカードゲームを作成する方法を現役エンジニアが解説【初心者向け】

初心者向けにJavaでカードゲームを作成する方法について解説しています。ここでは、ババ抜きのゲームを実装する例を見ていきます。各種処理の書き方と実行結果を、サンプルコードで確認しましょう。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

Javaでカードゲームを作成する方法について解説します。

実際にプログラムを書いて説明しているので、ぜひ理解しておきましょう。

 

なお本記事は、TechAcademyのJava講座の内容をもとに作成しています。

 

田島悠介

今回は、Javaに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

カードゲームを作成する方法について詳しく説明していくね!

大石ゆかり

お願いします!

 

Javaでカードゲームを作成

Javaでババ抜きを実装します。コンソールに出力し、カードの描写は”[” + カードの数値 + “]”で簡易化して表示します。

プレイヤーと相手のそれぞれが保持しているカードの情報はString型のリストに格納します。最初に分配するカードや、相手によって選ばれるカードはMath.random()を用いてランダムに選びます。

例えば1,2,3,4,5という5つの要素が格納されたリストから、ランダムにひとつの要素を取得する場合は

(int) (Math.random() * リストの要素数)

で得られる値を要素番号に指定してリストから取得します。

相手のカードを選んだら、自分のリストに追加します。自分の保有するリストに同じ値が2つある場合はその2つの要素をリストから削除します。プレイヤーと相手で交互に繰り返し、どちらかのリストが0件になったら終わりです。

 

実際に書いてみよう

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Babanuki {

//相手のカードのリスト
  static List<String> player1_cards = new ArrayList<String>();

//プレイヤーのカードのリスト
  static List<String> player2_cards = new ArrayList<String>();

//ゲーム継続降らす
  static boolean continue_game = true;

public static void main(String[] args) throws Exception {

initGame();

Scanner sc = new Scanner(System.in);

System.out.println("-------------------------------------------------------------");
  System.out.println("重複を削除します: y:yes");

String s = sc.next();

if (s.equals("y")) {

displayCardsReverse(clearCards(player1_cards));
  displayCards(clearCards(player2_cards));
  System.out.println("-------------------------------------------------------------");

}

boolean isPlayer2 = true;

while (continue_game) {

if (isPlayer2) {

System.out.println("何番目のカードを選びますか(0~" + (player1_cards.size() - 1) + "までの数値を入力): ");

String n = sc.next();

int i = 0;

i = Integer.parseInt(n);

String choose = player1_cards.get(i);
  System.out.println("あなたの選んだカード:[" + choose + "]");
  System.out.println("-------------------------------------------------------------");

player1_cards.remove(i);
  player2_cards.add(choose);

displayCardsReverse(player1_cards);
  displayCards(clearCards(player2_cards));
  System.out.println("-------------------------------------------------------------");

isPlayer2 = false;

} else {

int i = (int) (Math.random() * player2_cards.size());

System.out.println("相手の選んだカード :[" + player2_cards.get(i) + "]");
  System.out.println("-------------------------------------------------------------");

player1_cards.add(player2_cards.get(i));
  player2_cards.remove(i);

displayCardsReverse(clearCards(player1_cards));
  displayCards(player2_cards);
  System.out.println("-------------------------------------------------------------");

isPlayer2 = true;

}

}

sc.close();

}

//リスト内に同じ数字がある場合は削除する
  private static List<String> clearCards(List<String> list) {

int i = 0;

out: while (true) {

//リストの要素数が0、または最後の値まで検証し終わったらループを抜ける
  if (list.size() == 0 || i == list.size() - 1) {
  break;
  }

String text = list.get(i);

int j = i + 1;
  while (true) {

//最後の値まで検証し終わったらループを抜ける
  if (j == list.size()) {
  break;
  }

String t = list.get(j);

// 同一数値の要素を削除
  if (text.equals(t)) {

list.remove(j);
  list.remove(i);
  i = 0;

continue out;

} else {
  j++;
  }

}

i++;

}

return list;

}

private static void initGame() {

// 1~10までとJQKをそれぞれ2枚づつ+Joker
  List<String> list = new ArrayList<String>();

for (int i = 1; i <= 10; i++) {
  list.add(String.valueOf(i));
  list.add(String.valueOf(i));
  }

list.add("J");
  list.add("J");
  list.add("Q");
  list.add("Q");
  list.add("K");
  list.add("K");
  list.add("Joker");

// player1、player2にランダムにカードを配る
  while (list.size() > 1) {

int select_num = (int) (Math.random() * list.size());

//相手のリストに追加
  player1_cards.add(list.get(select_num));

list.remove(select_num);

select_num = (int) (Math.random() * list.size());

//プレイヤーのリストに追加
  player2_cards.add(list.get(select_num));

list.remove(select_num);

}

player1_cards.add(list.get(list.size() - 1));

displayCardsReverse(player1_cards);
  displayCards(player2_cards);

}

private static void displayCards(List<String> list) {

//プレイヤーのカードを出力する
  if (list.size() == 0) {

//プレイヤーのカードが0枚の場合はプレイヤーの勝ち
  System.out.println("          YOU WIN!!");
  continue_game = false;

} else {

System.out.print("あなたのカード   :");

for (String l : list) {

//リストに保持している値を出力
  System.out.print("[");
  System.out.print(l);
  System.out.print("]");

}

System.out.println();
  }

}

private static void displayCardsReverse(List<String> list) {

//相手のカードを出力する
  if (list.size() == 0) {

//相手のカードが0枚の場合は、プレイヤーの負け
  System.out.println("          YOU LOSE!!");
  continue_game = false;

} else {

System.out.print("相手のカード    :");

for (String l : list) {

//数値を見せずに出力する
  System.out.print("[X]");

}

System.out.println();
  }

}

}

実行例は以下のようになります。

相手のカード    :[X][X][X][X][X][X][X][X][X][X][X][X][X][X]
あなたのカード   :[2][K][8][8][1][3][6][9][Joker][10][4][7][1]
-------------------------------------------------------------
重複を削除します: y:yes
y
相手のカード    :[X][X][X][X][X][X][X][X]
あなたのカード   :[2][K][3][6][9][Joker][10][4][7]
-------------------------------------------------------------
何番目のカードを選びますか(0~7までの数値を入力): 
0
あなたの選んだカード:[6]
-------------------------------------------------------------
相手のカード    :[X][X][X][X][X][X][X]
あなたのカード   :[2][K][3][9][Joker][10][4][7]
-------------------------------------------------------------
相手の選んだカード :[2]
-------------------------------------------------------------
相手のカード    :[X][X][X][X][X][X]
あなたのカード   :[K][3][9][Joker][10][4][7]
-------------------------------------------------------------
何番目のカードを選びますか(0~5までの数値を入力): 
1
あなたの選んだカード:[4]
-------------------------------------------------------------
相手のカード    :[X][X][X][X][X]
あなたのカード   :[K][3][9][Joker][10][7]
-------------------------------------------------------------
相手の選んだカード :[Joker]
-------------------------------------------------------------
相手のカード    :[X][X][X][X][X][X]
あなたのカード   :[K][3][9][10][7]
-------------------------------------------------------------
何番目のカードを選びますか(0~5までの数値を入力): 
2
あなたの選んだカード:[3]
-------------------------------------------------------------
相手のカード    :[X][X][X][X][X]
あなたのカード   :[K][9][10][7]
-------------------------------------------------------------
相手の選んだカード :[9]
-------------------------------------------------------------
相手のカード    :[X][X][X][X]
あなたのカード   :[K][10][7]
-------------------------------------------------------------
何番目のカードを選びますか(0~3までの数値を入力): 
1
あなたの選んだカード:[10]
-------------------------------------------------------------
相手のカード    :[X][X][X]
あなたのカード   :[K][7]
-------------------------------------------------------------
相手の選んだカード :[7]
-------------------------------------------------------------
相手のカード    :[X][X]
あなたのカード   :[K]
-------------------------------------------------------------
何番目のカードを選びますか(0~1までの数値を入力): 
1
あなたの選んだカード:[Joker]
-------------------------------------------------------------
相手のカード    :[X]
あなたのカード   :[K][Joker]
-------------------------------------------------------------
相手の選んだカード :[K]
-------------------------------------------------------------
          YOU LOSE!!
あなたのカード   :[Joker]
-------------------------------------------------------------

[PR] Javaで挫折しない学習方法を動画で公開中

監修してくれたメンター

長屋雅美

独立系SIerで7年勤務後、現在はフリーのエンジニアとして自宅をオフィスとして活動しています。
JavaやC♯、shellscriptを用いた開発を主に担当し、TechAcademyではJavaコースを担当しています。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

オンラインのプログラミングスクールTechAcademyでは、Java講座を開催しています。

JavaやServletの技術を使ってWebアプリケーションの開発を学ぶことができます。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間で習得することが可能です。

また、現役エンジニアから学べる無料のプログラミング体験会も実施しているので、ぜひ参加してみてください。