PK  互動藝術 練習作業

今日練習: (練習加入密技) (一)先確定程式碼可以執行。 (二)加入顯示你的學號姓名, 執行起來, 先抓一張圖片繳交。 (三)找一位同學來幫忙玩兩人對戰, 盡力玩大約一分鐘, 抓第2張圖片繳交。 (四)修改程式碼加入合理的密技, 要在簽到區繳交時簡單說明這密技。 (五)再找同學玩大約一分鐘, 抓第3張圖片繳交。 (六)把程式碼處理密技的片段複製貼入你今天簽到文章該密技說明之後繳交。 提醒: * Processing 其實就是 Java 的簡化版本 * C# 其實就是微軟公司的 Java * JavaScript 其實不是 Java, 它原名是 LiveScript, 後來改名並使用 Java 的函數庫(Library)
複習 : 虛擬亂數產生器(PRNG; Pseudo Random Number Generator)
亂數(Random number)很有用,特別是設計遊戲時,
我們經常會需要使用到亂數決定一些事情: (1)命運 還是 機會 ? (2)何時何地要出現大力丸、大力丸的有效時間? (3)何時該出現精靈、怪物、牠們的魔法強度 ? (通常其魔法種類不用亂數決定) (4)何時該出現陷阱 ? (5)甚至一拳打下去(攻擊)的效果也可用亂數決定一個範圍(數值) ! 各種程式語言中都有提供 PRNG 函數(亂數產生器函數); PRNG = Pseudo Random Number Generator (請注意 Pseudo 的 P 不發音)

  (1)關於 processing 亂數的 processing 程式,  
     ** 要生出一個整數亂數,  可以這樣寫:
         int gg = (int)random(101);  // 0 .. 100 
         int yy = (int)random(1, 7);  // 1 .. 6   注意不是 7 喔 
		 
     ** 要生出一個實數(float)亂數:
         float abc = random(101);  // 0 .. 100.99999999999 

  (2)電腦語言提供的亂數產生器(函數)稱 PRNG (Pseudo Random Number Generator), 因為其實是亂中有序!
     Pseudo 意思是假的, 再說一次, 這裡 P 不發音喔 !
     如果希望每次執行的亂數序列相同, 這樣寫:
         randomSeed( mySeed );     //   這裡 mySeed 是你希望的亂數種子, 例如 0 或 38  
     如果要真的亂, 可在程式碼一開始抓時間來當亂數種子:
        randomSeed(  System.currentTimeMillis()    ); 
    通常遊戲用的亂數(Random number)屬於均勻分布(Uniform distribution;齊一分布)的亂數,
意思是每個亂數出現的機會是一樣的。
    但是,如果亂數是用在遊戲以外的其他領域,則通常不是用這種機會均等的齊一分布的亂數!!
另一種最常見的亂數是常態分布(Normal distribution; 鐘形分布):
 例如,你會聽到說大考中心公布平均 70分, 標準差 8, 
 這意味著 70-16 ~ 70+16 之間的有 95%;
         70-8  ~ 70+8  之前的大約有 68%
如果要模擬人的身高、體重等, 也要使用常態分布的亂數才正確。
  (關於常態分佈可以用 Google  查詢  68 95 99 看看)

烏龜走路也能創作藝術 :-)



// 烏龜走路畫圖 V.1  Turtle Graphics v.1
float turtleX,   turtleY;   // 烏龜所在位置 
float turtleHeading = 0;   // 烏龜前進方向
float yy = 13;   // 邊長, 不一定使用這
int howMany = 1;   //  每進入 draw( ) 幾次要暫停 ? 
void tReset( ) {  tut( width/2,  height/2);  turtleHeading = 0;
}  // tReset( 
void tut(float x, float y) {  turtleX =  x;  turtleY = y;
} // tut(

void setup() {
  size(555, 555);  
  background(0);       
  test( );   
  fill(255, 0, 0); textFont(f, 24); text("敲 c  或 3  或 m ", 12, 38);  
  tReset( );    // Reset 重設烏龜頭部位置方向
  // frameRate(3);   // 每秒進入 draw( ) { }  三次 
}  //  setup(  

