2020年9月28日月曜日

pythonで子ども用の計算アプリを作成

 小学3年の娘の集中力が持続せず、ひき算やわり算の計算がはかどらない。

私がパソコンをいじっている姿をよく見ているためか、パソコンには興味を持ってくれているようなので、ラズベリーパイを使って、計算用のプログラムを作ってみた。

使用言語:python3

---わり算.py---

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

####設定用################################
問題数 = 2               #出題数
ファイル名 = 'わり算.py'   #このファイル名
記録ファイル = 'data.csv' #記録ファイルのパス
#######################################

import random
import time
import csv

def 問題(num): 
    global 得点
    a=random.randint(100,999)
    b=random.randint(10,99)
    c=a//b
    d=a%b
    正解 = "{}...{}".format(c,d)
    print("第{}問:{} ÷ {} =".format(num+1,a,b))
    解答 = input()
    if 正解 == 解答:
        得点 = 得点 + 1
        print("正解◯")
    else:
        print("間違い×。正解は" + str(正解))

#記録ファイル参照
print("名前を入力しなさい。(●/●)")
名前 = str(input())
lst = []
記録=1000
with open(記録ファイル ,'r') as file:
    reader = csv.reader(file)
    lst = [r for r in reader]
for row in lst:
    if row[0] == ファイル名:
        if row[1] == 名前:
            記録 = int(row[2])

#名前が違う場合に再入力を強制する。
while [str(ファイル名),str(名前),str(記録)] not in lst:
    print("名前が違うよ。もう一度名前を入力しなさい")
    名前=input()
    for row in lst:
        if row[0] == ファイル名:
            if row[1] == 名前:
                記録 = int(row[2])
else:
    print("記録は {} 秒です".format(記録))

#開始
得点 = 0
print("〇あまり〇 → 〇...〇 の形で答えなさい")
print("Enterキーで開始 全{}問".format(問題数))
input()
start=time.time()

#ループ開始
for num in range(問題数):
    問題(num)
    print("-------------------")

#ループ後の処理
finish=time.time()
経過時間=int(finish-start)
print("得点:{}/{} 点。記録は {} 秒です".format(得点,問題数,経過時間))

if 得点 == 問題数:
    if 記録 > 経過時間 :
        sec = 記録 - 経過時間
        print("新記録達成!!    {} 秒更新".format(sec))
        for row in lst:
            if row[0] == ファイル名:
                if row[1] == 名前:
                    row[2]=str(経過時間)

        with open(記録ファイル ,'w',encoding='utf-8') as file:
            writer = csv.writer(file)
            writer.writerows(lst)
    else:
        sec = 経過時間 - 記録
        print("残念!" + str(sec) + "秒とどかず")
else:
    print("{}点目指してがんばれ!!".format(問題数))

print("Enterキーで終了")
input()


# 使用方法
# ターミナルで保存したディレクトリへ移動し、”sudo chmod 755 か

わり算.py”を実行しファイルに実行権限を与える。
# 記録ファイルに「わり算.py,名前,999」を追記(なければ新規作成)する。
# ダブルクリックし、端末で実行を選択する。

#説明
#def 問題(num): ここだけ変えれば、いろいろな問題に対応可能。
#記録ファイル参照:csvファイルを参照し、ユーザーごとの記録を表示する。
#名前が違う場合に再入力を強制する。:
data.csvに[名前,ファイル名,*]がなければ、名前が違うとして再入力を促す。
#開始:
#ループ開始:
 for A in range Bを使用し、B(問題数)回ループさせる。
#ループ後の処理:
 time.time()を使用し、開始時と終了時の時間差を取得する。
 満点でかつ、記録を更新すれば、新たにcsvファイルに記録を上書きする。

ファイル名 = __file__とするとなぜかうまく行かない。

LXTerminalのフォントサイズが小さく、見えにくい場合には、ターミナルを起動して、「編集→設定(s)→スタイル→フォント」でデフォルトのサイズを変更可能。

5インチディスプレイだと下が表示されない問題があるので、
$ sudo nano /boot/config.txt
末尾に”display_rotate=1”を追記し保存。
$ sudo reboot
90度回転されて表示されるので、下まで確認できる。設定後は追記した一文を削除して再起動。

 

Failed to execute child process "xterm"(そのようなファイルやディレクトリはありません):と表示される場合は、/usr/bin/xtermがないので、シンボリックリンクを作成します。
$ cd /usr/bin
$ sudo ln -s lxterminal xterm