Senior's Blog

ゴルフ(Golf)、python(Pythonista)、メンタルヘルスに関するブログです。

(39)Tower of Hanoi3 with Execution image

textviewのスクロールができました。

ちょっと効率の悪いコーディング部分もありますが、

そこにはあまり時間をかけたくなかったので、

ハノイの塔はこれで完了です。


 Execution Image:

(refer to twitter)


SourceCode:

import ui
import time #for sleep()

step = 1                  #num. of proc.
lnum = 7                 #num. of disk for Left_tower
cnum = rnum = 0   #num. of disk for Center,Right_tower

#Move proc. for each disk
def moveDisk(num_disk, from_twr, to_twr):
    global lnum, cnum, rnum
    if num_disk == 1:                #for disk1
        if to_twr == "Left":
            d1.x = 80 - (num_disk-1) * 10
            d1.y = 280 - lnum * 30
            lnum += 1                   #increment Left disk num.
        if to_twr == "Center":
            d1.x = 320 - (num_disk-1) * 10
            d1.y = 280 - cnum * 30
            cnum += 1                  #increment Center disk num.
        if to_twr == "Right":
            d1.x = 560 - (num_disk-1) * 10
            d1.y = 280 - rnum * 30
           rnum += 1                   #increment Right disk num.
    if num_disk == 2:               #for disk2
        if to_twr == "Left":
            d2.x = 80 - (num_disk-1) * 10
            d2.y = 280 - lnum * 30
            lnum += 1                   #increment Left disk num.
        if to_twr == "Center":
            d2.x = 320 - (num_disk-1) * 10
            d2.y = 280 - cnum * 30
            cnum += 1                  #increment Center disk num.
        if to_twr == "Right":
            d2.x = 560 - (num_disk-1) * 10
            d2.y = 280 - rnum * 30
            rnum += 1                   #increment Right disk num.
    if num_disk == 3:                #for disk3
        if to_twr == "Left":
            d3.x = 80 - (num_disk-1) * 10
            d3.y = 280 - lnum * 30
            lnum += 1 #increment Left disk num.
       if to_twr == "Center":
            d3.x = 320 - (num_disk-1) * 10
            d3.y = 280 - cnum * 30
            cnum += 1                   #increment Center disk num.
        if to_twr == "Right":
            d3.x = 560 - (num_disk-1) * 10
            d3.y = 280 - rnum * 30
            rnum += 1                   #increment Right disk num.
    if num_disk == 4:                #for disk4
        if to_twr == "Left":
            d4.x = 80 - (num_disk-1) * 10
            d4.y = 280 - lnum * 30
            lnum += 1                    #increment Left disk num.
        if to_twr == "Center":
            d4.x = 320 - (num_disk-1) * 10
            d4.y = 280 - cnum * 30
            cnum += 1                   #increment Center disk num.
        if to_twr == "Right":
            d4.x = 560 - (num_disk-1) * 10
            d4.y = 280 - rnum * 30
            rnum += 1.                   #increment Right disk num.
    if num_disk == 5:                 #for disk5
        if to_twr == "Left":
            d5.x = 80 - (num_disk-1) * 10
            d5.y = 280 - lnum * 30
            lnum += 1                     #increment Left disk num.
        if to_twr == "Center":
            d5.x = 320 - (num_disk-1) * 10
            d5.y = 280 - cnum * 30
            cnum += 1                    #increment Center disk num.
        if to_twr == "Right":
            d5.x = 560 - (num_disk-1) * 10
            d5.y = 280 - rnum * 30
            rnum += 1                    #increment Right disk num.
    if num_disk == 6:                 #for disk6
        if to_twr == "Left":
            d6.x = 80 - (num_disk-1) * 10
            d6.y = 280 - lnum * 30
            lnum += 1                     #increment Left disk num.
        if to_twr == "Center":
            d6.x = 320 - (num_disk-1) * 10
           d6.y = 280 - cnum * 30
           cnum += 1                     #increment Center disk num.
        if to_twr == "Right":
            d6.x = 560 - (num_disk-1) * 10
            d6.y = 280 - rnum * 30
            rnum += 1 #increment Right disk num.
    if num_disk == 7:                  #for disk7
        if to_twr == "Left":
            d7.x = 80 - (num_disk-1) * 10
            d7.y = 280 - lnum * 30
            lnum += 1                      #increment Left disk num.
        if to_twr == "Center":
            d7.x = 320 - (num_disk-1) * 10
            d7.y = 280 - cnum * 30
            cnum += 1                     #increment Center disk num.
        if to_twr == "Right":
            d7.x = 560 - (num_disk-1) * 10
            d7.y = 280 - rnum * 30
            rnum += 1                      #increment Right disk num.

    if from_twr == "Left":
        lnum = lnum -1                   #decrement Left disk num.
    if from_twr == "Center":
        cnum = cnum - 1                #decrement Center disk num.
    if from_twr == "Right":
        rnum = rnum - 1                 #decrement Right disk num.

    time.sleep(0.3)

