オーダーメイドコース
icon
icon

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

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

テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日  調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名  調査手法:インターネット調査

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

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

 

そもそもJavaについてよく分からないという方は、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] 未経験からWebエンジニアを目指す方法とは

監修してくれたメンター

長屋雅美

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

 

大石ゆかり

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

田島悠介

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

大石ゆかり

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

TechAcademyでは、初心者でもJavaやServletの技術を使ってWebアプリケーション開発を習得できるオンラインブートキャンプJava講座を開催しています。

挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。