《我的第一本程式設計書》第六章 會動的程式,讓方塊下落

伊徵銀王發表於2020-01-05

第六章 會動的程式,讓方塊下落

1.回顧上一章的繪製牆壁

左右牆壁()
底面牆壁()

左右牆壁() 是
    儲存區[2]->0
    只要 儲存區[2]<20
        儲存區[3]->儲存區[2]
        儲存區[4]->0
        方塊()
        儲存區[3]->儲存區[2]
        儲存區[4]->11
        方塊()
        儲存區[2]->儲存區[2]+1

底面牆壁() 是
    儲存區[2]->0
    只要 儲存區[2]<10
        儲存區[3]->19
        儲存區[4]->1+儲存區[2]
        方塊()
        儲存區[2]->儲存區[2]+1

方塊() 是
    儲存區[1]->0
    只要 儲存區[1]<4
        儲存區[0]->0
        只要 儲存區[0]<4
            儲存區[60000+儲存區[0]+(儲存區[1]*100)+(儲存區[3]*500)+(儲存區[4]*5)]->999999
            儲存區[0]->儲存區[0]+1
        儲存區[1]->儲存區[1]+1

2.重新編寫嘗試讓方塊下落。
(因為單獨出來進行嘗試,可以減少程式碼量,以免混亂。)

1)首先採用最機器的寫法

儲存區[60000]->999999
儲存區[60000]->0
儲存區[60100]->999999
儲存區[60100]->0
儲存區[60200]->999999
儲存區[60200]->0
儲存區[60300]->999999
儲存區[60300]->0
儲存區[60400]->999999

2.用迴圈表示

1)分開依次迴圈

儲存區[0]->0
只要 儲存區[0]<100
    儲存區[60000+(儲存區[0]*100)]->999999    #繪製白色(顯示) 繪製方塊()
    儲存區[0]->儲存區[0]+1

儲存區[0]->0
只要 儲存區[0]<100
    儲存區[60000+(儲存區[0]*100)]->0              #繪製黑色(隱藏)消除方塊()
    儲存區[0]->儲存區[0]+1

2)合併 儲存區[0]->0 只要 儲存區[0]<100 儲存區[60000+(儲存區[0]*100)]->999999 #繪製白色(顯示) 繪製方塊() 儲存區[60000+(儲存區[0]*100)]->0 #繪製黑色(隱藏)消除方塊() 儲存區[0]->儲存區[0]+1

3)用區域性程式(函式)表示 儲存區[0]->0 只要 儲存區[0]<100 繪製方塊() #繪製白色(顯示) 消除方塊() #繪製黑色(隱藏) 儲存區[0]->儲存區[0]+1

繪製方塊() 是
    儲存區[60000+(儲存區[0]*100)]->999999 
消除方塊() 是
    儲存區[60000+(儲存區[0]*100)]->0

3.加入4*4方塊再用區域性程式(函式)表示

1)程式碼如下: 儲存區[2]->0 #這裡的儲存區裡的數值不能與下面的發生衝突 只要 儲存區[2]<20 #這裡之所以迴圈20而不是100,是因為螢幕總共就100個畫素,所以超出會引發錯誤。 儲存區[3]->儲存區[2] #表示縱向的標號,因為向下移動,所以需要一個變換的值 儲存區[4]->0 #表示橫向的標號,由於暫時不考慮橫向移動,所以用0代替。 繪製方塊() 消除方塊() 儲存區[2]->儲存區[2]+1

繪製方塊() 是
    儲存區[1]->0
    只要 儲存區[1]<4
        儲存區[0]->0
        只要 儲存區[0]<4
            儲存區[60000+儲存區[0]+(儲存區[1]*100)+(儲存區[3]*500)+(儲存區[4]*5)]->999999
            儲存區[0]->儲存區[0]+1
        儲存區[1]->儲存區[1]+1

消除方塊() 是
    儲存區[1]->0
    只要 儲存區[1]<4
        儲存區[0]->0
        只要 儲存區[0]<4
            儲存區[60000+儲存區[0]+(儲存區[1]*100)+(儲存區[3]*500)+(儲存區[4]*5)]->0
            儲存區[0]->儲存區[0]+1
        儲存區[1]->儲存區[1]+1