int many = howMany;
int come = 0;   //  第幾次進入 draw( ) { }  
void draw() {
  come++;
  if(come == 1){ noLoop( ); return;  }    // 第一次
  if(come == 2)background(0);      // 第 2 次故意清除螢幕
  
  stroke(random(66,256), random(66,256), random(66,256));   //  筆觸顏色     

  yy =  5 + (yy+3) % 123;    //  5 .. 127  也就是  [5, 128)   
  right(270);
  square( random(8,128) );    //  yy   //  88  //  random(8,128)  
  // poly( random(8,128), 4);    //  yy   //  88  //  random(8,128) 
  fill(255, 0, 0); textFont(f, 24); text("敲 c  或 3  或 m ", 12, width-8);  
  drawMyName( );  
  if(--many == 0) noLoop( );
} // draw(  

void keyPressed( ) {
  if(keyCode == 'S') noLoop( );  // 停止 draw( )
  if(keyCode == 'R') right( 15 );  // 右轉 15度 
  if(keyCode == 'C') { many = howMany; loop( ); }  // 繼續 draw( );
  if(keyCode == '3') { many = 3; loop( ); }
  if(keyCode == '5') { many = 5; loop( ); }
  if(keyCode == '9') { many = 9; loop( ); }
  if(keyCode == 'N') { many = 30; loop( ); }
  if(keyCode == 'M') { many = 300; loop( ); }
  if(keyCode == 'Z') { background(0); many = 1; loop( ); }
} // keyPressed( 
//////////////////////////////////////////////////////
void square(float len) {
  forward(len);
  for(int k = 0; k < 3; ++k) {
    rotateTurtle(90);
    forward(len);
  } // for( k
  right(90);
}
void triAngle(float len) {
  fwd(len);
  for(int k = 0; k < 2; ++k) {
    right(120);
    fwd(len);
  } // for( k
  right(120);
} 
void pentagon(float len) {
   poly(len, 5);
}
void hexagon(float len) {
   poly(len, 6);
}  //////  
void poly(float len, int  nSide){
  float ang  =   (360+0.0)/ nSide;
  for(int i = 0; i < nSide; ++i){
     fwd(len);  right(ang);
  } // for(i
} // poly( 
/////////////////////////////// 
void fwd(float gg) { forward(gg); } 
void forward(float amount) {  
  float newX = turtleX + cos(radians(turtleHeading)) * amount;
  float newY = turtleY + sin(radians(turtleHeading)) * amount;
  line(turtleX, turtleY, newX, newY);
  fill(0); 
  turtleX = newX;
  turtleY = newY;
} 
void right(float dd) { rotateTurtle(dd); }
void left(float dd) { rotateTurtle( 360 - dd ); } 
void rotateTurtle(float degrees) {
  turtleHeading += degrees;
  if(turtleHeading > 360 ) turtleHeading -= 360;
  println("Turtle Angle = " + turtleHeading);
  println("敲 c  或 3  或 m ");
}

PFont f = createFont("標楷體", 24);
void drawMyName( ) {
    fill(255, 0, 0);
   textFont(f, 38);   // 使用 f,  38點的大小
  text("009008007", 10, 38);
  fill(0, 255, 255);
    text("張大頭", width/2, height-8);
}  // drawMyName(

void test( ) {
  tut( width/5,  height*4/5);  turtleHeading = 0;     //  注意位置故意不同 ! //   tReset( );
  stroke(0, 255, 255);
  for(int i = 0;  i< 30; ++i) {
     fwd(50);  left(123);
  }

  tut( width/5,  height*4/5);  turtleHeading = 0;     //  注意位置
  stroke(0, 255, 0);
  for(int i = 0;  i< 60; ++i) {
     fwd(125);  left(123);
  }

  tut( width/5,  height*4/5);  turtleHeading = 0;     //  注意位置
  stroke(255, 0, 0);
  for(int i = 0;  i< 60; ++i) {
     fwd(250);  left(123);
  }
} // test



 ///
