Turtleで描く、あなた専用のおみくじアート – Pythonで運勢を視覚化しよう

プログラミング

はじめに

PythonのTurtleモジュールを使って、毎回違う色や形で運勢を表現する「おみくじアート」を作ってみませんか?プログラミング初心者でも楽しく学べる内容で、あなただけのオリジナルおみくじプログラムを作成していきます。

おみくじアートとは?

おみくじアートとは、プログラムでランダムに選ばれた運勢を、色や形、模様で視覚的に表現するアート作品です。従来のテキストだけのおみくじとは違い、運勢ごとに異なるビジュアルが楽しめるのが特徴です。

必要な準備

環境設定

Pythonがインストールされていれば、追加のライブラリは必要ありません。Turtleモジュールは標準ライブラリに含まれているためです。

基本知識

  • 変数の使い方
  • リスト(配列)の基本
  • 関数の基本概念
  • 繰り返し処理(for文)

ステップ1:基本的なおみくじプログラム

まずは、シンプルなおみくじプログラムから始めましょう。

python

import turtle
import random

# 画面設定
screen = turtle.Screen()
screen.bgcolor("white")
screen.title("おみくじアート")
screen.setup(800, 600)

# ペン設定
pen = turtle.Turtle()
pen.speed(5)

# 運勢リスト
fortunes = ["大吉", "中吉", "小吉", "末吉", "凶"]

# ランダムに運勢を選択
today_fortune = random.choice(fortunes)
print(f"今日の運勢: {today_fortune}")

# 画面を維持
screen.exitonclick()

このコードは基本的なセットアップを行い、ランダムに運勢を選択します。

ステップ2:運勢に応じた色を設定

運勢ごとに異なる色を設定して、視覚的な違いを作りましょう。

python

import turtle
import random

# 画面設定
screen = turtle.Screen()
screen.bgcolor("black")
screen.title("おみくじアート")
screen.setup(800, 600)

# ペン設定
pen = turtle.Turtle()
pen.speed(3)

# 運勢と色の対応
fortune_colors = {
    "大吉": ["gold", "yellow", "orange"],
    "中吉": ["lightgreen", "green", "lime"],
    "小吉": ["lightblue", "blue", "cyan"],
    "末吉": ["pink", "magenta", "violet"],
    "凶": ["red", "darkred", "crimson"]
}

# ランダムに運勢を選択
fortunes = list(fortune_colors.keys())
today_fortune = random.choice(fortunes)
colors = fortune_colors[today_fortune]

print(f"今日の運勢: {today_fortune}")

# 運勢を画面に表示
pen.color(colors[0])
pen.write(f"今日の運勢: {today_fortune}", 
          align="center", 
          font=("Arial", 24, "bold"))

screen.exitonclick()

ステップ3:運勢アートを描く基本図形

運勢に応じて異なる図形を描く機能を追加します。

python

import turtle
import random
import math

def draw_star(pen, size, color):
    """星を描く関数"""
    pen.color(color)
    pen.begin_fill()
    for _ in range(5):
        pen.forward(size)
        pen.right(144)
    pen.end_fill()

def draw_flower(pen, petals, size, color):
    """花を描く関数"""
    pen.color(color)
    angle = 360 / petals
    for _ in range(petals):
        pen.begin_fill()
        pen.circle(size)
        pen.end_fill()
        pen.right(angle)

def draw_spiral(pen, size, color):
    """螺旋を描く関数"""
    pen.color(color)
    for i in range(100):
        pen.forward(i * size / 100)
        pen.right(90)

# メイン部分
screen = turtle.Screen()
screen.bgcolor("black")
screen.title("おみくじアート")
screen.setup(800, 600)

pen = turtle.Turtle()
pen.speed(0)

# 運勢と描画パターンの対応
fortune_patterns = {
    "大吉": lambda: draw_star(pen, 100, "gold"),
    "中吉": lambda: draw_flower(pen, 8, 30, "lightgreen"),
    "小吉": lambda: draw_spiral(pen, 3, "lightblue"),
    "末吉": lambda: draw_flower(pen, 6, 25, "pink"),
    "凶": lambda: draw_spiral(pen, 2, "red")
}

# ランダムに運勢を選択
fortunes = list(fortune_patterns.keys())
today_fortune = random.choice(fortunes)

# タイトル表示
pen.penup()
pen.goto(0, 200)
pen.color("white")
pen.write(f"今日の運勢: {today_fortune}", 
          align="center", 
          font=("Arial", 24, "bold"))

# アート描画
pen.goto(0, 0)
pen.pendown()
fortune_patterns[today_fortune]()

screen.exitonclick()

ステップ4:完成版おみくじアート

複数の要素を組み合わせた完成版を作成しましょう。

python

import turtle
import random
import math