#Scroll proc. for textview
def scroll():
    tv.content_offset = (0, tv.content_size[1] - tv.height)
    if tv.content_offset[1] < 0:
        #while y_offset is minus, no scroll.
        tv.content_offset = (0,0)

#Main proc. for HANOI, using 'recursion'
def hanois(num_disk, from_twr, to_twr, tmp_twr):
    global step
    #Move disk from 'from_twr' to 'to_twr'.
    if num_disk == 1:
        #if 1disk, move it finished.
        #print(f"step{step}: No.{num_disk}-disk from {from_twr} to {to_twr}.")
        tv.text += (f"step{step}: No.{num_disk}-disk from {from_twr} to {to_twr}."+"\n")
        scroll()
        moveDisk(num_disk, from_twr, to_twr)
        step = step + 1
        return
    #Move (N-1)th. disk from Left to Center. Right as temporary towerext
    hanois(num_disk-1, from_twr, tmp_twr, to_twr)
    #Move remaining disk from Left to Right
    #print(f"step{step}: No.{num_disk}-disk from {from_twr} to {to_twr}.")
    tv.text += (f"step{step}: No.{num_disk}-disk from {from_twr} to {to_twr}."+"\n")
    scroll()
    moveDisk(num_disk, from_twr, to_twr)
    step = step + 1
    #Move (N-1)th. disk from Center to Right. Left as temporary tower
    hanois(num_disk-1, tmp_twr, to_twr, from_twr)

#Start UI
v = ui.load_view()
v.present('sheet')
tv = v['textview1']         #set textview controll
d1 = v['button1']           #set button_n controll
d2 = v['button2']
d3 = v['button3']
d4 = v['button4']
d5 = v['button5']
d6 = v['button6']
d7 = v['button7']
#start The Hanoi
hanois(7, "Left", "Right", "Center")

(38)ハノイの塔の実行画面

動画は直接貼り付けできないんですね。さっきわかりました。

Twitterへ貼り付けましたのでそちらを御覧ください。

※textviewを自動改行させたかったのですが、それはまだできませんでした。

 

 

 

 

(37)Tower of Hanoi2

ハノイの塔のプログラムを改良し、

動く様子を画像でも表示するようにしました。

ボタンを動かすようにしました。

コンソールに表示していた手順は、textviewに表示するようにしています。

動画もアップしようとしましたが、アップロードに時間がかかり過ぎるみたいだったので、今回は省略しました。

 

《SourceCode》

import ui

import time

 

step = 1

lnum = 7

cnum = rnum = 0

 

