【 課題 】100マス計算をするプログラムを書いてください。
【 用語 】下記
【 期限 】1/7くらいまで
【 Ver 】2.5以上(3でも可)
【 補足 】
プログラムがランダムに出題し、人間が100個の
マスに回答を入力し、確認ボタンを押すと
全問正解なら回答にかかった時間を表示して終了。
間違った場合は間違った場所にカーソルが止まり、
別の値が入力されるまで待ちます。
横10個、縦10個の数字は各々11〜99までの乱数、
演算は +,-,x のみでよいです。
よろしくおねがいします。
713 :
デフォルトの名無しさん:2009/01/04(日) 22:56:08
age
# -*- coding: utf-8 -*-
import tkinter as Tk
from tkinter.simpledialog import SimpleDialog
import random
class Application:
FONT = ("MSゴシック", 20)
OPS = [("+", lambda x, y: x + y),
("−", lambda x, y: x - y),
("×", lambda x, y: x * y)]
def __init__(self):
self.root = Tk.Tk()
self.root.title("100マス計算")
self.root.option_add("*font", self.FONT)
frame = Tk.Frame(self.root)
frame.pack(side=Tk.TOP)
self.op_button = Tk.Button(frame, command=self.change_op)
self.op_button.grid(row=0, column=0)
self.entries = {}
self.tate_labels = []
self.yoko_labels = []
for i in range(10):
label = Tk.Label(frame, text="0")
label.grid(row=i+1, column=0)
self.tate_labels.append(label)
label = Tk.Label(frame, text="0")
label.grid(row=0, column=i+1)
self.yoko_labels.append(label)
for j in range(10):
entry = Tk.Entry(frame, width=4)
entry.grid(row=i+1, column=j+1)
self.entries[(i, j)] = entry
button = Tk.Button(self.root, text="出題", command=self.new)
button.pack(side=Tk.LEFT)
button = Tk.Button(self.root, text="終了", command=self.root.quit)
button.pack(side=Tk.RIGHT)
button = Tk.Button(self.root, text="確認", command=self.check)
button.pack(side=Tk.BOTTOM)
self.easy = True
self.debug = False
self.op = 0
self.new()
self.root.mainloop()
def change_op(self):
self.op = (self.op + 1) % 3
self.new()
def new(self):
label, func = self.OPS[self.op]
self.op_button.config(text=label)
if self.easy:
self.tate = list(range(1, 11)); random.shuffle(self.tate)
self.yoko = list(range(1, 11)); random.shuffle(self.yoko)
else:
self.tate = [random.randint(11, 99) for i in range(10)]
self.yoko = [random.randint(11, 99) for i in range(10)]
for i, num in enumerate(self.tate):
self.tate_labels[i].config(text=str(num))
for i, num in enumerate(self.yoko):
self.yoko_labels[i].config(text=str(num))
for i in range(10):
for j in range(10):
entry = self.entries[(i, j)]
entry.config(bg="white")
entry.delete(0, Tk.END)
if self.debug:
for i in range(10):
for j in range(10):
answer = func(self.tate[i], self.yoko[j])
entry = self.entries[(i, j)]
entry.insert(0, str(answer))
def check(self):
label, func = self.OPS[self.op]
count = 0
for i in range(10):
for j in range(10):
entry = self.entries[(i, j)]
if entry.get() == str(func(self.tate[i], self.yoko[j])):
entry.config(bg="white")
else:
entry.config(bg="red")
count += 1
if count == 0:
msg = "全問正解\(^o^)/\nよくできました"
else:
msg = "赤色の{0}マスが間違っています".format(count)
d = SimpleDialog(self.root, text=msg, buttons=["OK"])
d.go()
Application()
禿げしくありがとうございます!!
Python 3.0 で書いてみたお。2.x とほとんど変わらない希ガス。
self.easy を偽にすると11〜99の数字で出題されるようになるお。
self.debug を真にすると自動的に正答が記入されるお。
Windows 以外の環境では FONT の値を適当にいじる必要があると思われ。
回答時はタブキーを利用して次のマスに移動すると良さげ。
足し算をすこしやってみたけどイライラして神経衰弱になりそうだったお orz