1. 程式人生 > >1.5 開始第一幅“碼繪”——自定變數與函式,創一招“懵逼表情塗”

1.5 開始第一幅“碼繪”——自定變數與函式,創一招“懵逼表情塗”

引言——想要重複繪製內容應該怎麼辦?

目前我們已經清晰地理解了如何用程式碼繪製1個懵逼臉。

現在升級一點難度,考慮一個問題:

如果要在螢幕上不同位置畫N個懵逼臉,怎麼辦?

若採用之前一樣的方法,我們可以在繪製完一個臉後,用重複的程式碼(不同引數)繪製另一個臉,比如:

 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
// 函式setup() : 準備階段function setup() {	// 建立畫布,寬度640畫素,高度480畫素	// 畫布的座標系統為,左上角座標為(0,0),	// x方向水平向右,y方向垂直向下,單位畫素	createCanvas(640,480);}// 函式draw():作畫階段function draw() {// 畫第一個臉	fill(255);// 填充白色	// 1 畫臉
ellipse(320,240,200,200);// 圓圈 // 2 左眼 ellipse(280,240,50,50);// 另一個圓圈 // 3 右眼 ellipse(360,240,50,50); // 4 嘴巴 ellipse(320,300,80,40); fill(0);// 填充黑色 // 5 左眼珠 ellipse(280,240,20,20); // 6 右眼珠 ellipse(360,240,20,20); // 7 頭髮:從左到右畫一排豎線 line(260,180,260,100); line(280,180,280,100); line(300,180,300,100); line(320,180,320,100); line(340,180,340,100); line(360,180,360,100); line
(380,180,380,100);// 以下為重複程式碼,但引數不同// 畫第二個臉 fill(255);// 填充白色 // 1 畫臉 ellipse(220,240,200,200);// 圓圈 // 2 左眼 ellipse(180,240,50,50);// 另一個圓圈 // 3 右眼 ellipse(260,240,50,50); // 4 嘴巴 ellipse(220,300,80,40); fill(0);// 填充黑色 // 5 左眼珠 ellipse(180,240,20,20); // 6 右眼珠 ellipse(260,240,20,20); // 7 頭髮:從左到右畫一排豎線 line(160,180,160,100); line(180,180,180,100); line(200,180,200,100); line(220,180,220,100); line(240,180,240,100); line(260,180,260,100); line(280,180,280,100);}

這樣就能繪製兩個臉:


但是......我想畫20個臉,咋辦?????

不嫌累的話可以試試寫20遍重複程式碼......,希望不要勾起被老師罰抄課文的苦難記憶......

可見,這個辦法的侷限也是相當明顯的。

用自定義函式實現功能複用

為了解決這個麻煩,我們需要獲得一項新技能:自定義函式

回顧一下1.1節中講到的“函式”,或者說“招數/方法/行為/職能/功能”,只要有了某個函式定義,也就是概括了某種做事的流程,然後在我們想要的地方便可以“呼叫”它,或者說是“施放/執行/行使/發招”。例如,我們可以設想已經定義了一個“DrawConfuseFace”的函式,然後,在draw()函式中就可以直接呼叫這個函式兩次,實現畫兩個懵逼臉。也就是,我們現在期望的draw()函式寫法:

// 函式draw():作畫階段function draw() {	// 在(200,140)位置畫第一個臉	drawConfuseFace(200,140);	// 在(320,280)位置畫第二個臉	drawConfuseFace(320,280);}
這當然是可行的!而且實現後效果如下:


為了實現這個drawConfuseFace函式,我們要依次搞清楚3項技能: 1.自定義函式;2.自定義變數;3.函式引數

自定義函式

在1.1節的講解中,已經瞭解到“函式定義”的基本辦法,也就是現有程式碼中函式setup()和draw()的寫法即函式定義。

那麼,我們仿照draw()函式的寫法,在其後新寫一個函式,並在draw()函式中直接呼叫它20遍!希望能畫出20個懵逼臉。

程式碼如下:

// 函式setup() : 準備階段function setup() {	// 建立畫布,寬度640畫素,高度480畫素	// 畫布的座標系統為,左上角座標為(0,0),	// x方向水平向右,y方向垂直向下,單位畫素	createCanvas(640,480);}// 函式draw():作畫階段function draw() {	// 呼叫20遍,希望能畫20個臉	drawConfuseFace();	drawConfuseFace();	drawConfuseFace();	drawConfuseFace();	drawConfuseFace();	drawConfuseFace();	drawConfuseFace();	drawConfuseFace();	drawConfuseFace();	drawConfuseFace();	drawConfuseFace();	drawConfuseFace();	drawConfuseFace();	drawConfuseFace();	drawConfuseFace();	drawConfuseFace();	drawConfuseFace();	drawConfuseFace();	drawConfuseFace();	drawConfuseFace();}// 自定函式:畫懵逼臉function drawConfuseFace() {	fill(255);// 填充白色	// 1 畫臉	ellipse(320,240,200,200);// 圓圈	// 2 左眼	ellipse(280,240,50,50);// 另一個圓圈	// 3 右眼	ellipse(360,240,50,50); 	// 4 嘴巴	ellipse(320,300,80,40);	fill(0);// 填充黑色		// 5 左眼珠	ellipse(280,240,20,20);	// 6 右眼珠	ellipse(360,240,20,20);	// 7 頭髮:從左到右畫一排豎線	line(260,180,260,100);	line(280,180,280,100);	line(300,180,300,100);	line(320,180,320,100);	line(340,180,340,100);	line(360,180,360,100);	line(380,180,380,100);}
然而,卻只能畫出來1個臉:
這是為啥?原來,我們雖然施放了20次drawConfuseFace(),但由於每一次施放中,drawConfuseFace()函式的執行過程用到的引數完全一樣,因此,上述程式碼相當於在相同位置重複畫了20次,每一次繪製都覆蓋掉前一次繪製的結果,那麼最終也只能看到1個臉。這並非我們想要的函式形態,我們更希望drawConfuseFace()能夠在不同位置畫臉。於是,drawConfuseFace()函式需要進行改造,讓它能夠在釋放時輸入引數,並且根據引數的具體數值來發揮不同的效果,例如,我們希望施放該函式時可以用以下形態:drawConfuseFace(100,200); //在(100,200)位置畫懵逼臉drawConfuseFace(300,50); // 在(300,50)位置畫懵逼臉......為了實現它,還需要對變數的認識更進一步,即學會“自定義變數”。

自定義變數

在之前實現的用滑鼠控制位置的程式碼中,我們用到了兩個變數mouseX和mouseY,它們是p5.js提供的可以在任意時刻任意位置直接訪問的變數。為了更加靈活地指定位置,我們可以用自定義變數。

下列程式碼示例了在程式中自定義變數:

varA,a;// 定義兩個變數 A和a, 特別注意,大小寫不同的名稱對應不同變數!var B = 1; // 定義變數B,賦值1var Haha = 100; // 定義變數Haha, 賦值100;var Jam = B; // 定義變數Jam, 用變數B的值為其賦值;

在定義了上述變數後,便可以在需要的時候使用它們,就如同使用變數mouseX和mouseY一般,例如:

ellipse(B,Haha,100,100); // 在位置(B,Haha)繪製長寬為100的圓形line(Jam,Haha,Haha,B); // 從(Jam,Haha)到(Haha,B)繪製一條線段
此外,在變數定義中,用到了賦值符"=",要注意,它的作用有點像是“等於”,但其實應該理解為“賦值”,其目的是將右邊的表示式的計算結果賦予左邊的變數,下面列出一些用法示例: var A = 1; // 定義變數A並賦值1 var B = 2; // 定義變數B並賦值2 var C = A + 10;// 定義變數C, 計算表示式A+10的值,然後賦值給C var D = B - 5; // 定義變數D, 計算表示式B-5的值,然後賦值給D var E = A + B; // 定義變數E, 計算表示式A+B的值,然後賦值給E

掌握了自定義變數,我們對原來的程式碼進行改造。原始程式碼為:

  1
  2
  3
  4
  5
  6
  7
  8
  9

            
           

相關推薦

1.5 開始第一”——變數函式表情

引言——想要重複繪製內容應該怎麼辦? 目前我們已經清晰地理解了如何用程式碼繪製1個懵逼臉。 現在升級一點難度,考慮一個問題: 如果要在螢幕上不同位置畫N個懵逼臉,怎麼辦? 若採用之前一樣的方

1.4 開始第一”——活用變數和常量實現滑鼠互動

引言——如何在程式中改變繪製內容 回顧之前畫懵逼臉的程式碼,可以看出,每個語句中都是直接用數值精確指定橢圓/直線/色彩: 1 2 3 4 5 6 7 8 9 10

1.9 開始第一”——掌握大殺器”迴圈“百千萬個

引言:重複與美 這一節裡,我們將要學到一項強大的技能——迴圈。 有了迴圈,我們就能夠指揮計算機幫我們去做大量重複性的事情。 直覺上,提到“重複”,往往聯想到枯燥乏味。的確,從操作而言,重複

1.7 開始第一”——用時間控制變數臉動起來

引言——碼繪的缺點和優點 在之前的程式中,所有懵逼臉的表情都是僵住不動的。 如此一來,相比於傳統紙面繪畫,碼繪技術還體現不出什麼優點,可以說還有一系列缺點: 編寫程式碼麻煩容易出現筆誤,學習程式語言

1.2 開始第一”——Javascript、p5.js及HTML5簡介

