課題

- プログラムを実行した直後に,ユーザによって時刻が時間と分で指定されるとします.
- 指定された時刻に合わせて時計盤,短針,長針を描きます.
- 短針,長針はそれぞれ1分単位で動くとします.
- 時計盤の大きさ,長針と短針の長さ,また色は自由に決めてください.
- たとえば秒針を追加するなど,プログラムを拡張することも自由です.
(※秒針を追加した場合,すべての針は1秒単位で動くものとします)
目次
プログラムテンプレート
次に示すテンプレート(雛型)をプログラム作成に利用してください. このテンプレート(clock_template.py)はダウンロードする際に名前を適宜変更して保存した上で利用してください.
ファイルを保存するフォルダは前回と同じく次のようにしてください(別のフォルダにダウンロードした場合はファイルを移動させてください).
ExBasicInfo > Programming
同じフォルダに「pyturtle.py」があることを想定しています. 今まで作成したプログラムも置いてあるはずです.
ダウンロードしたら,idleを起動してファイルを開いてみてください.
- Anaconda Prompt(Win)/ターミナル(Mac)を起動
- Windowsの場合,次のように入力
idle ⏎
Macの場合,次のように入力
idle3 ⏎
idleの「Shell」が起動します. - ファイルを開く
idleの「Shell」でダウンロードしたファイルを開きます.[File] > [Open]idleの「Editor」が起動して,指定されたファイルが開かれます.
テンプレートの概要
このテンプレートでは時刻データを指定して,変数「hour」と「minute」に「時」と「分」の値をそれぞれ代入するようになっています. テンプレートはそのまま実行できます. まずは次の「時刻の指定方法」の説明を読んで,テンプレートのままで実行してみてください. 時刻を指定すると,その時刻をポップアップ画面に表示するようになっています.
プログラムでの時刻の指定方法
さて今回のプログラムは「idle]の「Editor」を介して次のように実行します.
実行すると「Python Turtle Graphics」という白いキャンバスのウインドウが新しく開きます. ウインドウが表示されたら,キャンバスの上でマウスを左クリックするか,[Enter]を押してください.
ここで画面に小さなウインドウが出てきます.そのウインドウの入力欄に「時」と「分」を空白文字で区切って指定します.次の例では「10時15分」を指定しています.
10 15
時刻の入力を省略することもできます(何も指定しないで[OK]ボタンを押すか,[Enter]を押す). 省略した場合は,時刻はランダムに決定されます.
取り組む内容と課題の進め方
上で説明した通り,テンプレートでは実行した直後に時刻を指定するようになっています. この処理は次の行(9行目)で行われています.
# 時刻データを得る(hour時minute分)
# hour = 0,1,...,23のいずれか
# minute = 0,1,...,59のいずれか
hour,minute = feed_time("何時何分?",2)
この行の処理で時刻が指定されると,左辺の変数「hour」に「時」の値が代入され,変数「minute」に「分」の値が代入されます. さきほどの例と同じく「10時15分」を指定したとすると,上の処理が終わったときに, 次のように値が代入されることになります.
hour = 10 minute = 15
課題では,このようにして得られる変数hour,minuteの値に従って時計を描く亀の動作の記述をプログラムに追加してください. 指定される時刻次第で(つまりhour,minuteに代入される値次第で),描かれる時計の各針の向きも変わります.
課題には次のような手順で取り組むとよいでしょう.
- 時計盤(のみ)を描いてみる
- 短針(長針)を指定された時刻に合わせて描くようにする
- もう一方の針を指定された時刻に合わせて描くようにする (一つ描ければ,もう一つも同じ要領で描けるだろう)
- 余裕があれば,さらに拡張を試みる
時計盤や針などの描画する部品の形状パラメタは変数を使って記述しておくと, デザインの調整が楽になります.
[Option] 秒をデータとして追加する場合
秒を時刻データに含める場合は,テンプレートの次の行(9行目)を以下で説明するように変更します.
# 時刻データを得る(テンプレートの場合)
hour,minute = feed_time("何時何分?",2)
- 変更内容
- 左辺に秒の値を格納する変数を追加
- 右辺の「2」を「3」に変更(※左辺のデータの個数をこの数で指定している).メッセージも適宜変更
たとえば秒を表す変数をsecondとする場合は次のように書きます.
# 時刻データを得る(「秒」を追加する場合) hour,minute,second = feed_time("何時何分何秒?",3)
また時刻表示のメッセージに秒のデータを含めるには,「say」の行を次のように変更します.
say(f"{hour}時{minute}分{second}秒です")
このように「秒」を追加した場合でも,追加しない場合と同様にデータを入力できます. 時刻を指定しない場合はやはりランダムに決定されます.
なお「秒」の追加は課題としては必須ではありません.
Tips
- タートルグラフィクス
- 色表
- 四則演算に関する注意
- 乗算: 演算子は「*」です.数学のように記号を省略することはできません.
- 除算: 演算子は「/」です.
- 演算の優先順位
数学と同じです.括弧で優先順位を明示できます. 計算式での括弧には常に( )を使います. { }や[ ]は使いません.
- markとback(タートルグラフィクスの機能)
markすると亀が現在位置と向きを記憶します. その後backすると亀がmarkした状態に戻ります. backするとそのmarkに関する記憶はなくなります.sz = 100 mark() # 現在の位置と向きを記憶する forward(sz) turn(120) forward(sz) back() # 記憶している場所まで線を描いて戻る.向きも記憶したときの状態に合わせる. mark() # 現在の位置と向きを記憶する(上のbackで最初のmarkは忘れられているため再度マークする) forward(sz) turn(-120) forward(sz) # 記憶している場所まで線を描かずに戻る.向きも記憶したときの状態に合わせる. begin_hover() back() end_hover()
この例で示している通りhoverしている間に「back( )」とすれば線を描かずに戻ります.
2つ以上(backしないまま)続けてmarkすることもできます. markは全て順番に記憶されます. markが2つ以上ある状態でbackすると最後にmarkした状態(最新のmark)に戻ります. この場合もそのmarkに関する記憶はなくなります(markが1つ減ります). backするたびにmarkしたときと逆順に新しいmarkから順位古いmarkに戻っていくことになります. なおmarkがないときにbackしても何も起きません.マークは「スタック」(stack)というデータ構造を使って管理しています.
サンプルプログラム
参考のために,サンプルプログラムを提供します.
注意
以下のことに注意してください.
- プログラムを変更した場合は,必ずファイルを保存して,その後プログラムを実行してください.
- ファイルを保存する.
- (再度)プログラムを実行する
- プログラムを実行してエラーがでたら「よくある質問」を参照してみてください. もちろん分からないことがある場合には演習中に質問してください.
- プログラムを提出する際には「課題提出に関する注意」を必ず守るようにしてください.