<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" >
  <channel>
  <title>PPM - Python Program Magazine</title>
  <link>https://ppm.gg-blog.com/</link>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="https://ppm.gg-blog.com/RSS/" />
  <description>Pythonのプログラムを公開するだけのブログ</description>
  <lastBuildDate>Sat, 11 Jun 2022 08:35:12 GMT</lastBuildDate>
  <language>ja</language>
  <copyright>© Ninja Tools Inc.</copyright>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />

    <item>
    <title>ねこばかり</title>
    <description>
    <![CDATA[<h3>天秤にねこを乗せてみた</h3>
<div>右の天秤に隠れているねこを当てるゲームです。</div>
<div></div>
<img src="//ppm.gg-blog.com/File/nekobakari01.png" alt="" /> <br />
<br />

<h3>遊び方</h3>
<div></div>
<div>下に居るねこを左のねこタワーに乗せて「計測開始」ボタンを押すと天秤が傾きます。</div>
<div>重いと下がり軽いと上がるので傾き加減で予想して右側のねこを当ててください。</div>
<div></div>
<h3>プログラムの説明</h3>
<div></div>
<div>　このプログラムはGUIをつかっています。GUIは標準ライブラリのtkinterです。</div>
<div>　画像を使ったプログラムを試したくて作ってみました。</div>
<div>　昔VC#で作ったもののリメイクなのですが、やはりGUIはVC#の方が作りやすいですね。</div>
<div>
<h3>プログラム</h3>
</div>
<a href="https://ppm.gg-blog.com/File/nekobakari.zip" title="nekobakari" target="_blank">ダウンロード</a><br />
<br />
nekobakari.py<br />
<br />

<pre><code class="python">from email import message
from itertools import count
import random
from re import X
from struct import pack
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
from PIL import Image, ImageTk
import data

# 答え
ans = 0
# カウンタ
counter = 0
# 入力値
neko_weight = 0

def initialize():
    '''
    初期化
    '''
    global ans
    global counter
    global neko_weight

    # 答え
    max = 2**7
    print(f"{max}")
    ans = random.randint(1, max)
    print(f"{ans}")
    # カウンタ
    counter = 0
    # 入力値
    neko_weight = 0
    return

def initialize_neko():
    '''
    ねこ画像初期化
    '''
    for index, item in enumerate(data.item_info):
        item['enable'] = True

    canvas.lift('base')
    canvas.lift('tower')
    canvas.lift('neko')
    return

def show_answerneko():
    '''
    解答表示
    '''
    for index, item in enumerate(data.item_info):
        if item['enable'] == False:
            canvas.lift(answerneko_id[index], towerId[1])
    return

def move_neko(event):
    '''
    ねこ移動
    '''
    global neko_id
    global neko_weight
    global towerneko_id
    global towerId
    # マウスカーソルの位置に一番近い図形のIDのタプルを取得
    closest_ids = canvas.find_closest(event.x, event.y)
    index = neko_id.index(closest_ids[0])
    print(f'id : {closest_ids}')
    print(f'neko_id {index}')
    data.item_info[index]['enable'] = False
    event.widget.lift(towerneko_id[index], towerId[0])
    event.widget.lift(base_id[index], neko_id[index])
    neko_weight += data.item_info[index]['weight']
    print(f'neko_weight {neko_weight}')
    return

def return_neko(event):
    '''
    ねこ移動
    '''
    global base_id
    global neko_id
    global neko_weight
    global towerneko_id
    global towerId
    # マウスカーソルの位置に一番近い図形のIDのタプルを取得
    closest_ids = canvas.find_closest(event.x, event.y)
    index = towerneko_id.index(closest_ids[0])
    print(f'id : {closest_ids}')
    print(f'towerneko_id {index}')
    data.item_info[index]['enable'] = True
    event.widget.lower(towerneko_id[index], towerId[0])
    event.widget.lift(neko_id[index], base_id[index])
    neko_weight -= data.item_info[index]['weight']
    print(f'neko_weight {neko_weight}')
    return

def move_tower(diff):
    '''
    ねこタワー移動
    '''
    canvas.move(towerId[0], 0, -diff)
    canvas.move('towerneko', 0, -diff)
    canvas.move(towerId[1], 0, diff)
    canvas.move('answerneko', 0, diff)
    return

def return_tower(diff):
    '''
    ねこタワー正位置へ
    '''
    canvas.move(towerId[0], 0, diff)
    canvas.move('towerneko', 0, diff)
    canvas.move(towerId[1], 0, -diff)
    canvas.move('answerneko', 0, -diff)
    return

def check_weight():
    '''
    計測実行
    '''
    global canvas
    global counter
    global neko_weight
    global ans
    counter += 1
    diff = ans - neko_weight
    print(f"counter={counter} neko_weight={neko_weight} answer={ans}")
    if diff == 0:
        show_answerneko()
        messagebox.showinfo('終了', f'{counter}回目です。正解！')
        initialize()
        initialize_neko()
    else:
        move_tower(diff)
        if diff &gt; 0:
            message = '軽い'
        else:
            message = '重い'
        messagebox.showinfo('判定', f'{counter}回目です。{message}')
        return_tower(diff)
    return


#version = tk.Tcl().eval('info patchlevel')

root = tk.Tk()
root.title(f'ねこばかり')
root.geometry('480x480')
#root.geometry('640x480')

# 画像表示
neko = []
for index, fname in enumerate(data.item_info):
    if index &gt; 0:
        data.item_info[index]['x'] = data.item_info[index-1]['x'] + data.item_info[index-1]['width'] + 4
        data.item_info[index]['y'] = data.item_info[index-1]['y'] + 6

    img = Image.open(fname['file'])
    size = [fname['width'], fname['height']] 
    img = img.resize(size=size)
    img = ImageTk.PhotoImage(img)
    neko.append(img)

tower = []
for index, fname in enumerate(data.tower_info):
    img = Image.open(fname['file'])
    img = ImageTk.PhotoImage(img)
    tower.append(img)

# Canvasの作成
canvas = tk.Canvas(bg='wheat1', width=476, height=476)
canvas.place(x=0, y=0)

base_id = []
for index, item in enumerate(data.item_info):
    base_id.append(canvas.create_rectangle( 
                        item['x'], item['y'], 
                        item['x']+item['width'], 
                        item['y']+item['height'],  
                        fill='wheat2', width = 0, tag="base"))

neko_id = []
for index, pic in enumerate(neko):
    neko_id.append(canvas.create_image(
                        data.item_info[index]['x'], 
                        data.item_info[index]['y'], 
                        image=pic, anchor=tk.NW, tag='neko'))
canvas.tag_bind('neko', '&lt;ButtonPress&gt;', move_neko)

towerneko_id = []
for index, pic in enumerate(neko):
    towerneko_id.append(canvas.create_image(
                        data.item_info[index]['cagex'], 
                        data.item_info[index]['cagey'], 
                        image=pic, anchor=tk.NW, tag='towerneko'))
canvas.tag_bind('towerneko', '&lt;ButtonPress&gt;', return_neko)

answerneko_id = []
for index, pic in enumerate(neko):
    answerneko_id.append(canvas.create_image(
                        data.item_info[index]['cagex'] + 240,
                        data.item_info[index]['cagey'], 
                        image=pic, anchor=tk.NW, tag='answerneko'))

towerId = []
for index, pic in enumerate(tower):
    towerId.append(canvas.create_image(
                        data.tower_info[index]['x'], 
                        data.tower_info[index]['y'], 
                        image=pic, anchor=tk.NW, tag='tower'))

canvas.grid(row=0, column=0, rowspan=7)

btn = tk.Button(root,
            text='計測開始',
            command=check_weight)
btn.grid(row=3,column=0)

initialize()
root.mainloop()
</code></pre>
<br />
data.py<br />
<br />

<pre><code class="python">itemarea_left = (480-346)/2
itemarea_top = 480-64-8
item_info = [
    {
        'enable':True, 
        'weight':64,
        'file':'./app1/neko11.png', 
        'width':64, 
        'height':64, 
        'cagex':120-64-2, 
        'cagey':300-64,
        'home_x':itemarea_left, 
        'home_y':itemarea_top, 
        'x':itemarea_left, 
        'y':itemarea_top, 
    },{
        'enable':True, 
        'weight':32,
        'file':'./app1/neko21.png', 
        'width':58, 
        'height':58, 
        'cagex':120+2,    
        'cagey':300-64-58/2-4,
        'home_x':itemarea_left, 
        'home_y':itemarea_top, 
        'x':itemarea_left, 
        'y':itemarea_top, 
    },{
        'enable':True, 
        'weight':16,
        'file':'./app1/neko31.png', 
        'width':52, 
        'height':52, 
        'cagex':120-52-2, 
        'cagey':300-64-52-4,
        'home_x':itemarea_left, 
        'home_y':itemarea_top, 
        'x':itemarea_left, 
        'y':itemarea_top, 
    },{
        'enable':True, 
        'weight':8,
        'file':'./app1/neko41.png', 
        'width':46, 
        'height':46, 
        'cagex':120+2,    
        'cagey':300-64-58/2-46-4*2,
        'home_x':itemarea_left, 
        'home_y':itemarea_top, 
        'x':itemarea_left, 
        'y':itemarea_top, 
    },{
        'enable':True, 
        'weight':4,
        'file':'./app1/neko51.png', 
        'width':40, 
        'height':40, 
        'cagex':120-40-2, 
        'cagey':300-64-52-40-4*2,
        'home_x':itemarea_left, 
        'home_y':itemarea_top, 
        'x':itemarea_left, 
        'y':itemarea_top, 
    },{
        'enable':True, 
        'weight':2,
        'file':'./app1/neko61.png', 
        'width':34, 
        'height':34, 
        'cagex':120+2,    
        'cagey':300-64-58/2-46-34-4*3,
        'home_x':itemarea_left, 
        'home_y':itemarea_top, 
        'x':itemarea_left, 
        'y':itemarea_top, 
    },{
        'enable':True, 
        'weight':1,
        'file':'./app1/neko71.png', 
        'width':28, 
        'height':28, 
        'cagex':120-28-2, 
        'cagey':300-64-52-40-28-4*3,
        'home_x':itemarea_left, 
        'home_y':itemarea_top, 
        'x':itemarea_left, 
        'y':itemarea_top, 
    },
]

towerarea_left = 53
towerarea_top = 80
tower_info = [
        {
            'file':'./app1/tower01.png',
            'home_x':towerarea_left,
            'home_y':towerarea_top,
            'x':towerarea_left,
            'y':towerarea_top,
        },
        {
            'file':'./app1/tower02.png',
            'home_x':towerarea_left+240, #293,
            'home_y':towerarea_top,
            'x':towerarea_left+240,
            'y':towerarea_top,
        },
]</code></pre>
<br />
<a href="https://ppm.gg-blog.com/File/nekodata.zip" title="nekodata">画像データ</a><br />
<a href="//ppm.gg-blog.com/File/nekobakari.py" target="_blank"> </a>]]>
    </description>
    <category>ゲーム</category>
    <link>https://ppm.gg-blog.com/%E3%82%B2%E3%83%BC%E3%83%A0/%E3%81%AD%E3%81%93%E3%81%B0%E3%81%8B%E3%82%8A</link>
    <pubDate>Sat, 11 Jun 2022 08:19:59 GMT</pubDate>
    <guid isPermaLink="false">ppm.gg-blog.com://entry/6</guid>
  </item>
    <item>
    <title>フラッシュ暗算</title>
    <description>
    <![CDATA[<h3>計算能力を鍛えましょう</h3>
<h4>足し算なんて簡単さ</h4>
<div>　1秒に1個ずつ表示される1桁の数字10個を足し算します。<br />
　これ、毎日やると計算能力鍛えられそうですね。<br />
　もう少し凝って、桁数や時間、出題数を変えられるよう改造する余地があります。<br />
<br />
<img src="data:image/png;base64,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" alt="" /><br />

<h4>プログラムの説明</h4>
<div style="border: 0px; font-family: メイリオ, Meiryo, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', 'ＭＳ Ｐゴシック', sans-serif; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; list-style: none; line-height: 1.7; color: #333333; background-color: #fafafa;">　このプログラムはGUIをつかっています。GUIは標準ライブラリのtkinterです。</div>
<div style="border: 0px; font-family: メイリオ, Meiryo, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', 'ＭＳ Ｐゴシック', sans-serif; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; list-style: none; line-height: 1.7; color: #333333; background-color: #fafafa;">　ウィジェットの配置にはgridを使用しています。</div>
<div>　after()メソッドでfunc_clear()とfunc_interval()を交互に呼び出しています。そうしないと同じ数字が続いたときにわからなくなるためです。</div>
<h4>プログラム</h4>
</div>
<a href="http://blog.cnobi.jp/v1/blog/user/fb9bf6d310f144bc4fe21778abe2c97f/1654929564" title="anzan" target="_blank">ダウンロード</a><br />
<br />

<pre><code class="python">import tkinter as tk
import random

# 問題
mondai = []
# 出題番号
number = 0
# 状態
state = 0

# ガイド文字列
guide_message = '開始ボタンを押すとスタートします'

def func_clear():
    '''
    消去処理
    '''
    # 表示消去
    global lbl
    lbl['text'] = ''
    # 次の出題の表示設定
    global number
    number += 1
    root.after(500, func_interval)
    return

def show_addend():
    '''
    問題の表示
    '''
    global lbl
    global mondai
    global number
    lbl['text'] = str(mondai[number])
    global root
    root.after(500, func_clear)
    return

def func_interval():
    '''
    定期処理
    '''
    global number
    global mondai
    if number &lt; len(mondai):
        # 出題番号の値表示
        show_addend()
        return

    # 定期処理開始
    global root
    global btnStart
    btnStart['state'] = tk.NORMAL
    btnStart['text'] = '答え'
    lblStart.config(state=tk.NORMAL)
    return

def satrt_anzan():
    '''
    ハンドラ関数
    '''
    global btnStart
    global mondai
    global number
    global state
    if state == 0:
        state = 1
        # 押されたボタンの無効化
        btnStart.config(state=tk.DISABLED)
        lblStart.config(state=tk.DISABLED)
        # 変数初期化
        number = 0
        # 問題作成
        mondai = []
        for no in range(10):
            mondai.append(random.randint(1, 9))
        # 最初の値表示
        show_addend()
        return

    state = 0
    # 最後まで表示した
    lbl['text'] = f'答え＝{sum(mondai)}'
    btnStart['text'] = '開始'
    number = 0
    return

'''
メイン処理
'''
# トップレベルウインドウの生成
root = tk.Tk()
root.title('Flash Anzan')
root.geometry('320x240')

#Labelウィジェットの生成
lbl = tk.Label(root, text='', font=('System', 40))
lblStart = tk.Label(root, text=guide_message, font=('System', 20))

# Buttonウィジェットの生成と配置
btnStart = tk.Button(root, text='開始', font=('System', 20), command=satrt_anzan)
# 各列の割合を指定
root.columnconfigure(0, weight=1)
# 各行の割合を指定
root.rowconfigure(0, weight=3)
root.rowconfigure(1, weight=1)
root.rowconfigure(2, weight=1)

# grid関数で配置
lbl.grid(column=0, row=0, columnspan=1)
btnStart.grid(column=0, row=1, columnspan=1)
lblStart.grid(column=0, row=2, columnspan=1)

# トップレベルウインドウの表示
root.mainloop()
</code></pre>]]>
    </description>
    <category>ゲーム</category>
    <link>https://ppm.gg-blog.com/%E3%82%B2%E3%83%BC%E3%83%A0/%E3%83%95%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E6%9A%97%E7%AE%97</link>
    <pubDate>Sat, 11 Jun 2022 06:50:03 GMT</pubDate>
    <guid isPermaLink="false">ppm.gg-blog.com://entry/5</guid>
  </item>
    <item>
    <title>AndroidでPython</title>
    <description>
    <![CDATA[AndroidでPythonが使えるようにします。<br />
ここでは、Playストアからインストール可能な pyroid 3 を紹介します。&nbsp;<br />
<br />
まずはPlayストアを開き、pyroid 3 を検索します。<br />
インストールボタンを押すとインストールされます。<br />
<img src="//ppm.gg-blog.com/File/inst01.png" alt="" /> <br />
インストール後、アイコンからPyroid 3 を起動します。<br />
Pyroid 3 を最初に起動したときは以下の画面が表示されるので"LET'S START"をタップします。<br />
<img src="//ppm.gg-blog.com/File/inst02.png" alt="" /><br />
質問が表示されるので選択して"CONTINUE"をタップします。<br />
ここでは小規模プロジェクトを選択しています。<br />
<img src="//ppm.gg-blog.com/File/d80ca11c.png" alt="" /><br />
使用目的を聞いているようなのでホビーとしています。<br />
"CONTINUE"をタップすると次の画面に進みます。<br />
<img src="//ppm.gg-blog.com/File/inst04.png" alt="" /><br />
カスタマイズ項目が表示されるので好きな機能をONにします。<br />
<img src="//ppm.gg-blog.com/File/inst05.png" alt="" /><br />
ここでは、自動保存と、タブボタンでタブではなくスペースを入力する設定をONにしました。<br />
ダークテーマはお好みで。<br />
"CONTINUE"をタップすると次の画面に進みます。<br />
<img src="//ppm.gg-blog.com/File/inst06.png" alt="" /><br />
どんなプログラムを作るのか聞かれたのでGUIアプリを選択しました。<br />
"CONTINUE"をタップすると次の画面に進みます。<br />
<img src="//ppm.gg-blog.com/File/inst07.png" alt="" /><br />
この画面はどうすれば良いのか迷ったのですが、よく見ると有料版の広告でした。<br />
右上のＸをタップするとようやくメインの画面が表示されます。<br />
<img src="//ppm.gg-blog.com/File/inst08.png" alt="" /> <br />
以降は起動するとこの画面が表示されます。<br />
<img src="//ppm.gg-blog.com/File/0575a60a.png" alt="" /> <br />
<br />
白い部分をタップするとキーボードが表示されるので、プログラムを入力します。<br />
<img src="//ppm.gg-blog.com/File/inst10.png" alt="" /> <br />
画面右側にある黄色の丸に横向き三角のボタンをタップするとプログラムが実行できます。<br />
<img src="//ppm.gg-blog.com/File/inst11.png" alt="" /> <br />
終了するときは画面左上の&larr;をタップするか戻るボタンでエディタの画面に戻ります。<br />
<br />
PPMのプログラムはテキストファイルを用意しているので、ダウンロードして読み込むと使えます。<br />
PPMのサイトをブラウザで表示し、プログラムの部分に「ダウンロード」があるので長押ししてメニューを表示させます。<br />
<img src="//ppm.gg-blog.com/File/inst12.png" alt="" /><br />
「リンクをダウンロード」でスマホ内にプログラムファイルを保存します。<br />
<img src="//ppm.gg-blog.com/File/inst13.png" alt="" /><br />
Pyroid3の画面上部にあるファイルアイコンで保存したプログラムファイルを読み込みます。<br />
<img src="//ppm.gg-blog.com/File/inst14.png" alt="" /> <br />
三角ボタンをタップして実行します。<br />
<img src="//ppm.gg-blog.com/File/inst15.png" alt="" /> <br />
終了は戻るボタンです。<br />
<br />
Windowsで作ったプログラムがAndroidで動いて感動です。]]>
    </description>
    <category>環境作成</category>
    <link>https://ppm.gg-blog.com/environment/android%E3%81%A7python</link>
    <pubDate>Sat, 07 May 2022 08:38:00 GMT</pubDate>
    <guid isPermaLink="false">ppm.gg-blog.com://entry/4</guid>
  </item>
    <item>
    <title>ダイス</title>
    <description>
    <![CDATA[<h2>さあ、ゲームを始めよう</h2>
<div></div>
<div>　テーブルゲームで遊ぶとき必要になるのがサイコロです。</div>
<div>　普通サイコロというと正六面体のものを指します。１から６までの値を同じ確率で発生させるために使うものですよね。</div>
<div>　ゲームによっては他のサイコロを使うこともあります。物理的に存在するのは正４面体、正８面体、正１２面体、正２０面体ぐらいでしょうか。確率を調整した１０面体や１００面体のサイコロも見たことがありますが、１００面体は面が多すぎてまるでゴルフボールのようでした。</div>
<div>　いろんな種類のきれいなサイコロを集めるのも楽しいのですが、任意のサイコロを必要な数振ることができると便利そうです。</div>
<div>　ということで、サイコロを作ってみました。</div>
<div></div>
<h2>どんなサイコロを何個使う？</h2>
<div></div>
<div>　1D6と書いて６面体のサイコロを１つ振るという意味になります。Dの前が個数、後ろがサイコロの種類です。</div>
<div>　実際のサイコロとは違い、物理的な形状に制約がないため、2から100までのサイコロを自由に作成することができます。</div>
<div>　個数は１個から１０個までです。</div>
<div><br />
<img src="data:image/png;base64,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" alt="" /></div>
<div></div>
<h2>プログラムの説明</h2>
<div></div>
<div>　このプログラムはGUIをつかっています。GUIは標準ライブラリのtkinterです。</div>
<div>　文字の表示はLabelウィジェット、数字の選択はComboboxウィジェット、ボタンはButtonウィジェットです。</div>
<div>　ウィジェットの配置にはgridを使用しています。</div>
<div>　プログラム自体は何の難しいこともしていませんが、ウィジェットの配置と、サイコロの出目をどう見せるかは工夫した部分です。</div>
<div>　3D6はRPGのキャラクタメイキングで使われますが、期待値が11.5で最大値の18と最小値の3が出にくくなります。つまり大体同じような値となり、大きく外れた値は運が良いまたは悪い時にしか出ないようになります。</div>
<div>　これを合計値だけで出してしまうと確立に細工していないか？と勘繰られてしまいます。そうならないよう、すべての出目とその合計値を出力するようにしました。</div>
<div>
<h2>プログラム</h2>
<code><code><code><a href="//ppm.gg-blog.com/File/dice.py" target="_blank" style="font-family: Arial, メイリオ, sans-serif;">ダウンロード<br />
<br />
</a></code></code></code>
<pre><code>from logging import root
from struct import pack
from os import system
from tkinter import ttk
import tkinter as tk
import random

def roll_dice():
    '''
    サイコロを振る
    '''
    count = int(cb_count.get())     # サイコロの数を取得
    dice = int(cb_dice.get())       # サイコロの種類を取得
    total = 0               # 合計値
    history = []            # サイコロの出目
    for no in range(count):
        d = random.randint(1, dice)
        total += d
        history.append(d)
    lbl_result['text'] = f'{total}\r\n{history}'
    return

'''
ウインドウを作成
サイコロの個数選択と結果表示、サイコロを振るボタンを配置する
'''
root = tk.Tk()
root.title('ダイス')
root.geometry('240x320')

guidemsg = tk.Label(root,
            text='サイコロの数と種類を選択してください')
count_nums = tuple(no for no in range(1, 11))
cb_count = ttk.Combobox(root,
            width=6,
            state='readonly',
            values=count_nums)
cb_count.current(0)
lbl_d = tk.Label(root,
            text='D')
dice_kind = tuple(no for no in range(2, 101))
cb_dice = ttk.Combobox(root,
            width=6,
            state='readonly',
            values=dice_kind)
cb_dice.current(4)
lbl_result = tk.Label(root,
            text='\r\n[ ]',
            font=('system', 20))
btn = tk.Button(root,
            text='サイコロを振る',
            command=roll_dice)

# 各行の割合を指定
weit = [1,1,3,1]
for no in range(4):
    root.rowconfigure(no, weight=weit[no])

# 各列の割合を指定
for no in range(3):
    root.columnconfigure(no, weight=1)

# grid関数で配置
guidemsg.grid(column=0, row=0, columnspan=3)
cb_count.grid(column=0, row=1, sticky=tk.E)
lbl_d.grid(column=1, row=1)
cb_dice.grid(column=2, row=1, sticky=tk.W)
lbl_result.grid(column=0, row=2, columnspan=3)
btn.grid(column=0, row=3, columnspan=3)

root.mainloop()
</code></pre>
</div>]]>
    </description>
    <category>ツール</category>
    <link>https://ppm.gg-blog.com/tools/%E3%83%80%E3%82%A4%E3%82%B9</link>
    <pubDate>Fri, 11 Mar 2022 10:42:54 GMT</pubDate>
    <guid isPermaLink="false">ppm.gg-blog.com://entry/3</guid>
  </item>
    <item>
    <title>ヒット・アンド・ブロー</title>
    <description>
    <![CDATA[<h2>答えが何か当ててごらん</h2>
<div>　数あてゲームです。</div>
<div>　0～9の数字から4つを選び、答えを当てます。</div>
<div>　各数字は1回しか使用できません。</div>
<div>　数字と場所が当たっていた場合はHit、数字があっていて場所が違っていた場合はBlowとしてカウントします。</div>
<div>　HitとBlowの数字を頼りに答えを当てて下さい。</div>
<div><br />
<img src="data:image/png;base64,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" alt="" /></div>
<h2>何で作ったの？</h2>
<div>　新しい環境でプログラムを作る際、いつも数当てのハイ・ロー・ゲームから始めます。</div>
<div>　その次に作るのがこのヒット・アンド・ブロー・ゲームです。単純なわりに結構遊べるというのがその理由です。</div>
<div></div>
<h2>プログラムの説明</h2>
<div>　このプログラムはGUIをつかっています。GUIは標準ライブラリのtkinterです。</div>
<div>　ウィジェットの配置にはgridを使用しています。</div>
<div>　作る際に苦労したのは、複数ボタンから一つのハンドラを呼び出すようにした部分です。最終的にbindでハンドラを指定するようにしました。しかし、ボタンの2度押しがないようにボタンの無効化をしたのですが、bindを使った場合はハンドラが呼び出されてしまいます。そこで、ハンドラの最初でstateを判定してDISABLEのボタンは処理しないようにしています。</div>
<div><br />

<h2>プログラム</h2>
<a href="//ppm.gg-blog.com/File/hitblow.py" target="_blank" style="font-size: 14px; font-weight: 400;">ダウンロード</a>
<pre><code class="python"># Hit and Blow
# 2022/03/10
from functools import cache
from itertools import count
from multiprocessing.connection import wait
import numbers
from sre_parse import State
import this
import tkinter as tk
import random
from tkinter import N, messagebox

# アイテムの種類
ITEM_MAX = 10

# 入力するアイテムの数
ITEM_COUNT = 4

# 縦に並べるボタン数
BUTTON_Y = 2

# 横に並べるボタン数
BUTTON_X = int(ITEM_MAX / BUTTON_Y)

# 改行文字
CR = '\r\n'

# 入力表示用
numbers = []
# 答え
ans = []
# 入力回数カウンタ
counter = 1
# 入力アイテム数
item_counter = 0

# 初期化関数
def initialize():
    global numbers
    global ans
    global counter
    global item_counter
    global lbl

    # 入力されたアイテム
    numbers = []
    # 答え
    ans = list(range(ITEM_MAX))
    random.shuffle(ans)
    # カウンタ
    counter = 0
    # 入力アイテム数
    item_counter = 0
    # 初期表示
    lbl['text'] = (' ' * 22 + CR) * 3

# 改行してカウンタを表示
def disp_counter():
    global counter
    global lbl
    counter += 1
    lbl['text'] += f' \r\n{counter:2}:'

# ハンドラ関数
def input_item(event):
    global numbers
    global ans
    global counter
    global item_counter
    global lbl

    # 無効化されたボタンは処理しない
    if event.widget.cget('state') == tk.DISABLED:
        return
    
    # ボタンの数字を取得
    no = int(event.widget.cget("text"))
    # 入力されたアイテムを保存
    numbers.append(no)
    # 押されたボタンの無効化
    event.widget.config(state=tk.DISABLED)

    # 入力アイテムの表示
    lbl['text'] += str(no)
    
    # 入力アイテム数が規定数になるのを待つ
    item_counter += 1
    if item_counter &lt; ITEM_COUNT:
        return

    # Hit/Blow 判定
    hit = 0
    blow = 0
    for idx1 in range(ITEM_COUNT):
        try:
            idx2 = numbers.index(ans[idx1])
        except:
            continue

        if idx1 == idx2:
            hit += 1
        else:
            blow += 1
 
    # 一番古い行を削除
    tmp = lbl['text']
    pos = tmp.find(CR)
    if pos &gt;= 0:
        lbl['text'] = tmp[pos+len(CR):]

    # Hti/Blowを表示して改行
    lbl['text'] += f' H={hit} B={blow}'

    # ボタンを有効にする
    for idx in range(ITEM_COUNT):
        tenkey[numbers[idx]]['state'] = tk.NORMAL

    # 入力アイテムをクリア
    numbers = []
    item_counter = 0

    # クリア判定
    if hit == ITEM_COUNT:
        messagebox.showinfo('', f'{counter}回で正解です！')
        initialize()
    # 改行してカウンタを表示
    disp_counter()

# トップレベルウインドウの生成
root = tk.Tk()
root.title('Hit and Blow')
root.geometry('240x320')

#Labelウィジェットの生成
lbl = tk.Label(root, text='', font=('System', 20), justify='left')

# Buttonウィジェットの生成
tenkey = []
for num in range(ITEM_MAX):
    tenkey.append(tk.Button(root, text=str(num), font=('System', 20)))
    tenkey[num].bind('&lt;ButtonPress&gt;', input_item)

# 各行の割合を指定
root.rowconfigure(0, weight=1)
root.rowconfigure(1, weight=0)
root.rowconfigure(2, weight=0)

# 各列の割合を指定
for idx in range(int(ITEM_MAX / 2)):
    root.columnconfigure(idx, weight=1)

# grid関数で配置
lbl.grid(column=0, row=0, columnspan=int(ITEM_MAX/2))
for idx in range(ITEM_MAX):
    posx = idx % BUTTON_X
    posy = idx // BUTTON_X + 1
    tenkey[idx].grid(column=posx, row=posy, 
                    sticky=tk.NSEW, padx=5, pady=5)

# 変数初期化
initialize() 
# 改行してカウンタを表示
disp_counter()

# トップレベルウインドウの表示
root.mainloop()

'''
実行イメージ
 1:0123 H=0 B=0
 2:4567 H=0 B=2
 3:6789 H=0 B=4
 4:9786 H=2 B=2
 5:987
[1][2][3][4][5] 
[5][6][7][8][9]
'''
</code></pre>
</div>]]>
    </description>
    <category>ゲーム</category>
    <link>https://ppm.gg-blog.com/%E3%82%B2%E3%83%BC%E3%83%A0/%E3%83%92%E3%83%83%E3%83%88%E3%83%BB%E3%82%A2%E3%83%B3%E3%83%89%E3%83%BB%E3%83%96%E3%83%AD%E3%83%BC</link>
    <pubDate>Fri, 11 Mar 2022 10:27:31 GMT</pubDate>
    <guid isPermaLink="false">ppm.gg-blog.com://entry/2</guid>
  </item>
    <item>
    <title>Python Program Magazine</title>
    <description>
    <![CDATA[<strong>創刊です<br />
<br />
</strong> 　Python Program Magazine 略して PPM を創刊します。<br />
　といっても紙の雑誌ではなくブログなのですが。<br />
　その昔、ペーパー・ソフトウェア・マガジンというものがありました。雑誌のページにプログラムが掲載されており、それをPCに打ち込むとプログラムが動く、というものです。ほとんどがゲームであり、手でプログラムを入力すれば遊べるので、ゲームで遊びたい人が購入していたかもしれません。<br />
　インターネットの時代になって、プログラムはダウンロードして動かすようになり、手で入力するという文化は廃れてしまいました。入門書ですらサンプルプログラムはダウンロードです。<br />
　それというのも、昔のPC、当時の呼び方で言えばマイコンと今のPCとでは大きな違いがあるからです。<br />
　マイコンを動かしていたのは Windows でも Mac OS でもなく、各ハードウェア会社の用意した BASIC です。<br />
　マイコンを起動すると BASIC が立ち上がり、コマンドを入力するとそれにしたがって結果を返す、今のshellと少し似ていますが、BASIC はれっきとしたプログラム言語です。<br />
　BASIC のプログラムを入力して RUN というコマンドを実行するとプログラムが動き出します。BASICはプログラムコードでプログラムが供給されるのです。だからペーパー・ソフトウェア・マガジンが存在できたわけです。<br />
　Windows用のプログラムの場合、例えばC++のプログラムコードを渡されてもそのままでは動きません。コンパイラを用意して実行ファイルを作らないとそのプログラムは動きません。ネットからダウンロードするのはその実行ファイルです。実行ファイルをエディタで開いても元のプログラムコードは見えません。<br />
　Pythonに初めて触れた時、『BASICに似てる』と思いました。<br />
　言語仕様も使用目的も全然異なる2つの言語なのですが、WindowsのコマンドプロンプトでPythonと入力して対話モードで動かした時、懐かしさを感じました。<br />
　Pythonもインストールして実行しなければならないのですが、テキストファイルに書いたコードがそのまま動くところが異なります。<br />
　これは、実行ファイルをダウンロードしなくても、テキストをコピペすれば動くということです。つまり、文字で書いたプログラムをそのまま公開できてしまいます。<br />
　ということで、インターネット時代のペーパー・ソフトウェア・マガジンにぴったりの題材ということができます。<br />
<br />
<strong>前置きが長くなりましたが<br />
</strong>　要はPythonのプログラムを作って公開していくということです。<br />
　気になったらテキストファイルにスクリプトをコピペして実行してみてください。<br />
　作業しているのがWindowsのPCなので、Windows寄りのネタが多くなると思いますが、Raspberry Pi（ラズパイ）も視野には入れています。ラズパイの Raspberry Pi OS にはインストールしなくてもPythonが入っているし実行も簡単ですね。<br />
　タイトルのPPMは、マイコンBASICマガジンとPiO、プログラムポシェットのオマージュです。<br />
　掲載しているスクリプトは<a href="https://opensource.org/licenses/mit-license.php" title="" target="_blank">MIT License</a>とします。文章は<a href="https://creativecommons.jp/licenses/" title="" target="_blank">CCライセンス</a>です。<br />
<br />
(c)2022, TAKIMOTO Shibuki<br />
Released under the MIT license<br />
https://opensource.org/licenses/mit-license.php<br />
<br />
<a rel="license" href="http://creativecommons.org/licenses/by/4.0/"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width: 0;" src="https://i.creativecommons.org/l/by/4.0/88x31.png" /></a><br />
この 作品 は <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">クリエイティブ・コモンズ 表示 4.0 国際 ライセンス</a>の下に提供されています。<br />
<br />
]]>
    </description>
    <category>前書き</category>
    <link>https://ppm.gg-blog.com/%E5%89%8D%E6%9B%B8%E3%81%8D/python%20program%20magazine</link>
    <pubDate>Thu, 10 Mar 2022 15:10:30 GMT</pubDate>
    <guid isPermaLink="false">ppm.gg-blog.com://entry/1</guid>
  </item>

    </channel>
</rss>