器用貧乏の独り言

器用貧乏なおっさんが気の向くままに。

Python プログラミングで遊ぼう!面白いネタ集

はじめに

プログラミング学習は時に難しく感じることもありますが、楽しいプロジェクトに取り組むことで継続的なモチベーションを維持できます。Python は初心者にも優しく、同時に強力な機能を持つ言語です。今回は、Python を使って実装できる面白いネタやプロジェクトのアイデアをご紹介します。週末のハッキングや、プログラミング学習の実践課題としてぜひ活用してください!

1. テキストベースのアドベンチャーゲーム

コマンドラインで動作するシンプルなテキストアドベンチャーゲームは、Python の基本構文と条件分岐を学ぶのに最適です。

def start_adventure():
    print("暗い森の中で目を覚ました。どうする?")
    print("1: 北へ進む")
    print("2: 東へ進む")
    print("3: 助けを叫ぶ")
    
    choice = input("> ")
    
    if choice == "1":
        print("北へ進むと小さな小屋を見つけた...")
        # 続きのコード
    elif choice == "2":
        print("東へ進むと崖に出た。遠くに街が見える...")
        # 続きのコード
    elif choice == "3":
        print("叫んだが、返事はない。代わりに何かが近づいてくる音が...")
        # 続きのコード
    else:
        print("有効な選択肢を入力してください")
        start_adventure()

start_adventure()

このシンプルな構造から始めて、複数の部屋や状態を管理するゲームへと発展させることができます。

2. Twitter/X 感情分析ボット

Python自然言語処理ライブラリを使って、特定のキーワードについての Twitter/X の投稿を分析し、人々の感情を可視化するプロジェクトはいかがでしょうか。

import tweepy
from textblob import TextBlob
import matplotlib.pyplot as plt

# Twitter/X API認証情報(実際に使用する場合は適切に取得してください)
auth = tweepy.OAuthHandler("CONSUMER_KEY", "CONSUMER_SECRET")
auth.set_access_token("ACCESS_TOKEN", "ACCESS_TOKEN_SECRET")

api = tweepy.API(auth)

# 検索キーワード
search_term = "Python programming"

# ツイートを収集
tweets = tweepy.Cursor(api.search_tweets, q=search_term, lang="en").items(100)

# 感情分析
sentiments = []
for tweet in tweets:
    analysis = TextBlob(tweet.text)
    sentiments.append(analysis.sentiment.polarity)

# 結果の可視化
plt.hist(sentiments, bins=[-1, -0.5, 0, 0.5, 1])
plt.title(f"Sentiment Analysis: {search_term}")
plt.xlabel("Sentiment Polarity")
plt.ylabel("Number of Tweets")
plt.show()

3. デスクトップペット

tkinterPyQt などのGUIライブラリを使って、デスクトップ上を動き回る小さなペットプログラムを作成できます。

import tkinter as tk
import random
import time

class DesktopPet:
    def __init__(self, master):
        self.master = master
        self.master.overrideredirect(True)  # ウィンドウ枠を非表示
        self.master.geometry("100x100+300+300")
        self.master.wm_attributes("-topmost", True)
        self.master.wm_attributes("-transparentcolor", "white")
        
        self.canvas = tk.Canvas(master, width=100, height=100, bg="white", highlightthickness=0)
        self.canvas.pack()
        
        # 簡単な顔を描画
        self.face = self.canvas.create_oval(20, 20, 80, 80, fill="yellow")
        self.eye1 = self.canvas.create_oval(35, 40, 45, 50, fill="black")
        self.eye2 = self.canvas.create_oval(55, 40, 65, 50, fill="black")
        self.mouth = self.canvas.create_arc(35, 50, 65, 75, start=0, extent=180, fill="red")
        
        # ペットの動き
        self.move()
        
    def move(self):
        x = random.randint(-5, 5)
        y = random.randint(-5, 5)
        self.canvas.move(self.face, x, y)
        self.canvas.move(self.eye1, x, y)
        self.canvas.move(self.eye2, x, y)
        self.canvas.move(self.mouth, x, y)
        
        # 画面内に収める処理など...
        self.master.after(100, self.move)

root = tk.Tk()
pet = DesktopPet(root)
root.mainloop()

4. QRコード宝探しゲーム

Pythonqrcode ライブラリを使って、屋内や屋外で遊べる宝探しゲームの仕組みを作れます。各QRコードには次のヒントが含まれており、最終的に「宝物」にたどり着くという仕掛けです。

import qrcode
import random
import string

# ヒントのリスト
hints = [
    "次は冷蔵庫の下を探せ",
    "本棚の赤い本の中にある",
    "テレビの裏側を確認してみよう",
    "最後のヒント:宝物は枕の下だ!"
]

# QRコードを生成
for i, hint in enumerate(hints):
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_L,
        box_size=10,
        border=4,
    )
    qr.add_data(hint)
    qr.make(fit=True)
    
    img = qr.make_image(fill_color="black", back_color="white")
    img.save(f"hint_{i+1}.png")

print("QRコードの生成が完了しました。印刷して宝探しを始めましょう!")

5. 天気に応じて音楽を提案するアプリ