/// 也可測試這 test543( ) 看看會畫出啥藝術圖案 !? /// 請在 setup( ) 內改叫用(call)這個函數( function 函式), 多測試幾次看看圖案會怎樣 ! /// 當然要記得把這個程式碼也放進去喔 ! void test543( ) { int xyz = (int) random(91, 234); // 111 // 99 // (int) random(91, 234) // xyz = 112; // 讓這句有效就變成不是亂數決定 xyz // 96 // 112 // 123 fill(255, 255, 255); text("left( " + xyz+" )" , width-66, 24); tut( width/2-38, height/2+5); turtleHeading = 0; // 注意位置 stroke(0, 255, 255); for(int i = 0; i< 77; ++i) { fwd(75); left(xyz); } fwd(75); tut( width/2-75, height/2+25); turtleHeading = 0; // 注意位置 stroke(0, 255, 0); for(int i = 0; i< 77; ++i) { fwd(150); left(xyz); } fwd(150); tut( width/2-150, height/2+75); turtleHeading = 0; // 注意位置 stroke(255, 0, 0); for(int i = 0; i< 77; ++i) { fwd(300); left(xyz); } fwd(300); tut( width/2-175, height/2+95); turtleHeading = 0; // 注意位置 stroke(255, 255, 0); for(int i = 0; i< 77; ++i) { fwd(350); left(xyz); } fwd(350); // if(38 == 38 )return; // 如果不要畫以下的就讓這句有效( 去掉左邊的 // ) tut( width/2-198, height/2+111); turtleHeading = 0; // 注意位置 stroke(255, 255, 255); for(int i = 0; i< 77; ++i) { fwd(398); left(xyz); } fwd(398); } // test543(
///
 ///