2)優化
(由於繪製方塊和消除方塊,就只有“999999”和“0”不同,所以只要新的“儲存區[5]”(變數)代替,就能節省一定的程式碼量)

儲存區[2]->0
只要 儲存區[2]<20
    儲存區[3]->儲存區[2]
    儲存區[4]->0
    儲存區[5]->999999        #繪製白色方塊(也就是顯示方塊)顏色編碼:999999
    方塊()
    儲存區[5]->0                  #繪製黑色方塊(也就是隱藏方塊)顏色編碼:0
    方塊()
    儲存區[2]->儲存區[2]+1

#函式區
方塊() 是
    儲存區[1]->0
    只要 儲存區[1]<4
        儲存區[0]->0
        只要 儲存區[0]<4
            儲存區[60000+儲存區[0]+(儲存區[1]*100)+(儲存區[3]*500)+(儲存區[4]*5)]->儲存區[5]
            儲存區[0]->儲存區[0]+1
        儲存區[1]->儲存區[1]+1

整體思想:
i。先將4*4方塊部分獨立出來,打包成“方塊()” ii。把裡面的“儲存區[3]”、“儲存區[4]”、“儲存區[5]”分別作為“縱向軸”、“橫向軸”、“顏色編號”提起出來,進行自定義。

(這裡作者解釋了很多,並且還提出了排錯的思想。就是我沒看懂。)

3)再度優化,也是所謂的多層封裝?
(這又是我沒能及時想到的部分!)

儲存區[2]->0
只要 儲存區[2]<20
    儲存區[3]->儲存區[2]
    儲存區[4]->0

    繪製方塊()    #呼叫
    消除方塊()    #呼叫

    儲存區[2]->儲存區[2]+1

#第二層區域性程式
繪製方塊() 是
    儲存區[5]->999999
    方塊()
消除方塊() 是
    儲存區[5]->0
    方塊()

#第一層區域性程式(函式)封裝
方塊() 是
    儲存區[1]->0
    只要 儲存區[1]<4
        儲存區[0]->0
        只要 儲存區[0]<4
            儲存區[60000+儲存區[0]+(儲存區[1]*100)+(儲存區[3]*500)+(儲存區[4]*5)]->儲存區[5]
            儲存區[0]->儲存區[0]+1
        儲存區[1]->儲存區[1]+1

4.讓方塊繪製的更快,“調控功能”

儲存區[55001]->1    #關閉調控

也就是說,之前在繪製時,調控功能是一直開啟的,所以才讓我們能一個畫素一個畫素看到繪製過程。 (至於為何會是這個數,這個樣子?我只能說,規定?)

5.寄信 ,類似製作動漫時的攝影、稍微移動一下、然後拍攝。 (事實上我也沒弄明白這個,只理解成了快速輸出畫面的一種節點?) (或者說是起到了臨時暫停的作用?)

儲存區[55000]->1    #哪裡需要有畫面,就放在哪個程式碼塊後面?

總之案例如下:

儲存區[55001]->1    #關閉調控功能(一個開關標記?)
儲存區[2]->0
只要 儲存區[2]<20
    儲存區[3]->儲存區[2]
    儲存區[4]->0
    儲存區[5]->999999
    方塊()
    儲存區[55000]->1    #這裡是“寄信”,也就是輸出畫面給螢幕!注意是“55000”.
    儲存區[5]->0
    方塊()
    儲存區[2]->儲存區[2]+1

方塊() 是
    儲存區[1]->0
    只要 儲存區[1]<4
        儲存區[0]->0
        只要 儲存區[0]<4
            儲存區[60000+儲存區[0]+(儲存區[1]*100)+(儲存區[3]*500)+(儲存區[4]*5)]->儲存區[5]
            儲存區[0]->儲存區[0]+1
        儲存區[1]->儲存區[1]+1

6.綜合上一章繪製的牆壁

儲存區[55001]->1    #能讓牆壁一瞬間繪製出來
左右牆壁()
底面牆壁()

