ユーニックス総合研究所

  • home
  • archives
  • python-daruma

Pythonでダルマ落としを作る

  • 作成日: 2023-08-04
  • 更新日: 2023-12-24
  • カテゴリ: Python

Pythonでダルマ落としを作る

毎日暑いですね。
2023年の8月の日本は今までにないほどの異常気象です。
おまけに嵐まで来ている始末。どうすりゃええねん。

こんな時はダルマ落としでもしよう、ということで。
今回はPythonでダルマ落としを作ってみました。

関連記事
Djangoでオブジェクトを一括作成・更新【bulk_create, bulk_update】
DjangoのModel.objects.filter()の使い方【QuerySet】
Djangoのmodelのcreate()の使い方【Python】
Django入門: ルートの設定 ~ 簡単な一行掲示板アプリを作る その4【Windows10】
NumPyのappend()の使い方: 配列の末尾に要素を追加
Numpyのarangeの使い方: 指定範囲の数列を生成する
Python3でYoutube Data APIを使ってキーワード検索する
PythonからC言語(my.puts)を呼び出して実行する

ソースコード全文

今回作るダルマ落としのソースコードは以下になります。

import sys  


parts = [  
    """  
+----------------+  
|                |  
|    +      +    |  
|                |   
+----------------+  
""",  
    """  
+----------------+  
|                |  
|    _      _    |  
|                |   
+----------------+  
""",  
    """  
+----------------+  
|                |  
|    |      |    |  
|                |   
+----------------+  
""",  
]  


def draw():  
    for part in parts:  
        print(part.strip())  


def update():  
    try:  
        s = input('0 or 1 or 2 > ')  
    except KeyboardInterrupt:  
        sys.exit(0)  

    try:  
        n = int(s)  
    except ValueError as e:  
        print(e, file=sys.stderr)  
        return  

    if n < 0 or n >= len(parts):  
        print('index out of range', file=sys.stderr)  
        return  

    parts.pop(n)  


def main():  
    while True:  
        draw()  
        update()  


main()  

暑い!暑い!暑ーい!

私はダルマ、ダルマ落としだよ。
ポンコポンコポンコッコ。
ダルマを叩いて落としちゃう。

あそーれ、ダルマ、ダルマ、ダルマ落とし。
あそーれ、夏、スイカ、ちくわ、ダルマ落とし。

あよいよい!

ダルマの身体(parts)

ダルマの身体はpartsというグローバル変数に入れておきます。
これはリストで文字列が入ってます。
1つの要素がダルマの段になります。

parts = [  
    """  
+----------------+  
|                |  
|    +      +    |  
|                |   
+----------------+  
""",  
    """  
+----------------+  
|                |  
|    _      _    |  
|                |   
+----------------+  
""",  
    """  
+----------------+  
|                |  
|    |      |    |  
|                |   
+----------------+  
""",  
]  

上から太郎、次郎、三郎です。
こら太郎! 次郎と三郎に感謝しなさい!
あなたが上段に入れるのは下段のこいつらがいるからだよ!
なーんて、冗談冗談・・・。

あよいよい!

main関数

main関数は以下になります。

def main():  
    while True:  
        draw()  
        update()  


main()  

main関数ではwhile文で無限ループを書きます。
無限責任です。
それでdraw(ダルォー)関数とupdate(プデートゥ)関数を呼びます。
main関数の仕事はこれだけです。

draw関数

draw関数は以下です。

def draw():  
    for part in parts:  
        print(part.strip())  

partsから要素を取り出してその要素をstrip()して裸にしてから(左右の空白改行を削除してから)print()で要素を描画しています。
思い出~はいつの日も~サメ~♪

update関数

update関数は以下になります。

def update():  
    try:  
        s = input('0 or 1 or 2 > ')  
    except KeyboardInterrupt:  
        sys.exit(0)  

    try:  
        n = int(s)  
    except ValueError as e:  
        print(e, file=sys.stderr)  
        return  

    if n < 0 or n >= len(parts):  
        print('index out of range', file=sys.stderr)  
        return  

    parts.pop(n)  

まずdraw関数を先に呼び出しているのでダルマはこの段階で描画済みです。
その描画したダルマの下にinput()のプロンプトを出します。
input()は標準入力から一行読み取る関数です。引数がプロンプトになります。返り値は読み取った文字列です。
この関数はCtrl + Cなどが入力されるとKeyboardInterruptが発生します。
これが発生したらキャッチしてsys.exit(0)でプログラムを終了します。

    try:  
        s = input('0 or 1 or 2 > ')  
    except KeyboardInterrupt:  
        sys.exit(0)  

読み取った文字列をint()で整数にします。
整数への変換に失敗した場合はValueErrorが飛んできますのでこれをキャッチしておきます。
print(e, file=sys.stderr)ではfile引数にsys.stderrを指定しています。
こうすると出力先が標準エラー出力になります。

    try:  
        n = int(s)  
    except ValueError as e:  
        print(e, file=sys.stderr)  
        return  

整数に変換したnpartsの範囲外かどうかチェックして範囲外ならエラー出力してreturnします。
parts.pop(n)で指定のインデックスの要素をポップして削除します。

    if n < 0 or n >= len(parts):  
        print('index out of range', file=sys.stderr)  
        return  

    parts.pop(n)  

おわりに

今回はPythonでダルマ落としを実装してみました。
暑い日はダルマ落とし!
なにか参考になれば幸いです。

🦝 < ダルマを落とすぞ!

🦝 < ぶったたけ!