4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pythonで黒ひげ危機一発を再現してみた

Last updated at Posted at 2023-02-20

はじめに

制作の経緯

オブジェクト指向について勉強し、Pythonでなにか作ってみようと思ったので黒ひげ危機一発ゲームを再現することにした。

制作物

コード

Kurohige.py
import random

class Material:
    data = {"0": "a", "1": "b", "2": "c", "3": "d", "4": "e", "5": "f", "6": "g", "7": "h", "8": "i", "9": "j"}

    barrel = [     "   \o/  < Help!",
                   " ------",
                   "|      |",
                   "|      |",
                   "|      |",
                   " ------ "]
    barrel = "\n".join(barrel)

    def __init__(self):
        self.temp = list(self.data.values())
        random.shuffle(self.temp)
        self.value_shuffled = dict(zip(self.data, self.temp))


class List:
    def __init__(self):
        self.material = Material()
        self.shuffled_dict = self.material.value_shuffled

    def choose(self, a_key):
        return self.shuffled_dict.pop(a_key)


class Game:
    def __init__(self):
        self.list = List()

    def play_game(self):
        self.shuffled_dict = self.list.shuffled_dict
        self.key_list = []
        for res_key in self.shuffled_dict.keys():
            self.key_list.append(res_key)

        while len(self.shuffled_dict) > 0:
            n = input("qで終了、それ以外でPlay:")
            if n == "q":
                break
            print(self.list.material.barrel)
            response = input("{}の中から選んで入力:".format(self.key_list))
            if response in self.key_list:
                p = self.list.choose(response)
                if p == "a":
                    print("ハズレを引きました!")
                    break
                else:
                    self.key_list.remove(response)
            else:
                print("{}の中から正しく入力してください.".format(self.key_list))
        drawing = self.pop_out()

    def pop_out(self):
        self.pop = [
                            "    \ o/    ",
                            "      |     ",
                            "  \  / \   / ",
                            "    ------  ",
                            "   |      | ",
                            "   |      | ",
                            "   |      | ",
                            "    ------  "]
        pop = "\n".join(self.pop)
        print(pop)

game = Game()
game.play_game()

ゲームの流れ

  1. まず最初に、プレイするか中断するか聞く。中断なら5と同じ結果を表示。
  2. 樽に入った人の絵が現れ、key_listに入っているキーのリストが表示される(最初は0~9の10個)
  3. その中から一つ選ぶとそのキーに対応したバリューが取り出され、ハズレかどうかがチェックされる(ハズレはa)
  4. ハズレじゃなかったら今回選んだものがkey_listから削除され、1に戻る。ハズレが引かれるまで1~4をループする。
  5. ハズレを引くと、樽から発射された人の絵が現れる。
    ※キーとバリューの組み合わせは実行するたびにシャッフルされるため、どれがハズレかは特定できない。

作ってみた感想

  • 関数の動きを勘違いしていたことが何回かあった。
  • オブジェクト指向の理解がまだふんわりしている。
  • 変数の名前を考えるのが地味に難しい。

おわりに

簡単なコードだが、エラーを連発し意外と時間がかかった。また、ChatGPTを有効活用することで、勘違いや思い込みによってエラーの原因をなかなか特定できずにハマってしまうような状況をかなり減らせると感じた。

4
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?