Python の宿題ここで答えます Part 1

このエントリーをはてなブックマークに追加
712デフォルトの名無しさん
【 課題 】100マス計算をするプログラムを書いてください。
【 用語 】下記
【 期限 】1/7くらいまで
【 Ver  】2.5以上(3でも可)
【 補足 】
プログラムがランダムに出題し、人間が100個の
マスに回答を入力し、確認ボタンを押すと
全問正解なら回答にかかった時間を表示して終了。
間違った場合は間違った場所にカーソルが止まり、
別の値が入力されるまで待ちます。
横10個、縦10個の数字は各々11〜99までの乱数、
演算は +,-,x のみでよいです。
よろしくおねがいします。
713デフォルトの名無しさん:2009/01/04(日) 22:56:08
age
714デフォルトの名無しさん:2009/01/04(日) 23:06:46
# -*- 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)
715714の続き:2009/01/04(日) 23:08:22
      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))
716715の続き:2009/01/04(日) 23:09:53
    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()
717デフォルトの名無しさん:2009/01/04(日) 23:12:09
禿げしくありがとうございます!!
718714-716:2009/01/04(日) 23:21:38
Python 3.0 で書いてみたお。2.x とほとんど変わらない希ガス。

self.easy を偽にすると11〜99の数字で出題されるようになるお。
self.debug を真にすると自動的に正答が記入されるお。
Windows 以外の環境では FONT の値を適当にいじる必要があると思われ。

回答時はタブキーを利用して次のマスに移動すると良さげ。

足し算をすこしやってみたけどイライラして神経衰弱になりそうだったお orz