// 烏龜走路畫圖 V.2 Turtle Graphics v.2 -- 簡易版 float turtleX, turtleY; // 烏龜所在位置 float turtleHeading = 0; // 烏龜前進方向 float yy = 13; // 邊長, 不一定使用這 int howMany = 1; // 每進入 draw( ) 幾次要暫停 ? int nEdge = 4; // 4 邊 // 3 // 4 // // 5 // 6 // 100 // random(3, 100) float deg = 270 + 45; // left(deg); 左轉 deg 度 void tut(float x, float y) { turtleX = x; turtleY = y; } // tut( void setup() { size(555, 555); background(0); test222( ); // frameRate(3); // 每秒進入 draw( ) { } 三次 textFont(f, 24); fill(255, 0, 0); text("敲 z 清除重來, 敲 c 畫一次, 敲 m 畫 300次", 12, 55); drawMyName( ); tut( width/2, height/2); turtleHeading = 0; // 烏龜頭拉回原位準備給 draw( ) { } 用 } // setup( void test222( ) { background(0); tut(width/2, height/2); turtleHeading = 0; fill(255, 255, 255); text("test222" , width-66, 24); int side = 100; // 100 // 33 stroke( 255, 255, 0); int nnn= 60; // 60 // 20 // repeat how many times float rdeg = 360.0 / nnn; // repeat nnn for(int i=0; i< nnn; ++i) { for(int k=0; k < 100; ++k) { fwd(600.0/side); // 6 right(360.0/side); } // for k right(rdeg * 3.3); // 右轉 rdeg // * 1.0 // * 13.3 } // for(i } // test222( int many = howMany; int come = 0; // 第幾次進入 draw( ) { } void draw() { come++; if(come == 1){ noLoop( ); return; } // 第一次 if(come == 2)background(0); // 第 2 次故意清除螢幕 stroke(random(66,256), random(66,256), random(66,256)); // 筆觸顏色 yy = 5 + (yy+3) % 123; // 5 .. 127 也就是 [5, 128) left(deg); //square( random(8,128) ); // yy // 88 // random(8,128) poly( yy, nEdge); // yy // 88 // random(8,128) textSize(16); fill(255, 255, 255); // 白色 text("" + deg +" : " + nEdge , width-88, 24); // 角度 : 幾邊形 fill(255, 0, 0); textFont(f, 24); text("敲 c 或 3 或 m ", 12, width-8); text("敲 z 清除重畫 ", 12, width-28); drawMyName( ); if(--many == 0) noLoop( ); } // draw( void keyPressed( ) { if(keyCode == 'S') noLoop( ); // 停止 draw( ) if(keyCode == 'R') right( 15 ); // 右轉 15度 if(keyCode == 'C') { many = howMany; loop( ); } // 繼續 draw( ); if(keyCode == '3') { many = 3; loop( ); } if(keyCode == '5') { many = 5; loop( ); } if(keyCode == '9') { many = 9; loop( ); } if(keyCode == 'N') { many = 30; loop( ); } if(keyCode == 'M') { many = 300; loop( ); } if(keyCode == 'Z') { background(0); many = 1; loop( ); } } // keyPressed(
////////////////////////////////////////////////////// ////////////////////////////////////////////////////////
void poly(float len, int nSide){ float ang = (360+0.0)/ nSide; for(int i = 0; i < nSide; ++i){ fwd(len); right(ang); } // for(i } // poly( /////////////////////////////// void fwd(float gg) { forward(gg); } void forward(float amount) { float newX = turtleX + cos(radians(turtleHeading)) * amount; float newY = turtleY + sin(radians(turtleHeading)) * amount; line(turtleX, turtleY, newX, newY); fill(0); turtleX = newX; turtleY = newY; } void right(float dd) { rotateTurtle(dd); } void left(float dd) { rotateTurtle( 360 - dd ); } void rotateTurtle(float degrees) { turtleHeading += degrees; if(turtleHeading > 360 ) turtleHeading -= 360; println("Turtle Angle = " + turtleHeading); } PFont f = createFont("標楷體", 24); void drawMyName( ) { fill(255, 0, 0); textFont(f, 38); // 使用 f, 38點的大小 text("009008007", 10, 38); fill(0, 255, 255); text("張大頭", width/2, height-8); } // drawMyName(
///
 ///
// 烏龜走路畫圖 V.3 Turtle Graphics v.3 -- 更簡易 的 版本 (方便初學者容易研究) float turtleX, turtleY; // 烏龜所在位置 float turtleHeading = 0; // 烏龜前進方向 void test222( ) { int nEdge = 100; // 100 // 33 int nnn= 60; // 60 // 20 // 30 // repeat how many times 重複(Loop)做幾次 float rdegScale = 13.3; // 13.3 // 5 // 3.3 // 3 // 1.3 // 1.0 background(0); turtleHeading = 0; // 烏龜頭部方向的角度 ... // 保險一點囉 ! turtleX = width/2; turtleY = height/2; // 烏龜頭部 所在的位置; 左上角是 (0, 0) fill(255, 255, 255); text("test222 更簡易 的 版本" , width-128, 24); stroke( 255, 255, 0); float rdeg = 360.0 / nnn; // 因 repeat nnn 次, 希望可以繞回一整圈 for(int i=0; i< nnn; ++i) { for(int k=0; k < 100; ++k) { fwd(600.0/nEdge); // 6 點 pixel right(360.0/nEdge); } // for( k right(rdeg * rdegScale); // 右轉 rdeg *1.3 // *3.3 // 3 // 5 // *13.3 } // for(i } // test222( void setup() { size(555, 555); background(0); // 黑色底 test222( ); // frameRate(3); // 每秒進入 draw( ) { } 三次 drawMyName( ); } // setup(
////////////////////////////////////////////////////// ////////////////////////////////////////////////////////
void poly(float len, int nSide){ float ang = (360+0.0)/ nSide; for(int i = 0; i < nSide; ++i){ fwd(len); right(ang); } // for(i } // poly( /////////////////////////////// void fwd(float gg) { forward(gg); } void forward(float amount) { float newX = turtleX + cos(radians(turtleHeading)) * amount; float newY = turtleY + sin(radians(turtleHeading)) * amount; line(turtleX, turtleY, newX, newY); fill(0); turtleX = newX; turtleY = newY; } void right(float dd) { rotateTurtle(dd); } void left(float dd) { rotateTurtle( 360 - dd ); } void rotateTurtle(float degrees) { turtleHeading += degrees; if(turtleHeading > 360 ) turtleHeading -= 360; println("Turtle Angle = " + turtleHeading); } PFont f = createFont("標楷體", 24); void drawMyName( ) { fill(255, 0, 0); textFont(f, 38); // 使用 f, 38點的大小 text("009008007", 10, 38); fill(0, 255, 255); text("張大頭", width/2, height-8); } // drawMyName(
///
 ///
// 烏龜走路畫圖 V.5 Turtle Graphics v.5 -- 滑鼠右鍵清除重畫 ! float turtleX, turtleY; // 烏龜所在位置 float turtleHeading = 0; // 烏龜前進方向 float yy = 13; // 邊長, 不一定使用這 int howMany = 1; // 每進入 draw( ) 幾次要暫停 ? void tReset( ) { tut( width/2, height/2); turtleHeading = 0; } // tReset( void tut(float x, float y) { turtleX = x; turtleY = y; } // tut( void setup() { size(555, 555); tReset( ); background(0); if( random(100) < 30) test( ); else if( random(100) < 50) test222( ); else test543( ); // 亂數決定一個 textFont(f, 24); fill(255, 0, 0); text("敲 z 清除重來, 敲 c 畫一次, 敲 m 畫 300次", 12, 55); text("按滑鼠右鍵看看", 2, 98); // frameRate(33); // 每秒進入 draw( ) { } 次 數 tReset( ); // 重設烏龜位置與方向(角度) } // setup( int many = howMany; int come = 0; // 第幾次進入 draw( ) { } boolean msp = false; // mousePressed ? 按了滑鼠嗎? 準備滑鼠互動用 int deg = 270; // degree 左轉的角度 270 // 271 // 72 // 269 int nEdge = 4; // 四邊形 int inc = 3; // 邊長每次增加 inc void draw() { come++; if(come == 1){ noLoop( ); return; } // 第一次 if(come == 2)background(0); // 第 2 次故意清除螢幕 if(msp){ // 剛壓過滑鼠 msp = false; background(0); } // if(msp stroke(random(66,256), random(66,256), random(66,256)); // 筆觸顏色 yy = 5 + (yy + inc) % 123; // 5 .. 127 也就是 [5, 128) left( deg ); poly( yy, nEdge ); // yy // 88 // random(8,128) //square( yy ); // yy // 88 // random(8,128) drawMyName( ); if(--many == 0) noLoop( ); textFont(f, 16); fill(255, 0, 0); // 紅色 text("" + deg +" : " + nEdge , width-88, 24); // 角度 : 幾邊形 text("敲 2 畫3次, 敲 9 畫 9次", 12, width-8); text("敲 z 清除重來, 敲 c 畫一次, 敲 m 畫 300次", 12, width-38); } // draw( void keyPressed( ) { if(keyCode == 'S') noLoop( ); // 停止 draw( ) if(keyCode == 'R') right( 15 ); // 右轉 15度 if(keyCode == 'C') { many = howMany; loop( ); } // 繼續 draw( ); if(keyCode == '3') { many = 3; loop( ); } if(keyCode == '5') { many = 5; loop( ); } if(keyCode == '9') { many = 9; loop( ); } if(keyCode == 'N') { many = 30; loop( ); } if(keyCode == 'M') { many = 300; loop( ); } if(keyCode == 'Z') { background(0); many = 1; loop( ); } } // keyPressed( ////////////////////////////////////////////////////// void square(float len) { forward(len); for(int k = 0; k < 3; ++k) { rotateTurtle(90); forward(len); } // for( k right(90); } void triAngle(float len) { fwd(len); for(int k = 0; k < 2; ++k) { right(120); fwd(len); } // for( k right(120); } void pentagon(float len) { poly(len, 5); } void hexagon(float len) { poly(len, 6); } ////// void poly(float len, int nSide){ float ang = (360+0.0)/ nSide; for(int i = 0; i < nSide; ++i){ fwd(len); right(ang); } // for(i } // poly( /////////////////////////////// void fwd(float gg) { forward(gg); } void forward(float amount) { float newX = turtleX + cos(radians(turtleHeading)) * amount; float newY = turtleY + sin(radians(turtleHeading)) * amount; line(turtleX, turtleY, newX, newY); fill(0); turtleX = newX; turtleY = newY; } void right(float dd) { rotateTurtle(dd); } void left(float dd) { rotateTurtle( 360 - dd ); } void rotateTurtle(float degrees) { turtleHeading += degrees; if(turtleHeading > 360 ) turtleHeading -= 360; println("Turtle Angle = " + turtleHeading); } PFont f = createFont("標楷體", 24); void drawMyName( ) { fill(255, 0, 0); textFont(f, 38); // 使用 f, 38點的大小 text("009008007", 10, 38); fill(0, 255, 255); text("張大頭", width/2, height-8); } void test( ) { fill(255, 255, 0); text("" + 123 , width-66, 24); tut( width/5, height*4/5); turtleHeading = 0; stroke(0, 255, 255); for(int i = 0; i< 33; ++i) { fwd(75); left(123); } tut( width/5, height*4/5); turtleHeading = 0; stroke(0, 255, 0); for(int i = 0; i< 66; ++i) { fwd(150); left(123); } tut( width/5, height*4/5); turtleHeading = 0; stroke(255, 0, 0); for(int i = 0; i< 77; ++i) { fwd(300); left(123); } tut( width/5, height*4/5); turtleHeading = 0; stroke(255, 255, 0); for(int i = 0; i< 88; ++i) { fwd(500); left(123); } } // test /////// ///////// void test222( ) { background(0); tut(width/2, height/2); fill(255, 255, 255); text("test222" , width-66, 24); int side = 100; // 100 // 33 stroke( 255, 255, 0); int nnn= 30; // 60 // 20 // repeat how many times float rdeg = 360.0 / nnn; // repeat nnn for(int i=0; i< nnn; ++i) { for(int k=0; k < 100; ++k) { fwd(600.0/side); // 6 right(360.0/side); } right(rdeg); // 右轉 rdeg } // for(i } // test222( ///////////////////////////////////////////////// /// 也測試這 test543( ) 看看會畫出啥藝術圖案 !? void test543( ) { int xyz = (int) random(91, 234); // 111 // 98 // 99 // (int) random(91, 234) fill(255, 255, 255); text("" + xyz , width-66, 24); tut( width/2-38, height/2+1); turtleHeading = 0; stroke(0, 255, 255); for(int i = 0; i< 77; ++i) { fwd(75); left(xyz); } fwd(75); tut( width/2-75, height/2+25); turtleHeading = 0; stroke(0, 255, 0); for(int i = 0; i< 77; ++i) { fwd(150); left(xyz); } fwd(150); tut( width/2-150, height/2+75); turtleHeading = 0; stroke(255, 0, 0); for(int i = 0; i< 77; ++i) { fwd(300); left(xyz); } fwd(300); tut( width/2-175, height/2+95); turtleHeading = 0; stroke(255, 255, 0); for(int i = 0; i< 77; ++i) { fwd(350); left(xyz); } fwd(350); // if(00 == 00 )return; tut( width/2-198, height/2+111); turtleHeading = 0; stroke(255, 255, 255); for(int i = 0; i< 77; ++i) { fwd(398); left(xyz); } fwd(398); } // test543( ////////////////////////////////
 /// 加入以下片段程式碼然後按滑鼠右鍵 看看會怎樣? 
int ccc = 0; // 前面幾次故意手動設定 void mouseReleased( ) { if(mouseButton != LEFT) { if(mouseButton == RIGHT) msp = true; // 滑鼠右鍵要清除畫面 deg = (int) random(15, 333); nEdge = (int) random(3, 18); ++ccc; if(ccc == 1) { deg = 216; nEdge = 9; } // 290, 6 // 216, 9 if(ccc == 2) { deg = 240; nEdge = 13; } if(ccc == 3) { deg = 313; nEdge = 10; } if(ccc == 5) { deg = 270; nEdge = 13; } if(ccc == 6) { deg = 270+45; nEdge = 13; } if(ccc == 8) { deg = 180; nEdge = 13; } if(ccc == 11) { deg = 60; nEdge = 13; } // 30, 6 if(ccc == 10) { deg = 90; nEdge = 13; } if(ccc == 9) { deg = 120; nEdge = 13; } if(ccc == 15) { deg = 324; nEdge = 4; } if(ccc == 16) { deg = 313; nEdge = 7; } if(ccc == 18) { deg = 290; nEdge = 3; } if(ccc == 18) { deg = 120; nEdge = 16; } // 120, 16 // 202, 4 many = 333; if(ccc < 5) many=666; loop( ); } // if( 放掉滑鼠 } // mouseReleased(

 ///
// 烏龜走路畫圖 V.6 Turtle Graphics v.6 -- PK 對戰 ! int nnnOrig = 12; int mySeed = 3388; // 亂數種子 int nnn = nnnOrig; float turtleX, turtleY; // 烏龜所在位置 float turtleHeading = 0; // 烏龜前進方向 float yy = 13; // 邊長, 不一定使用這 int howMany = 1; // 每進入 draw( ) 幾次要暫停 ? void tReset( ) { tut( width/2, height/2); turtleHeading = 0; } // tReset( void tut(float x, float y) { turtleX = x; turtleY = y; } // tut( void setup() { size(555, 555); tReset( ); background(0); textFont(f, 24); fill(255, 0, 0); text("敲 z 清除重來, 敲 c 畫一次, 敲 m 畫 300次", 12, 55); text("按滑鼠右鍵看看", 2, 98); yy = 13; tReset( ); // 重設烏龜位置與方向(角度) randomSeed( mySeed ); nnn = nnnOrig; frameRate(158); // try my Best } // setup( int many = howMany; int come = 0; // 第幾次進入 draw( ) { } boolean msp = false; // mousePressed ? 按了滑鼠嗎? 準備滑鼠互動用 int deg = 270; // degree 左轉的角度 270 // 271 // 72 // 269 int nEdge = 4; // 四邊形 int inc = 3; // 邊長每次增加 inc void draw() { come++; if(come == 1)background(0); // 第 1 次故意清除螢幕 if(msp){ // 剛壓過滑鼠 msp = false; yy=13; tReset( ); // 重設烏龜位置與方向(角度) randomSeed( mySeed ); background(0); nnn = nnnOrig; } // if(msp for(int i=0; i < nnn; ++i) { stroke(random(66,256), random(66,256), random(66,256)); // 筆觸顏色 yy = 5 + (yy + inc) % 123; // 5 .. 127 也就是 [5, 128) left( deg ); poly( yy, nEdge ); // yy // 88 // random(8,128) //square( yy ); // yy // 88 // random(8,128) } // for(i < nnn drawMyName( ); if(--many == 0) noLoop( ); textFont(f, 16); fill(255, 0, 0); // 紅色 text("" + deg +" : " + nEdge , width-88, 24); // 角度 : 幾邊形 text("敲 2 畫3次, 敲 9 畫 9次", 12, width-8); text("敲 z 清除重來, 敲 c 畫一次, 敲 m 畫 300次", 12, width-38); } // draw( void keyPressed( ) { if(keyCode == 'S') noLoop( ); // 停止 draw( ) if(keyCode == 'C') { many = howMany; loop( ); } // 繼續 draw( ); if(keyCode == 'M') { many = 300; loop( ); } if(keyCode == 'Z') { background(0); many = 1; msp = true; loop( ); } if(keyCode == UP) { nnn++; many=1; background(0); loop( ); } // UP if(keyCode == 'W') { if(nnn > 5) --nnn; many=1; background(0); loop( ); } // W } // keyPressed( ////////////////////////////////////////////////////// void square(float len) { forward(len); for(int k = 0; k < 3; ++k) { rotateTurtle(90); forward(len); } // for( k right(90); } void triAngle(float len) { fwd(len); for(int k = 0; k < 2; ++k) { right(120); fwd(len); } // for( k right(120); } void pentagon(float len) { poly(len, 5); } void hexagon(float len) { poly(len, 6); } ////// void poly(float len, int nSide){ float ang = (360+0.0)/ nSide; for(int i = 0; i < nSide; ++i){ fwd(len); right(ang); } // for(i } // poly( /////////////////////////////// void fwd(float gg) { forward(gg); } void forward(float amount) { float newX = turtleX + cos(radians(turtleHeading)) * amount; float newY = turtleY + sin(radians(turtleHeading)) * amount; line(turtleX, turtleY, newX, newY); fill(0); turtleX = newX; turtleY = newY; } void right(float dd) { rotateTurtle(dd); } void left(float dd) { rotateTurtle( 360 - dd ); } void rotateTurtle(float degrees) { turtleHeading += degrees; if(turtleHeading > 360 ) turtleHeading -= 360; println("Turtle Angle = " + turtleHeading); } PFont f = createFont("標楷體", 24); void drawMyName( ) { fill(255, 0, 0); textFont(f, 38); // 使用 f, 38點的大小 text("009008007", 10, 38); fill(0, 255, 255); text("張大頭", width/2, height-8); } void test( ) { fill(255, 255, 0); text("" + 123 , width-66, 24); tut( width/5, height*4/5); turtleHeading = 0; stroke(0, 255, 255); for(int i = 0; i< 33; ++i) { fwd(75); left(123); } tut( width/5, height*4/5); turtleHeading = 0; stroke(0, 255, 0); for(int i = 0; i< 66; ++i) { fwd(150); left(123); } tut( width/5, height*4/5); turtleHeading = 0; stroke(255, 0, 0); for(int i = 0; i< 77; ++i) { fwd(300); left(123); } tut( width/5, height*4/5); turtleHeading = 0; stroke(255, 255, 0); for(int i = 0; i< 88; ++i) { fwd(500); left(123); } } // test /////// ///////// void test222( ) { background(0); tut(width/2, height/2); fill(255, 255, 255); text("test222" , width-66, 24); int side = 100; // 100 // 33 stroke( 255, 255, 0); int nnn= 30; // 60 // 20 // repeat how many times float rdeg = 360.0 / nnn; // repeat nnn for(int i=0; i< nnn; ++i) { for(int k=0; k < 100; ++k) { fwd(600.0/side); // 6 right(360.0/side); } right(rdeg); // 右轉 rdeg } // for(i } // test222( ///////////////////////////////////////////////// /// 也測試這 test543( ) 看看會畫出啥藝術圖案 !? void test543( ) { int xyz = (int) random(91, 234); // 111 // 98 // 99 // (int) random(91, 234) fill(255, 255, 255); text("" + xyz , width-66, 24); tut( width/2-38, height/2+1); turtleHeading = 0; stroke(0, 255, 255); for(int i = 0; i< 77; ++i) { fwd(75); left(xyz); } fwd(75); tut( width/2-75, height/2+25); turtleHeading = 0; stroke(0, 255, 0); for(int i = 0; i< 77; ++i) { fwd(150); left(xyz); } fwd(150); tut( width/2-150, height/2+75); turtleHeading = 0; stroke(255, 0, 0); for(int i = 0; i< 77; ++i) { fwd(300); left(xyz); } fwd(300); tut( width/2-175, height/2+95); turtleHeading = 0; stroke(255, 255, 0); for(int i = 0; i< 77; ++i) { fwd(350); left(xyz); } fwd(350); // if(00 == 00 )return; tut( width/2-198, height/2+111); turtleHeading = 0; stroke(255, 255, 255); for(int i = 0; i< 77; ++i) { fwd(398); left(xyz); } fwd(398); } // test543( //////////////////////////////// /// 加入以下片段程式碼然後按滑鼠右鍵 看看會怎樣?
int ccc = 0; // 前面幾次故意手動設定 void mouseReleased( ) { if(mouseButton != LEFT) { if(mouseButton == RIGHT) msp = true; // 滑鼠右鍵要清除畫面 deg = (int) random(15, 333); nEdge = (int) random(3, 18); ++ccc; if(ccc == 1) { deg = 216; nEdge = 9; } // 290, 6 // 216, 9 if(ccc == 2) { deg = 240; nEdge = 13; } if(ccc == 3) { deg = 313; nEdge = 10; } if(ccc == 5) { deg = 270; nEdge = 13; } if(ccc == 6) { deg = 270+45; nEdge = 13; } if(ccc == 8) { deg = 180; nEdge = 13; } if(ccc == 11) { deg = 60; nEdge = 13; } // 30, 6 if(ccc == 10) { deg = 90; nEdge = 13; } if(ccc == 9) { deg = 120; nEdge = 13; } if(ccc == 15) { deg = 324; nEdge = 4; } if(ccc == 16) { deg = 313; nEdge = 7; } if(ccc == 18) { deg = 290; nEdge = 3; } if(ccc == 18) { deg = 120; nEdge = 16; } // 120, 16 // 202, 4 many = 1; if(ccc < 5) many= 1; loop( ); } // if( 放掉滑鼠 } // mouseReleased(
///
Hint: 用 text( ) 畫出學號姓名時通常要先建立 PFont 字型(我通常用 f 代表), 如果發現電腦說以下這句有錯:
PFont f = createFont("SimSun", 18);  // 仿宋體;

很簡單, 把該句拆成了兩句: PFont f; // 這句是宣告 f 是 PFont 字型, 放到整個程式很前面 /// 如果你有用到 import ... (類似 C# 的 using ...), 注意 import 要放更前面 ! /// 所以, 建議就把 PFont f; 放在主要函數 setup( ) { ... } 的前面一句
然後把以下這句放到 setup( ) { .. 函數內, f = createFont("SimSun", 18); // 仿宋體; 就是放在 void setup( ) { 之後, 當然還是要在 setup() { ... 的結束右大括弧 } 之前 !!

/// Sample function   void drawmyName( ) {  }
PFont f = createFont("SimSun", 18);  // 仿宋體;    "標楷體"   "細明體"
void drawMyName( ) {
  fill(22,33,255);   // 藍色
  textFont(f, 28);  text("009008 ", width/6, 32);   // 學號   在大約左上角往右邊一些些         
  fill(255, 33, 22);   // 紅色
  textFont(f, 32);
  text("張大頭",  width - 128, height - 6);   //   "姓名 " 在右下角
}  // drawMyName(


Top