def moveDisk(num_disk, from_twr, to_twr):

  global lnum, cnum, rnum

  if num_disk == 1:

    if to_twr == "Left":

      d1.x = 80 - (num_disk-1) * 10

      d1.y = 280 - lnum * 30

      lnum += 1 #increment Left disk num.

    if to_twr == "Center":

      d1.x = 320 - (num_disk-1) * 10

      d1.y = 280 - cnum * 30

      cnum += 1 #increment Center disk num.

    if to_twr == "Right":

      d1.x = 560 - (num_disk-1) * 10

      d1.y = 280 - rnum * 30

      rnum += 1 #increment Right disk num.

  if num_disk == 2:

    if to_twr == "Left":

      d2.x = 80 - (num_disk-1) * 10

      d2.y = 280 - lnum * 30

      lnum += 1 #increment Left disk num.

    if to_twr == "Center":

      d2.x = 320 - (num_disk-1) * 10

      d2.y = 280 - cnum * 30

      cnum += 1 #increment Center disk num.

    if to_twr == "Right":

      d2.x = 560 - (num_disk-1) * 10

      d2.y = 280 - rnum * 30

      rnum += 1 #increment Right disk num.

  if num_disk == 3:

    if to_twr == "Left":

      d3.x = 80 - (num_disk-1) * 10

      d3.y = 280 - lnum * 30

      lnum += 1 #increment Left disk num.

    if to_twr == "Center":

      d3.x = 320 - (num_disk-1) * 10

      d3.y = 280 - cnum * 30

      cnum += 1 #increment Center disk num.

    if to_twr == "Right":

      d3.x = 560 - (num_disk-1) * 10

      d3.y = 280 - rnum * 30

      rnum += 1 #increment Right disk num.

  if num_disk == 4:

    if to_twr == "Left":

      d4.x = 80 - (num_disk-1) * 10

      d4.y = 280 - lnum * 30

      lnum += 1 #increment Left disk num.

    if to_twr == "Center":

      d4.x = 320 - (num_disk-1) * 10

      d4.y = 280 - cnum * 30

      cnum += 1 #increment Center disk num.

    if to_twr == "Right":

      d4.x = 560 - (num_disk-1) * 10

      d4.y = 280 - rnum * 30

      rnum += 1 #increment Right disk num.

  if num_disk == 5:

    if to_twr == "Left":

      d5.x = 80 - (num_disk-1) * 10

      d5.y = 280 - lnum * 30

      lnum += 1 #increment Left disk num.

    if to_twr == "Center":

      d5.x = 320 - (num_disk-1) * 10

      d5.y = 280 - cnum * 30

      cnum += 1 #increment Center disk num.

    if to_twr == "Right":

      d5.x = 560 - (num_disk-1) * 10

      d5.y = 280 - rnum * 30

      rnum += 1 #increment Right disk num.

  if num_disk == 6:

    if to_twr == "Left":

      d6.x = 80 - (num_disk-1) * 10

      d6.y = 280 - lnum * 30

      lnum += 1 #increment Left disk num.

  if to_twr == "Center":

      d6.x = 320 - (num_disk-1) * 10

      d6.y = 280 - cnum * 30

      cnum += 1 #increment Center disk num.

  if to_twr == "Right":

      d6.x = 560 - (num_disk-1) * 10

      d6.y = 280 - rnum * 30

      rnum += 1 #increment Right disk num.

  if num_disk == 7:

    if to_twr == "Left":

      d7.x = 80 - (num_disk-1) * 10

      d7.y = 280 - lnum * 30

      lnum += 1 #increment Left disk num.

    if to_twr == "Center":

      d7.x = 320 - (num_disk-1) * 10

      d7.y = 280 - cnum * 30

      cnum += 1 #increment Center disk num.

    if to_twr == "Right":

      d7.x = 560 - (num_disk-1) * 10

      d7.y = 280 - rnum * 30

      rnum += 1 #increment Right disk num.

 

  if from_twr == "Left":

    lnum = lnum -1 #decrement Left disk num.

  if from_twr == "Center":

    cnum = cnum - 1 #decrement Center disk num.

  if from_twr == "Right":

    rnum = rnum - 1 #decrement Right disk num.

 

  time.sleep(0.5)

 

def hanois(num_disk, from_twr, to_twr, tmp_twr):

  global step

  #Move disk from 'from_twr' to 'to_twr'.

  if num_disk == 1:  #if 1disk, move it finished.

    #print(f"step{step}: No.{num_disk}-disk from {from_twr} to {to_twr}.")

    tv.text += (f"step{step}: No.{num_disk}-disk from {from_twr} to {to_twr}."+"\n")

    moveDisk(num_disk, from_twr, to_twr)

    step = step + 1

    return

  #Move (N-1)th. disk from Left to Center.  Right as temporary tower

  hanois(num_disk-1, from_twr, tmp_twr, to_twr)

  #Move remaining disk from Left to Right

  #print(f"step{step}: No.{num_disk}-disk from {from_twr} to {to_twr}.")

  tv.text += (f"step{step}: No.{num_disk}-disk from {from_twr} to {to_twr}."+"\n")

  moveDisk(num_disk, from_twr, to_twr)

  step = step + 1

  #Move (N-1)th. disk from Center to Right. Left as temporary tower

  hanois(num_disk-1, tmp_twr, to_twr, from_twr)

 

v = ui.load_view()

v.present('sheet')

tv = v['textview1']

d1 = v['button1']

d2 = v['button2']

d3 = v['button3']

d4 = v['button4']

d5 = v['button5']

d6 = v['button6']

d7 = v['button7']

hanois(7, "Left", "Right", "Center")

 

《UI》

f:id:SuzyLW:20200130203523j:plain

参考まで、ボタンの初期座標は、

Disk1:(80,100), Disk2:(70,130), Disk3:(60, 160)。。。Disk7:(20, 280)