左右牆壁() 是
    儲存區[2]->0
    只要 儲存區[2]<20
        儲存區[3]->儲存區[2]
        儲存區[4]->0
        儲存區[5]->999999           #因為要共用一個“方塊()”,所以需要追加一個“儲存區[5]”
        方塊()
        儲存區[3]->儲存區[2]
        儲存區[4]->11
        儲存區[5]->999999           #因為要共用一個“方塊()”,所以需要追加一個“儲存區[5]”
        方塊()
        儲存區[2]->儲存區[2]+1

底面牆壁() 是
    儲存區[2]->0
    只要 儲存區[2]<10
        儲存區[3]->19
        儲存區[4]->1+儲存區[2]
        儲存區[5]->999999           #因為要共用一個“方塊()”,所以需要追加一個“儲存區[5]”
        方塊()
        儲存區[2]->儲存區[2]+1


#--------------下落程式碼塊
儲存區[55001]->1    #快速繪製
儲存區[2]->0
只要 儲存區[2]<20
    儲存區[3]->儲存區[2]
    儲存區[4]->0
    繪製方塊()    #呼叫
    儲存區[55000]->1    #給個露臉的機會,否則就被下面的黑色覆蓋了!
    消除方塊()    #呼叫
    儲存區[2]->儲存區[2]+1

#第二層區域性程式
繪製方塊() 是
    儲存區[5]->999999
    方塊()
消除方塊() 是
    儲存區[5]->0
    方塊()

#第一層區域性程式(函式)封裝
方塊() 是
    儲存區[1]->0
    只要 儲存區[1]<4
        儲存區[0]->0
        只要 儲存區[0]<4
            儲存區[60000+儲存區[0]+(儲存區[1]*100)+(儲存區[3]*500)+(儲存區[4]*5)]->儲存區[5]
            儲存區[0]->儲存區[0]+1
        儲存區[1]->儲存區[1]+1

除去共用的“方塊()”,整體上依舊分為兩部分。
一部分是繪製不會動的“牆壁”
一部分是製作向下移動的“方塊”

2)但上述向下落的方塊會覆蓋掉左邊的牆壁,所以需要將向下的方塊移到牆壁的中間區域。
又因為下落到最後會把“底面牆壁”也塗黑掉,所以迴圈會少一個。

#--------------下落程式碼塊
儲存區[55001]->1    #快速繪製
儲存區[2]->0
只要 儲存區[2]<19            ###因為第20個就是底面牆壁了!
    儲存區[3]->儲存區[2]
    儲存區[4]->1                ####“0”是左牆壁,“11”是右牆壁,所以1-10之間是牆壁的內部。
    繪製方塊()    #呼叫
    儲存區[55000]->1    #給個露臉的機會,否則就被下面的黑色覆蓋了!
    消除方塊()    #呼叫
    儲存區[2]->儲存區[2]+1

#第二層區域性程式
繪製方塊() 是
    儲存區[5]->999999
    方塊()
消除方塊() 是
    儲存區[5]->0
    方塊()

#第一層區域性程式(函式)封裝
方塊() 是
    儲存區[1]->0
    只要 儲存區[1]<4
        儲存區[0]->0
        只要 儲存區[0]<4
            儲存區[60000+儲存區[0]+(儲存區[1]*100)+(儲存區[3]*500)+(儲存區[4]*5)]->儲存區[5]
            儲存區[0]->儲存區[0]+1
        儲存區[1]->儲存區[1]+1

最後總結 1.要讓圖形運動,就等於先讓它消失,再在其他地方出現。 (就是製造視覺欺騙,動態錯覺。)

2.要消除圖形,就等於給它塗上背景色。
(也就是沒有所謂的橡皮擦,有的只是與背景色相同的畫筆。)

3.注意不要讓區域性程式內部和外部使用的儲存區編號重複。
(也就是“變數”不能衝突)

4.關閉調控功能的方法和調控功能的原理。寄信速度之慢。
(調控功能是繪製畫面的速度。預設是開著的,所以繪製就是一個畫素一個畫素的往上蹦!)
(寄信,就是在關閉調控功能後,讓某個區域變慢一下的技能?)

相關文章