2016年11月10日 星期四

Week 09 ლ(゚д゚ლ) 張書豪 60408029E 大豪豪der上課筆記

2016/11/10 教學軟體設計

本日心得:

今天老師在寫教學白板時,寫下了 檔案讀檔與寫檔、排名與陣列還有資料結構,看到資料結構,說實話我臉都綠了 XDD 因為以前有學過資料結構,我覺得當時的老師讓我有排斥到~ 也許是我自己理解力不足?! QAQ
但是葉老師上課時有說其實沒有想像中的複雜,ㄅ要害怕 >< 
而老師運用接金幣的程式加入了排名的功能,其實以前在開發寫一些小小小der程式時,當初也只是做一個假的排名而已,(反正就寫一個很多玩家遊玩的紀錄,永遠把使用者排在第一位)就是一個很假的排名,滿狂der
但是在今天上完課後,有成功實作出來,覺得成就感大增,原來這就是排行榜R!! 與過去的糞作相比,汗顏 XDD

● 陣列:

在程式語言中,陣列資料結構(英語:array data structure),簡稱陣列(英語:Array)
是一種資料結構,是資料元素(elements)的集合。
它十分類似數學上的「矩陣」,但是在電腦編程語言上,表示方法和意義上略有不同。

雖然陣列在各種電腦編程語言中的表示式略有不同,但是幾乎每一種編程語言都有這種結構和觀念,它已經不只是一種編程專用的術語,而是電腦運作中非常重要的技術和概念。
當前電腦能夠顯示、列印中文字,都是陣列的觀念應用;
字串也是基於數組的一種重要資料結構。資料庫也是陣列概念的一種擴充和延伸。

陣列名作為陣列實體的識別元,具有特殊性,不同於整型、浮點型、指標型或結構類型等變數識別元。
這是因為陣列是一組元素的聚集,不能把一個聚集看作一個值直接讀出(即右值),也不能把一個聚集看作一個位址直接賦值(即左值)。因此,陣列名作為左值、右值,在C語言標準中都有特殊規定:
作為sizeof的運算元,陣列名代表陣列物件本身;
作為取位址運算子&的運算元,陣列名代表陣列物件本身;
作為字串字面量用於初始化一個陣列;
其他情形,運算式中的陣列名從陣列類型被轉化為指向陣列首元素的指標類型運算式(右值)

● 資料結構:

在電腦科學中,資料結構(英語:data structure)是電腦中儲存、組織資料的方式。
資料結構意味著介面或封裝:一個資料結構可被視為兩個函式之間的介面,或者是由資料類型聯合組成的儲存內容的存取方法封裝。
大多數資料結構都由數列、記錄、可辨識聯合、參照等基本類型構成。舉例而言,可為空的參照(nullable reference)是參照與可辨識聯合的結合體,而最簡單的鏈式結構連結串列則是由記錄與可空參照構成。

資料結構可透過程式語言所提供的資料類型、參照及其他操作加以實作。一個設計良好的資料結構,應該在儘可能使用較少的時間與空間資源的前提下,支援各種程式執行。

不同種類的資料結構適合不同種類的應用,部分資料結構甚至是為了解決特定問題而設計出來的。例如B樹即為加快樹狀結構存取速度而設計的資料結構,常被應用在資料庫和檔案系統上。
正確的資料結構選擇可以提高演算法的效率(請參考演算法效率)。
在電腦程式設計的過程裡,選擇適當的資料結構是一項重要工作。

許多大型系統的編寫經驗顯示,程式設計的困難程度與最終成果的品質與表現,取決於是否選擇了最適合的資料結構。

系統架構的關鍵因素是資料結構而非演算法的見解,導致了多種形式化的設計方法與程式語言的出現。絕大多數的語言都帶有某種程度上的模組化思想,透過將資料結構的具體實作封裝隱藏於使用者介面之後的方法,來讓不同的應用程式能夠安全地重用這些資料結構。

C++、Java、Python等物件導向的程式語言可使用類別來達到這個目的。
因為資料結構概念的普及,現代程式語言及其API中都包含了多種預設的資料結構,例如 C++ 標準模板庫中的容器、Java集合框架以及微軟的.NET Framework。


1. 檔案讀取 寫檔
2. 排名
3. ArrayList 與資料結構

程式:
void setup()
{
  size(600, 600);
}

void draw() {
  if (mousePressed) line(mouseX, mouseY, pmouseX, pmouseY);
}
int number = 0;
void keyPressed() {
  save("now_"+ number+".png");
  number++;
}



程式2: 以frame寫:

void setup()
{
  size(600, 600);
}

void draw() {
  if (mousePressed) line(mouseX, mouseY, pmouseX, pmouseY);
}
//int number = 0;
void keyPressed() {
  saveFrame();
  //save("now_"+ number+".png");
  //number++;
}


程式3: 使用processing api
//String [] names = {"AA","BB","CC"};
//saveStrings("myClassmateName",names);


String lines[] = loadStrings("myClassmateName.txt");
println("there are " + lines.length + " lines");
for (int i = 0 ; i < lines.length; i++) {
  println(lines[i]);
}  

程式3:接金幣
PVector [] coins = new PVector[10];
void setup()
{
  size(500, 500);
  for (int i = 0; i<10; i++) {
    coins[i] = new PVector(random(500), -random(100));
  }
}

int score = 0;
void draw () {
  background(255);
  for (int i = 0; i<10; i++) {
    fill(255, 255, 0);
    ellipse(coins[i].x, coins[i].y, 30, 30);
    coins[i].y +=2;
    if (coins[i].y>530) coins[i].y=-random(100);
    if (dist(mouseX, mouseY, coins[i].x, coins[i].y)<30) {
      score += 100;
      coins[i].y= -random(100);
    }
  }
  fill(255, 0, 0);
  textSize(30);
  text("score"+score, 200, 200);
}


程式4: 結合記分板 跟 接金幣
PVector [] coins=new PVector[10];
void setup() {
  size(500, 500);
  for (int i=0; i<10; i++) coins[i]=new PVector( random(500), -random(100));
}
int score=0, life=10, speed=2;
int state=0;//state 0:playing, 1:gameOver, 2:showScoreBoard
String [] allScore;
void draw() {
  if (state==2) {
    background(255, 255, 0);
    for (int i=0; i<allScore.length; i++) {
      fill(255, 0, 0); 
      textSize(30);
      text( allScore[i], 100, 200+i*50);
    }
    return ;
  } else if (state==1) {
    background(128); 
    speed=0;
    allScore = loadStrings("allScores.txt");
    if (mousePressed) state=2;
  } else background(255);
  for (int i=0; i<10; i++) {
    fill(255, 255, 0); 
    ellipse(coins[i].x, coins[i].y, 30, 30);
    coins[i].y+=speed;//!!!!!!
    if (coins[i].y>530) {
      coins[i].y=-random(100);
      life--;
      if (life<=0) state=1;
    }
    if (dist(mouseX, mouseY, coins[i].x, coins[i].y)<30) {
      score+=100; 
      coins[i].y=-random(100);
    }
  }
  fill(255, 0, 0); 
  textSize(30); 
  text("Score:"+score +"Life:"+life, 200, 200);
}

沒有留言:

張貼留言