Javascript、p5.js及HTML5辨析 在正式學習前,還有必要對我們要用到的幾個玩意進行理解和辨析,它們是 Javascript(簡稱JS), HTML5(簡稱H5), P5.js (簡稱

1.3 開始第一”——開始使用p5.js畫一個

下載P5.js並寫一段程式 下面我們就開始使用p5.js來畫點東西。 第一步,下載p5.js到本機。 到官網下載頁面(https://p5js.org/download/) ,從”Complete L

1.1 開始第一”——以程式設計作畫的基本方法

引言請看下面兩幅圖,並思考:二者有何聯絡?對於完全沒有接觸過程式設計的小朋友來說,估計現在表情和圖中人物一樣。就通常而言,程式設計和繪畫可謂風馬牛不相及。程式設計與繪畫的關聯現在,認真地對照下圖中左

以最少的代的model實現NSCoding、NSCopying協議

key bject 根據 方法 conf imp oid 自定義 code 項目中用到了自定義的model:Person(栗子)。此model需要可以實現歸檔的功能,但是屬性非常多,且類似的model很多。如果按照常規去寫歸檔的代碼,那麽無論是寫起來還是維護起來都非常困難。

1分鐘鏈圈|以太坊向以太坊經典捐贈1.5萬枚ETC;STO是新瓶裝舊酒並未有實質性突破...

hi,艾瑞巴蒂! 這裡是10月31日的每日1句話新聞晚報,只需1分鐘,看遍全球最熱、最新的區塊鏈新聞。 實時幣價:BTC $6337.14   ETH $197.35   EOS $5.12 (

[Google Guava] 1.5-Throwables:簡化異常和錯誤的傳播檢查

原文連結 譯者: 沈義揚 異常傳播 有時候,你會想把捕獲到的異常再次丟擲。這種情況通常發生在Error或RuntimeException被捕獲的時候,你沒想捕獲它們,但是宣告捕獲Throwable和Exception的時候,也包括了了Error或RuntimeException。Guava提供

Spark 1.5.2(Scala 2.11)版本的編譯安裝

Spark於11月9號又將幾個BUG解決之後,release一個較新的版本。作為spark的追隨者,於是開始重新進行spark的編譯。 有了前面的編譯經驗和之前下載好的java類包,花了大概一分鐘就編譯妥當,於是重新部署配置一下,馬上OK。簡直是高效率。 對於scala

鳳凰大廳源制作聽說最近知識變現測程序員的知識廣度?

jsp 原因 動態 人月 後臺 遞歸 算法思想 分治 線程 1鳳凰大廳源碼制作(h5.hxforum.com)企鵝2952777280(http://yhgj8004.com)源碼出售 房卡出售 後臺制作聯系方式只有企鵝以下詩句所表達的意境,與程序員的生活最不相關的一項是

騰訊面試面試官第一個問題是Int佔多少位元組程式設計師

程式設計師面試什麼最重要? 程式設計師面試一直是社群樂於討論的熱門話題。有人面試題是有關“目標”,有的關於“方法”,有的關於“演算法”,有的關於“基礎”。曾經以為基礎面試十分重要,但是現在不這麼看了。在工作中基礎的確是重要的,但是在面試過程中,它必須具有區分性才有意義。 但近日,一位程

python學習入門番外1 變數物件函式傳值問題 2018.8.18

在函式傳值的問題中,多有對函式傳值是按值傳遞還是按引用傳遞引數的討論,這些都源於C系語言。 但事實上,python中並不適用。 預設情況下,在C語言中,引數是按照值來傳遞的,這需要生成函式的傳入引數的一個副本以供使用,這時你不能修改傳入引數的初始內容 當使用指標變數(*var)時,將

nginx定義變數內建預定義變數

總覽 nginx可以使用變數簡化配置與提高配置的靈活性,所有的變數值都可以通過這種方式引用: $變數名 而nginx中的變數分為兩種,自定義變數與內建預定義變數 內建變數 宣告 可以在sever,http,location等標籤中使用set命令(非唯一)宣告變數,語

5款用得最爽的黑科技軟體神器款都好用到你無以倫比

閒話少扯,直接切入正題,5款軟體件,值得你高調的收藏的! 1、一粒雲盤軟體 一款專注於企業資料管理的操作軟體,每一個精細的許可權下都是一次小小的改革,主要用於大型企業的資料資產保護,一個規模穩大的企業,資料是不可忽視的,有可能一個小小的資料丟失或者破壞就可能引發企業一次大災難,當然你可以說,

在c語言中定義了一個函式在main中呼叫時提示找不到識別符號

解決方案一: 把定義的函式放在,main函式之前。 void f() { printf("Hello"); } main() { f(); } 解決方案二: 在main函式之前宣告。 void f(); main() { f

協方差函式相關函式協方差矩陣

1.自相關函式(Autocorrelation function) 自相關函式是描述隨機訊號X(t)在任意兩個不同時刻t1,t2,的取值之間的相關程度 2. 自協方差函式(Autocovariance function) 自協方差函式是描述隨機訊號X(t)在任意兩個不同

從壹開始[做貢獻]之二 || 推薦VSCode多語言開發支援鍵JAVA

緣起 哈嘍大家週一好!好久不見鴨,最近在看一本書,很好,《人類簡史》,適合夏日星空,仰觀宇宙之大

轉載----編寫高質量代:改善Java程序的151個建議(第1章:JAVA開發中通用的方法和準則___建議1~5)

ase 重載方法 name 原理 .get tin stat eas 容易 閱讀目錄 建議1:不要在常量和變量中出現易混淆的字母 建議2:莫讓常量蛻變成變量    建議3:三元操作符的類型務必一致   建議4:避免帶有變長參數的方法重載 建議5:別讓null值和空值威