現在の天気を取得し、その日の気分に合った音楽をSpotifyから提案するスクリプトも面白いでしょう。

import requests
import spotipy
from spotipy.oauth2 import SpotifyOAuth

# 天気API(OpenWeatherMapなど)から天気情報を取得
def get_weather(city):
    api_key = "YOUR_API_KEY"
    url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}"
    response = requests.get(url)
    data = response.json()
    return data["weather"][0]["main"]

# 天気に基づいて音楽ジャンルを選択
def get_genre_for_weather(weather):
    weather_to_genre = {
        "Clear": "happy",
        "Clouds": "indie",
        "Rain": "rainy-day",
        "Snow": "chill",
        "Thunderstorm": "epic",
        "Drizzle": "acoustic",
        "Mist": "ambient"
    }
    return weather_to_genre.get(weather, "pop")

# Spotifyから選択したジャンルの音楽を取得
def get_spotify_recommendations(genre):
    sp = spotipy.Spotify(auth_manager=SpotifyOAuth(
        client_id="YOUR_CLIENT_ID",
        client_secret="YOUR_CLIENT_SECRET",
        redirect_uri="YOUR_REDIRECT_URI",
        scope="user-library-read"
    ))
    
    results = sp.recommendations(seed_genres=[genre], limit=5)
    return [(track["name"], track["artists"][0]["name"]) for track in results["tracks"]]

# メイン処理
city = "Tokyo"
weather = get_weather(city)
genre = get_genre_for_weather(weather)
recommendations = get_spotify_recommendations(genre)

print(f"現在の{city}の天気: {weather}")
print(f"おすすめの{genre}ジャンルの曲:")
for i, (track, artist) in enumerate(recommendations, 1):
    print(f"{i}. {track} - {artist}")

6. 自動迷路生成器と解決アルゴリズム

アルゴリズムの学習として、迷路を自動生成し、それを解くプログラムを作成することもチャレンジングです。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import random

def create_maze(width, height):
    # 迷路の初期化(1 = 壁, 0 = 通路)
    maze = np.ones((height, width))
    
    # 外枠以外を全て壁にする(3マス単位で考えるため、幅と高さは奇数であることを前提)
    for i in range(1, height - 1):
        for j in range(1, width - 1):
            if i % 2 == 1 and j % 2 == 1:
                maze[i, j] = 0
    
    # 穴掘り法で迷路を生成
    def dig(x, y):
        directions = [(0, 2), (2, 0), (0, -2), (-2, 0)]
        random.shuffle(directions)
        
        for dx, dy in directions:
            nx, ny = x + dx, y + dy
            if 1 <= nx < width - 1 and 1 <= ny < height - 1 and maze[ny, nx] == 1:
                maze[ny, nx] = 0
                maze[y + dy // 2, x + dx // 2] = 0
                dig(nx, ny)
    
    # ランダムな通路から開始
    start_x, start_y = 1, 1
    maze[start_y, start_x] = 0
    dig(start_x, start_y)
    
    return maze

# 迷路を生成して表示
maze = create_maze(21, 21)
plt.figure(figsize=(10, 10))
cmap = ListedColormap(['white', 'black'])
plt.imshow(maze, cmap=cmap)
plt.title("Generated Maze")
plt.axis('off')
plt.show()

7. 音声コマンドで操作するデスクトップアシスタント

Python音声認識自然言語処理を組み合わせて、簡単な音声アシスタントを作ることも可能です。

import speech_recognition as sr
import pyttsx3
import datetime
import webbrowser
import os

# 音声認識の初期化
recognizer = sr.Recognizer()
engine = pyttsx3.init()

def speak(text):
    engine.say(text)
    engine.runAndWait()

def listen():
    with sr.Microphone() as source:
        print("聞いています...")
        recognizer.adjust_for_ambient_noise(source)
        audio = recognizer.listen(source)
        
    try:
        command = recognizer.recognize_google(audio, language="ja-JP")
        print(f"認識した言葉: {command}")
        return command.lower()
    except:
        print("聞き取れませんでした")
        return ""

def process_command(command):
    if "こんにちは" in command:
        speak("こんにちは!何かお手伝いできることはありますか?")
    
    elif "時間" in command:
        now = datetime.datetime.now()
        speak(f"現在の時間は{now.hour}時{now.minute}分です")
    
    elif "ブラウザ" in command or "インターネット" in command:
        speak("ブラウザを開きます")
        webbrowser.open("https://www.google.com")
    
    elif "終了" in command:
        speak("さようなら!")
        return False
    
    return True

speak("音声アシスタントを起動しました")
running = True
while running:
    cmd = listen()
    if cmd:
        running = process_command(cmd)

まとめ

Python を使った面白いプログラミングネタをご紹介しました。これらのプロジェクトは、学習の一環として取り組むことで、プログラミングスキルを楽しく向上させることができます。最初は小さく始めて、徐々に機能を追加していくことをおすすめします。

上記のスクリプトはあくまでも基本的なものですので、自分なりにカスタマイズしたり、新しい機能を追加したりして、オリジナルのプロジェクトに発展させてみてください。