大きさは、Disk1が幅60、Disk2が80、と、20ずつ大きくしています。

高さは全て30です。

 

(36)Tower of Hanoi

ハノイの塔を解くプログラムを書いてみました。

ネットで検索してたらすぐに見つかりましたので、それを参考にさせて頂きました。

7段を移動させる場合のプログラムです。

グラフィカルに表示させるのは簡単にできませんでしたので、

取り急ぎ、結果はコンソール表示するものです。

 

import ui

step = 1

def hanois(num_disk, from_twr, to_twr, tmp_twr):
    global step
    #Move disk from 'from_twr' to 'to_twr'.
    if num_disk == 1:
        #if 1disk, move it finished.
        print(f"step{step}: No.{num_disk}-disk from {from_twr} to {to_twr}.")
        step = step + 1
        return
    #Move (N-1)th. disk from Left to Center. Right as temporary tower
    hanois(num_disk-1, from_twr, tmp_twr, to_twr)
    #Move remaining disk from Left to Right
    print(f"step{step}: No.{num_disk}-disk from {from_twr} to {to_twr}.")
    step = step + 1
    #Move (N-1)th. disk from Center to Right. Left as temporary tower
    hanois(num_disk-1, tmp_twr, to_twr, from_twr) 

hanois(7, "Left", "Right", "Center")

v = ui.load_view()
v.present('sheet')

 

実行結果:

結果はコンソールに表示されます。

Ui画像は初期表示するだけで動かす処理は未実装です。

ボタンを配置してそれを動かそうとしていましたが、ちょっと簡単にいきませんでした。

f:id:SuzyLW:20200128232521j:plain

 

(35)日経ソフトウェアプレゼント当選

先日購入の日経ソフトウェアのプレゼント応募をしたのですが、

なんと、当選してしまいました。

本日、ハノイの塔が送られてきました。

f:id:SuzyLW:20200126212628j:plain

7段のハノイの塔です。

実物は初めてみました。こういうパズルがあるんですね。

3段、4段は、なんとなくすぐにできましたが、7段はちょっと面倒で混乱してしまい、

なかなかできませんでした。

こういう時こそ、再帰処理でプログラムを作ってみるべきです。

是非、Pythonで書いてみます。

というか、この手のプログラムはネット上に転がっていると思うので、

そちらを参考にプログラムしてみます。

できれば、ディスクを動かす様子も画面に表示させながら実行できるといいのですが、

簡単にやれそうだったらトライしてみます。

 

 

(26)腰はほぼ完治

腰が痛くなって約2週間になりますが、昨日、今日までで、ほぼ9割完治、

という状況です。

やはり、歩くのが良かったようです。

それと、先日から続けている簡単なストレッチも効いているかもしれません。

ここのところ、4日続けて5km以上歩っています。

歩数にして4万歩近く歩きました。

ただ、長時間同じ姿勢でいると、その直後は立ち上がるのがちょっと辛いことがあり、

今は、なるべく長時間同じ姿勢をしないように気を付けています。

ストレッチは、就寝前に下記の3つをしています。

(1)仰向けに寝て、膝を立てた状態で、ヘソを覗き込むように首を上げる、というのを20回を5セット。ー腹筋ー

(2)仰向けに寝て、膝を立てた状態から、腰だけを上に10秒間上げて下ろす、というのを5セット。ー背筋ー

(3)仰向けに寝て、膝を立てた状態から、膝を抱えるように腰を曲げ、その状態で首を上げ下げするのを50回。ー腹筋、腰伸ばしー

明後日は、今年初めてのコンペです。

明日は、前日練習をしてきます。腰を労わりながら。。。

初ラウンドで90切りが目標です。。。。。

 

(25)腰は大丈夫そう

14日のゴルフスクールで160球ぐらい打ちましたが、

それで悪化はしませんでした。

その前日から、簡単な腹筋、背筋の運動を始めました。

また三日坊主になりそうですが、今回はなんとか続けていこうと思います。

昨日は近くの温泉へ一泊してきました。

岩盤浴もやったり、腰をいたわってきました。

ヌルヌルする感じの良い温泉でした。また行ってみたいです。

何が一番効果があったのかは良くわかりませんが、今はかなり良くなりました。

八割ぐらいは元に戻った感じです。

一週間前はどうなるかと思っていましたが、このぐらいで回復方向になってきて

少し安心しています。

これなら来週のコンペは大丈夫そうです。

なんとかベストスコアを出したいと思います。