class OmikujiArt:
    def __init__(self):
        self.screen = turtle.Screen()
        self.screen.bgcolor("navy")
        self.screen.title("あなた専用おみくじアート")
        self.screen.setup(800, 600)
        
        self.pen = turtle.Turtle()
        self.pen.speed(0)
        
        # 運勢データ
        self.fortune_data = {
            "大吉": {
                "colors": ["gold", "yellow", "orange"],
                "message": "素晴らしい一日になりそう!",
                "pattern": "star"
            },
            "中吉": {
                "colors": ["lightgreen", "green", "lime"],
                "message": "良いことがありそう",
                "pattern": "flower"
            },
            "小吉": {
                "colors": ["lightblue", "blue", "cyan"],
                "message": "穏やかな一日",
                "pattern": "circle"
            },
            "末吉": {
                "colors": ["pink", "magenta", "violet"],
                "message": "小さな幸せを見つけよう",
                "pattern": "square"
            },
            "凶": {
                "colors": ["red", "darkred", "orange"],
                "message": "今日は注意深く",
                "pattern": "triangle"
            }
        }
    
    def draw_background_pattern(self, colors):
        """背景パターンを描画"""
        self.pen.penup()
        for i in range(20):
            x = random.randint(-400, 400)
            y = random.randint(-300, 300)
            self.pen.goto(x, y)
            self.pen.color(random.choice(colors))
            self.pen.pendown()
            self.pen.dot(random.randint(5, 15))
            self.pen.penup()
    
    def draw_star(self, size, color):
        """星を描画"""
        self.pen.color(color)
        self.pen.begin_fill()
        for _ in range(5):
            self.pen.forward(size)
            self.pen.right(144)
        self.pen.end_fill()
    
    def draw_flower(self, size, color):
        """花を描画"""
        self.pen.color(color)
        for _ in range(8):
            self.pen.begin_fill()
            self.pen.circle(size)
            self.pen.end_fill()
            self.pen.right(45)
    
    def draw_geometric_pattern(self, pattern, size, color):
        """幾何学模様を描画"""
        self.pen.color(color)
        self.pen.begin_fill()
        
        if pattern == "star":
            self.draw_star(size, color)
        elif pattern == "flower":
            self.draw_flower(size//3, color)
        elif pattern == "circle":
            self.pen.circle(size)
        elif pattern == "square":
            for _ in range(4):
                self.pen.forward(size)
                self.pen.right(90)
        elif pattern == "triangle":
            for _ in range(3):
                self.pen.forward(size)
                self.pen.right(120)
        
        self.pen.end_fill()
    
    def create_omikuji(self):
        """おみくじアートを作成"""
        # ランダムに運勢を選択
        fortune = random.choice(list(self.fortune_data.keys()))
        data = self.fortune_data[fortune]
        
        # 背景パターン
        self.draw_background_pattern(data["colors"])
        
        # タイトル表示
        self.pen.penup()
        self.pen.goto(0, 250)
        self.pen.color("white")
        self.pen.write("🎋 おみくじアート 🎋", 
                      align="center", 
                      font=("Arial", 20, "bold"))
        
        # 運勢表示
        self.pen.goto(0, 200)
        self.pen.color(data["colors"][0])
        self.pen.write(f"今日の運勢: {fortune}", 
                      align="center", 
                      font=("Arial", 24, "bold"))
        
        # メッセージ表示
        self.pen.goto(0, 170)
        self.pen.color("white")
        self.pen.write(data["message"], 
                      align="center", 
                      font=("Arial", 16, "normal"))
        
        # メインアート描画
        self.pen.goto(0, 0)
        self.pen.pendown()
        
        # 複数の図形を描画
        main_color = random.choice(data["colors"])
        self.draw_geometric_pattern(data["pattern"], 80, main_color)
        
        # 装飾的な小さな図形
        for i in range(6):
            angle = i * 60
            x = 120 * math.cos(math.radians(angle))
            y = 120 * math.sin(math.radians(angle))
            
            self.pen.penup()
            self.pen.goto(x, y)
            self.pen.pendown()
            
            small_color = random.choice(data["colors"])
            self.draw_geometric_pattern(data["pattern"], 30, small_color)
        
        # 完了メッセージ
        self.pen.penup()
        self.pen.goto(0, -250)
        self.pen.color("white")
        self.pen.write("🌟 あなた専用のおみくじアートが完成しました! 🌟", 
                      align="center", 
                      font=("Arial", 12, "normal"))
        
        return fortune

# おみくじアートを実行
if __name__ == "__main__":
    omikuji = OmikujiArt()
    result = omikuji.create_omikuji()
    print(f"今日の運勢は「{result}」でした!")
    omikuji.screen.exitonclick()

カスタマイズのアイデア

1. 季節に応じた色合い

月ごとに異なる色パレットを使用することで、季節感のあるおみくじアートが作れます。

2. アニメーション効果

描画過程をゆっくりと表示することで、より楽しい体験になります。

3. 音楽との連動

pygame等を使用して、運勢に応じた効果音を追加できます。

4. 保存機能

PostScript形式で作品を保存し、後から印刷することも可能です。

まとめ

PythonのTurtleモジュールを使用することで、プログラミング初心者でも視覚的で楽しいおみくじアートを作成できます。このプロジェクトを通じて、以下のスキルを身につけられます:

  • ランダム処理の活用
  • 関数の定義と使用
  • オブジェクト指向プログラミングの基礎
  • 図形描画の基本
  • 条件分岐と繰り返し処理

ぜひあなたなりのアレンジを加えて、オリジナルのおみくじアートを作ってみてください。プログラミングの楽しさを実感しながら、毎日違うアートで運勢を確認できる素敵なツールになるはずです。