suna8’s blog

還暦を過ぎたジジーの気まぐれ日記

やっぱり趣味のプログラミングは楽しい(Part1)

訳あって3年前からとある学校でJava言語を教えているのですが、学生相手とは言え仕事でプログラミングするのは作業的で、あまり面白くなかったりします。まあ、その内容がゲームの場合はそれなりに楽しくもありますが、教材として扱う以上、あまり凝ったものや自分の趣味に偏ったものは採用できないのです。

中日新聞朝刊(2023年6月3日)の社会面より

昨日、東海地方の大雨の影響で午後から学校(上記の学校とは別)が休校になったために、暇になった私は帰宅後にEclipseを起動してあれこれいじっていました。

なんか面白いゲームでもないかな?

そう思った時には、流行りのChatGPTの出番となります。

 

Java言語でカードゲームを作って

もちろんです。Javaを使用してカードゲームを作成することは可能です。以下に、簡単なトランプのカードゲームを作成するための基本的な手順を示します。

  1. カードのデザインと値を定義する: カードの種類(スート)と値(数字や絵柄)を表すために、Cardクラスを作成します。このクラスには、スートと値を表すインスタンス変数を持つコンストラクタと、それらの値を取得するためのゲッターメソッドが含まれます。

  2. カードデッキを生成する: CardDeckクラスを作成し、カードのデッキを表します。このクラスには、Cardオブジェクトのリスト(デッキ)を作成し、シャッフルやカードの取得などの操作を行うメソッドを含めます。

  3. ゲームのルールを定義する: ゲームのルールに合わせて、Gameクラスを作成します。このクラスには、ゲームの状態を表すインスタンス変数、ゲームの進行に関するメソッド(例:プレイヤーの手札の配布、カードの選択、勝利条件のチェックなど)が含まれます。

  4. ゲームの進行を制御する: Mainクラスを作成し、ゲームの進行を制御します。Mainクラスでは、Gameクラスのインスタンスを作成し、必要に応じてゲームの状態を更新します。

これは非常に基本的な手順ですが、カードゲームの複雑さやルールに応じて、さらに詳細な実装が必要になる場合もあります。この例では、トランプのカードゲームを作成するための基本的な構造を説明しましたが、実際のゲームには独自のルールや機能が含まれるかもしれません。

Javaでカードゲームを作成する場合は、オブジェクト指向プログラミングの基礎を理解していることが重要です。また、Javaのクラスやコレクション、制御フローなどの基本的な概念にも精通していることが望ましいです。

続きはありますか

ChatGPTは「もちろんです」と前置きをして、さらに長い解説文の続きをこのあと2回にわたって示してくれますが、なかなかソースコードを教えてくれません。なので、質問の仕方を変えました。 

実際に動くコードサンプルはありますか?

 するとようやくソースコードを表示し始めました。

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

enum Suit {
    CLUBS, DIAMONDS, HEARTS, SPADES
}

class Card {
    private Suit suit;
    private int value;

    public Card(Suit suit, int value) {
        this.suit = suit;
        this.value = value;
    }

    public Suit getSuit() {
        return suit;
    }

    public int getValue() {
        return value;
    }

    public String toString() {
        String cardValue;
        switch (value) {
            case 1:
                cardValue = "Ace";
                break;
            case 11:
                cardValue = "Jack";
                break;
            case 12:
                cardValue = "Queen";
                break;
            case 13:
                cardValue = "King";
                break;
            default:
                cardValue = String.valueOf(value);
        }
        return cardValue + " of " + suit;
    }
}

class Deck {
    private List<Card> cards;

    public Deck() {
        cards = new ArrayList<>();
        for (Suit suit : Suit.values()) {
            for (int value = 1; value <= 13; value++) {
                cards.add(new Card(suit, value));
            }
        }
    }

(中略)

public class BlackjackGame {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // ゲームの初期化
        Deck deck = new Deck();
        deck.shuffle();

        Player player = new Player("Player

いつものように文字数制限のためか、途中で切れています。

続きをお願いします。

申し訳ありませんが、コードの制限により、全体のコードを一度に提供することはできません。以下に、続きのコードの一部を示します。

と、やはりいつものように、「申し訳ありません」という文言から始まる言い訳のあとに、コードの続きが示され、ようやく完成版になったのです。(続きのコードは省略)

上記のコードは、ブラックジャックゲームの一部を示しています。ゲームの初期化、プレイヤーとディーラーのカードの配布、ターンの処理、勝敗の判定などが含まれています。ただし、完全な動作するコードとしては不足しています。

ご了承ください。完全なゲームの実装は、多くのコードとそれに関連するクラスやメソッドを含むため、ここでは提供することができません。ただし、上記のサンプルを基にして、ゲームの機能を追加・拡張していくことができます。

「はいはい」と心の中でChatGPTに話しかけながら、私は2つに分割表示されたソースコードEclipse上に合体コピペして動作確認すると、ちゃんとゲームが動作しました。

Eclipseでの実行画面

メッセージ類は英語ですが、トランプゲームのブラックジャックがコンソール上で再現できています。勝負がついたらそのまま終了してしまう点や、コンピュータ側のロジックが適当だったりしますが、あくまでサンプルなのでこれで十分だし、教材の元ネタとしても使えるレベルです。

 

こうやってJava言語の授業の教材の元ネタはゲットできましたが、何か物足りない気分になり、思考を巡らせていたところ、ふと40年以上前の記憶がよみがえってきました。

”「イスカンダルのトーフ屋ゲーム」というのがあったな。。。”

と。

 

Part2へつづく