顯示具有 Week09 標籤的文章。 顯示所有文章
顯示具有 Week09 標籤的文章。 顯示所有文章

2012年11月13日 星期二

Midterm


踩地雷
左半邊是地圖區,很簡單就是地雷可以踩或是右鍵Mark為地雷,
右邊介面區顯示當前這局總共有多少顆地雷,
可以使用下面的+或-來增加減少,然後按下PLAY開始新一局,
總地雷數就會是新設定的地雷數。

中間是經過時間,從第一顆地雷被踩下去才開始記數,
做為計算排行榜之用。

最下是高分表,顯示了目前資料中記錄的前三名,
會有一個HighSore.txt的純文字文件用於記錄當前排行榜,
如果不存在就會跳出例外,前三名的成績就為預設的255
只有玩地雷為25顆的正規局,名次才會被計算。

開始玩

如同大家所知的踩地雷一樣,
當踩到一格是周圍完全沒有地雷的空格,
就會自動把周圍全部點開,所以如果運氣好,
點兩三下就可以開出一大片安全區。

踩爆
如果不幸踩到地雷,畫面上就會秀出失敗的訊息,
這個時候時間不再繼續記數,也不能夠再踩,
只能夠按下PLAY開始新的一局,當然也可以設定地雷數後再開始。

勝利(這裡為了節省時間把地雷數改為5顆,排行榜也會計算)
當地圖上應該要被踩下的位置都被踩下後
(剩下未踩,或被Mark都是地雷)
判定勝利,秀出勝利訊息。
如果很確定是地雷的位置,那不必標記也沒關係,不影響判定。

可以看到上一局的11秒刷新了新的紀錄,
所以被記錄在第一名的位置了。


我的專案資料夾結構
HighScore是個很單純的純文字文件,
所以任何有心人士(?)都可以輕易的竄改上面的排行榜...



Code

字很多,先直接說我的做法好了QQ
程式從按下PLAY開始,
首先生成n(地雷數)個隨機不重複0~143的亂數,設定為地雷,
建構一個boolean陣列,存放144格是否地雷的地圖;
然後再做一個int二維陣列(boolean陣列為配合亂數,是一維陣列)
根據boolean陣列的資料判定當前這格周圍有多少顆地雷(或根本就是雷)
這個int map做好以後,地雷的資料就算完成了。

當使用者開始踩地雷區,因為每一格是50像素,
所以直接把使用者的mouseX.Y除50就可以對應到int map上,
判定起來很方便;
我的圖片在遊戲一開始後就載入到一個Image陣列之中,
當Click事件發生,直接讓int map中的資料去當作Image陣列的Index,
然後貼圖就是對應的數字,省去很多不必要的記憶體浪費。

大致上就是這樣,其他的小功能基本上都是小函式,
copy來研究一下就貼上了沒什麼特別的QQ

以下為程式碼:
請搭配http://ppt.cc/z6ee
完整專案檔服用,不然圖都貼不出來(doh)
int intMap[][] = new int[12][12];
boolean check[][] = new boolean[12][12];
boolean mark[][] = new boolean[12][12];
PImage pic[] = new PImage[10];
int mines = 25;
int oldTime;
int time = 0;
boolean pause;
boolean begin;
int[] highScore = {255,255,255};
int winCount;

void setup()
{
  size(800,600);
  try
  {
    String lines[] = loadStrings("HighScore.txt");
    for (int i = 0; i < 3; i++)
      highScore[i] = Integer.parseInt(lines[i]);
  }
  catch(Exception ex)
  {
    println("There is no High Score Data!\nThe High Score are all 255");
  }
  
  pic[0] = loadImage("white.jpg");
  pic[1] = loadImage("one.jpg");
  pic[2] = loadImage("two.jpg");
  pic[3] = loadImage("three.jpg");
  pic[4] = loadImage("four.jpg");
  pic[5] = loadImage("five.jpg");
  pic[6] = loadImage("six.jpg");
  pic[7] = loadImage("seven.jpg");
  pic[8] = loadImage("eight.jpg");
  pic[9] = loadImage("red.jpg");
  
  
  background(255,255,255);
  //frameRate(24);
  
  gameZoom();
  IFset();
  Start();
  
}
void gameZoom()
{
  stroke(5);
  fill(200,200,200);
  rect(0,0,600,600);
  strokeWeight(5);
  line(0,0,600,0);
  line(0,50,600,50);
  line(0,100,600,100);
  line(0,150,600,150);
  line(0,200,600,200);
  line(0,250,600,250);
  line(0,300,600,300);
  line(0,350,600,350);
  line(0,400,600,400);
  line(0,450,600,450);
  line(0,500,600,500);
  line(0,550,600,550);
  line(0,600,600,600);
  
  line(0,0,0,600);
  line(50,0,50,600);
  line(100,0,100,600);
  line(150,0,150,600);
  line(200,0,200,600);
  line(250,0,250,600);
  line(300,0,300,600);
  line(350,0,350,600);
  line(400,0,400,600);
  line(450,0,450,600);
  line(500,0,500,600);
  line(550,0,550,600);
  line(600,0,600,600);
  strokeWeight(1);
}
void IFset()
{
  fill(0,0,0);
  PFont myFont;
  myFont = createFont("FFScala", 32);
  textFont(myFont);
  text(str(mines),630,10,100,100);
  
  text("經過時間",620, 350,170,100);
  text("High Score",620, 450,170,100);
  
  myFont = createFont("FFScala", 20);
  textFont(myFont);
  text("顆地雷",690,20,200,100);
  text("1.\n2.\n3.",630,490,50,100);
  noStroke();
  fill(255,255,255);
  rect(700,490,50,100);
  fill(0,0,0);
  text(str(highScore[0])+"\n"+str(highScore[1])+"\n"+str(highScore[2]),700,490,50,100);
  stroke(1);
  
  fill(0,255,0);
  rect(630,60,40,40);
  fill(0,0,255);
  rect(700,60,40,40);
  fill(255,0,0);
  rect(635,78,30,4);
  rect(648,65,4,30);
  rect(705,78,30,4);
  
  rect(625,160,150,150);
  fill(0,0,0);
  myFont = createFont("FFScala", 50);
  textFont(myFont);
  text("PLAY",635,200,200,100);
  myFont = createFont("FFScala", 40);
  textFont(myFont);
}

void Start()
{
  int mine[] = new int[mines];
  boolean boolMap[] = new boolean[144];
  check = new boolean[12][12];
  mark = new boolean[12][12];
  for (int i = 0; i < mines; i++)
  {
    boolean checker = true;
    while(checker)
    {
      mine[i] = int(random(144));
      for(int j = 0; j <= i; j++)
      {
        if (i == j)
        {
          checker = false;
          break;
        }
        else if (mine[i] == mine[j])
          break;
      }
    }
    boolMap[mine[i]] = true;
  }
  
  int count = 0;
  if (boolMap[0])
    count = 9;
  else
  {
    if(boolMap[1])
      count++;
    if(boolMap[12])
      count++;
    if(boolMap[13])
      count++;
  }
  intMap[0][0] = count;
  count = 0;
  
  if (boolMap[11])
    count = 9;
  else
  {
    if (boolMap[10])
      count++;
    if (boolMap[22])
      count++;
    if (boolMap[23])
      count++;
  }
  intMap[11][0] = count;
  count = 0;
  
  if (boolMap[132])
    count = 9;
  else
  {
    if (boolMap[120])
      count++;
    if (boolMap[121])
      count++;
    if (boolMap[133])
      count++;
  }
  intMap[0][11] = count;
  count = 0;
  
  if (boolMap[143])
    count = 9;
  else
  {
    if (boolMap[130])
      count++;
    if (boolMap[131])
      count++;
    if (boolMap[142])
      count++;
  }
  intMap[11][11] = count;
  count = 0;
  //上排
  for (int i = 1; i < 11; i++)
  {
    int couM = 0;
    if (boolMap[i])
      couM = 9;
    else
    {
      if (boolMap[i - 1])
        couM++;
      if (boolMap[i + 1])
        couM++;
      if (boolMap[i + 11])
        couM++;
      if (boolMap[i + 12])
        couM++;
      if (boolMap[i + 13])
        couM++;
    }
    intMap[i][0] = couM;
  }
  //左排
  for (int i = 1; i < 11; i++)
  {
    int couM = 0;
    if (boolMap[12 * i])
      couM = 9;
    else
    {
      if (boolMap[12 * (i - 1)])
        couM++;
      if (boolMap[12 * (i - 1) + 1])
        couM++;
      if (boolMap[12 * i + 1])
        couM++;
      if (boolMap[12 * (i + 1)])
        couM++;
      if (boolMap[12 * (i + 1) + 1])
        couM++;
    }
    intMap[0][i] = couM;
  }
  //右排
  for (int i = 1; i < 11; i++)
  {
    int couM = 0;
    if (boolMap[(i + 1) * 12 - 1])
      couM = 9;
    else
    {
      if (boolMap[i * 12 - 2])
        couM++;
      if (boolMap[i * 12 - 1])
        couM++;
      if (boolMap[(i + 1) * 12 - 2])
        couM++;
      if (boolMap[(i + 2) * 12 - 2])
        couM++;
      if (boolMap[(i + 2) * 12 - 1])
        couM++;
    }
    intMap[11][i] = couM;
  }
  //下排
  for (int i = 1; i < 11; i++)
  {
    int couM = 0;
    if (boolMap[132 + i])
      couM = 9;
    else
    {
      if (boolMap[120 + i - 1])
        couM++;
      if (boolMap[120 + i])
        couM++;
      if (boolMap[120 + i + 1])
        couM++;
      if (boolMap[132 + i - 1])
        couM++;
      if (boolMap[132 + i + 1])
        couM++;
    }
    intMap[i][11] = couM;
  }
  //中間
  for (int i = 1; i < 11; i++)
  {
    for (int j = 1; j < 11; j++)
    {
      int couM = 0;
      if (boolMap[i * 12 + j])
        couM = 9;
      else
      {
        if (boolMap[(i - 1) * 12 + j - 1])
          couM++;
        if (boolMap[(i - 1) * 12 + j])
          couM++;
        if (boolMap[(i - 1) * 12 + j + 1])
          couM++;
        if (boolMap[i * 12 + j - 1])
          couM++;
        if (boolMap[i * 12 + j + 1])
          couM++;
        if (boolMap[(i + 1) * 12 + j - 1])
          couM++;
        if (boolMap[(i + 1) * 12 + j])
          couM++;
        if (boolMap[(i + 1) * 12 + j + 1])
          couM++;
      }
      intMap[j][i] = couM;
    }
  }
}
void mousePressed()
{
  int a = mouseX / 50;
  int b = mouseY / 50;
  if (mouseButton == LEFT)
  {
    if(mouseX<600 && !pause)
    {
      image(pic[intMap[a][b]], a * 50 + 3, b * 50 + 3, 45, 45);
      check[a][b]=true;
      winCount++;
      if (intMap[a][b] == 9)
        endGame();
      else if (intMap[a][b] == 0)
        safe(a, b);
        
      if(!begin)
      {
        begin = true;
        oldTime = second();
      }
      
      if(winCount == 144 - mines)
        win();
    }
    else if(mouseY&rt;60 && mouseY<100)
    {
      PFont myFont;
      myFont = createFont("FFScala", 32);
      textFont(myFont);
      if(mouseX&rt;630 && mouseX<670)
      {
        mines++;
        fill(255,255,255);
        noStroke();
        rect(610,8,75,40);
        fill(0,0,0);
        text(str(mines),630,10,100,100);
      }
      else if(mouseX&rt;700 && mouseX<740)
      {
        mines--;
        fill(255,255,255);
        noStroke();
        rect(610,8,55,40);
        fill(0,0,0);
        text(str(mines),630,10,100,100);
      }
    }
    else if(mouseX&rt;625 && mouseX<775 && mouseY&rt;160 && mouseY<310)
    {
      gameZoom();
      Start();
      IFset();
      time = 0;
      begin = false;
      pause = false;
    }
  }
  else if (mouseButton == RIGHT)
  {
    if(!pause)
    {
      if (!check[a][b] && !mark[a][b])
      {
        mark[a][b] = true;
        PImage flag = loadImage("mark.jpg");
        image(flag, a * 50 + 3, b * 50 + 3, 45, 45);
      }
      else if (mark[a][b])
      {
        mark[a][b] = false;
        fill(200,200,200);
        rect(a * 50 + 2, b * 50 + 2,46,46);
      }
      
    }
  }
}

void endGame()
{
  PFont myFont;
  myFont = createFont("FFScala", 80);
  textFont(myFont);
  fill(255,0,0);
  text("爆了!GG!",100,200,500,200);
  myFont = createFont("FFScala", 40);
  textFont(myFont);
  pause = true;
  winCount = 0;
}

void win()
{
  PFont myFont;
  myFont = createFont("FFScala", 80);
  textFont(myFont);
  fill(255,0,0);
  text("YOU WIN!!",100,200,500,200);
  myFont = createFont("FFScala", 40);
  textFont(myFont);
  pause = true;
  winCount = 0;
  if(mines == 25)        //如果是25顆地雷才會記錄!!!!
  {
    for(int i = 0; i < 3; i++)
      if(time < highScore[i])
      {
        for(int j = 2; j &rt; i; j--)
          highScore[j] = highScore[j - 1];
        highScore[i] = time;
        String saveHC = "";
        for(int j = 0; j < 3; j++)
          saveHC += str(highScore[j]) + " ";
        String[] list = split(saveHC, ' ');
        saveStrings("HighScore.txt", list);
        break;
      }
  }
}

void safe(int a,int b)
{
  if (a &rt; 0 && b &rt; 0)
  {
    if (!check[a-1][b-1])
    {
      image(pic[intMap[a-1][b-1]], (a-1) * 50 + 3, (b-1) * 50 + 3, 45, 45);
      check[a-1][b-1]=true;
      winCount++;
      if (intMap[a-1][b-1] == 0)
        safe(a-1, b-1);
    }
  }
  if (b &rt; 0)
  {
    if (!check[a][b-1])
    {
      image(pic[intMap[a][b-1]], (a) * 50 + 3, (b-1) * 50 + 3, 45, 45);
      check[a][b-1]=true;
      winCount++;
      if(intMap[a][b-1] == 0)
        safe(a, b-1);
    }
  }
  if (a < 11 && b &rt; 0)
  {
    if (!check[a+1][b-1])
    {
      image(pic[intMap[a+1][b-1]], (a+1) * 50 + 3, (b-1) * 50 + 3, 45, 45);
      check[a+1][b-1]=true;
      winCount++;
      if(intMap[a+1][b-1] == 0)
        safe(a+1, b-1);
    }
  }
  if (a &rt; 0 )
  {
    if (!check[a-1][b])
    {
      image(pic[intMap[a-1][b]], (a-1) * 50 + 3, (b) * 50 + 3, 45, 45);
      check[a-1][b]=true;
      winCount++;
      if(intMap[a-1][b] == 0)
        safe(a-1, b);
    }
  }
  if (a < 11)
  {
    if (!check[a+1][b])
    {
      image(pic[intMap[a+1][b]], (a+1) * 50 + 3, (b) * 50 + 3, 45, 45);
      check[a+1][b]=true;
      winCount++;
      if(intMap[a+1][b] == 0)
        safe(a+1,b);
    }
  }
  if (a &rt; 0 && b < 11)
  {
    if (!check[a-1][b+1])
    {
      image(pic[intMap[a-1][b+1]], (a-1) * 50 + 3, (b+1) * 50 + 3, 45, 45);
      check[a-1][b+1]=true;
      winCount++;
      if(intMap[a-1][b+1] == 0)
        safe(a-1,b+1);
    }
  }
  if (b < 11)
  {
    if (!check[a][b+1])
    {
      image(pic[intMap[a][b+1]], (a) * 50 + 3, (b+1) * 50 + 3, 45, 45);
      check[a][b+1]=true;
      winCount++;
      if(intMap[a][b+1] == 0)
        safe(a, b+1);
    }
  }
  if (a < 11 && b < 11)
  {
    if (!check[a+1][b+1])
    {
      image(pic[intMap[a+1][b+1]], (a+1) * 50 + 3, (b+1) * 50 + 3, 45, 45);
      check[a+1][b+1]=true;
      winCount++;
      if(intMap[a+1][b+1] == 0)
        safe(a+1,b+1);
    }
  }
}

void draw()
{
  if(begin)
  {
    if (oldTime != second())
      time++;
    oldTime = second();
  }
  noStroke();
  if(!pause)
  {  
    fill(255,255,255);
    rect(700,400,200,50);
    fill(0,0,0);
    text(str(time),700,400,200,50);
  }
}




//媽勒為什麼大家都是Midtern害我以為我拼錯

Midtern

期中作業: Music Game 

遊戲鏈結: 32位元遊戲檔案 64位元遊戲檔案    Processing原始檔案

遊戲影片:

遊戲大綱:



完整一首歌以及紀錄更新:



遊戲節圖說明:


遊戲開始畫面(字體會慢慢刷出來)


說明頁面(Check會漂浮)


選單(選擇游標、音樂、隱藏及難度)


被選擇的會從素描風格變成彩色圖片



第二首音樂的畫面(背景、數字及combo會有不同風格)



第一首音樂的畫面(右下角的menu點選到結果畫面及主選單)



結果畫面隨音樂不同改變背景(紀錄Good、Miss、Grade and MaxCombo)



結果畫面隨音樂不同改變背景(紀錄Good、Miss、Grade and MaxCombo)



游標置於音樂上會顯示最高分數(會記錄最高)


跟著游標跑的哆啦a夢(常被說噁心)


小丸子風格的按鍵放大圖


音樂圖片的素描風格




各種難度以及小丸子的素描風格








附註:

  1.為了解決速度會影響預先設定普面的節奏,有調整游標從頂端到尾端速度的換算。
  2.遊戲開頭文字是漸漸"刷"出來的。
  3.為凸顯功能選擇與否,將遊戲圖式風格素描化。
  4.游標產生會依照節奏,但按鍵位置每次都為隨機,增加可玩度。
  5.防止有人按住按鍵作弊,有特別設計按下後只有6個frame間能夠感應,約0.2秒。
  6.避免滑鼠按下後感應太多次,設置為只感應一次。
  7.使用txt檔案紀錄對應節奏之按鍵產生時間,以及最高分數。
  8.困難模式下,使用 + - 可以調整速度 z x 可以調整難度,m可以拍照。
  9.遊戲本身有建立譜面的模式,但需要將某些程式碼註解調整,能自己設計譜面節奏。
  10.不同音樂有不同的背景、combo圖片以及數字風格。
  11.滑鼠游標會有軌跡!!!!(多拉A夢= =)

程式碼:

import ddf.minim.*;

AudioPlayer player;
Minim minim;

PFont font;


/*Mouse point*/
PImage mu;                   //mouse image
int[] Msitex=new int[7];     //save mouse site X
int[] Msitey=new int[7];     //save mouse site Y

/*Title use Varible*/
PImage title,nameArea,bomb,example,check;   //Include logo name studID illu
int move = -300,site=0;                     //save motion information
int[] maskArr;                              //use to save alpha value to mask image
float fly=0;                                //use to ellipse motion
int runType=0;                              //decide what kind difficult level

/*Result use*/
int good=0,bad=0,maxCombo=0;                //save good num and bad num
long gradeNum=0,tmpgrade;                            //save grade
PImage result,goodImg,badImg,grade,resultImg,comboImg;  //save image include good bad grade...word

/*Menu Use */
PImage bg_menu,Music1,Music1plus,Music2,Music2plus;    //save music pic
PImage easy,nor,dif;                                   //save difficult level img
PImage easyPlus,norPlus,difPlus;                       //save difficult level img pencil style
PImage btnP;                                           //save another kind btn
PImage hidden,hiddenP;                                 //save word hidden 
PImage exitImg,exitImgP;                               //save word exit
long r1=0,r2=0;                                        //to load highest grade value
String rk;                                             //to scan file's string ( grade )

/* Game Use Varible*/
int SPEED = 5 ,ARR_SIZE=500 , DIFFACULT=9;  //Define
PImage img,lv,btn;                    //背景 combo,按鈕圖片
PImage[] number;               //紀錄數字圖片
PImage menu;                   //to save menu background
float[] sx,sy;                 //下降游標位置
int combo,a,b,c;               //段數
int count,s,sp;                //游標數,柱列指標
int rtime;                     //隨機時間
int i,k;                     //迴圈使用變數
color btn_q,btn_w,btn_e,btn_i,btn_o,btn_p,btn_space;       //按件顏色
boolean[] ctl ;                //控制判斷 X 座標
boolean btnStyle=true;         //按鈕類型
int[] boardX;                  //判斷X邊界 
String tmp,linee;              //to temp file string
long t;                        //to save system time (already colculate
int DELAY = -2250;             //set delay
boolean hid=false;             //choose hidden?
int decide=0;
int tempcount=0; 
int limitTime;
/*Time Controler*/
long selectTime ;
int typeSel=0;   //Start script: 0  menu script: 1 game script: 2 result script: 3

//PrintWriter output;

BufferedReader reader;
BufferedReader rank;
PrintWriter rankin;

void setup()
{
  //宣告陣列
  ctl=new boolean[10];
  boardX=new int[10];
  sx=new float[ARR_SIZE];
  sy=new float[ARR_SIZE];
  number=new PImage[10];
  
  //output = createWriter("2d.txt");

  //size and loadImage
  size(800,600);
  
  font = loadFont("data/txt.vlw");
  
  btn=loadImage("gameUse/btn.png");
  title=loadImage("start/title.png");
  nameArea=loadImage("start/name.png");
  example= loadImage("start/Eg.jpg");
  check=loadImage("start/check.png");
  bg_menu=loadImage("menu/background_menu.jpg");
  Music1=loadImage("menu/1.jpg");
  Music1plus=loadImage("menu/1plus.jpg");
  Music2=loadImage("menu/2.jpg");
  Music2plus=loadImage("menu/2plus.jpg");
  maskArr=new int[nameArea.width * nameArea.height];
  mu=loadImage("start/mu.png");
  easy=loadImage("gameUse/Easy.png");
  nor=loadImage("gameUse/Normal.png");
  dif=loadImage("gameUse/Diffacult.png");
  easyPlus=loadImage("gameUse/EasyPlus.png");
  norPlus=loadImage("gameUse/NormalPlus.png");
  difPlus=loadImage("gameUse/DiffacultPlus.png");
  menu=loadImage("gameUse/menuu.png");
  btnP=loadImage("gameUse/btnP.png");
  hiddenP=loadImage("menu/hiddenP.png");
  hidden=loadImage("menu/hidden.png");
  goodImg=loadImage("result/good.png");
  badImg=loadImage("result/bad.png");
  grade=loadImage("result/grade.png");
  resultImg=loadImage("result/resultWord.png");
  comboImg=loadImage("result/combo.png");
  result=loadImage("background/2.jpg");
  rank=createReader("data/rank.txt");
  exitImg=loadImage("menu/exit.png");
  exitImgP=loadImage("menu/exitP.png");
  for(i=0;i<2;i++){
    try{
        rk = rank.readLine();
        if(i==0) r1= int(rk);
        else if(i==1) r2=int(rk);
        
     } 
     catch (IOException e) {
        e.printStackTrace();
        rk = null;
     }  
  }
  //Set orinage color value
  btn_q=color(255,128,128,150);
  btn_w=color(128,255,128,150);
  btn_e=color(128,128,255,150);
  btn_space=color(255,255,255,150);
  btn_i=color(128,128,255,150);
  btn_o=color(128,255,128,150);
  btn_p=color(255,128,128,150);
  
  //初值化
  for(i=0;i<10;i++) ctl[i]=false;
  rtime=count=sp=s=combo=0;
  
  //Setting Board
  boardX[0]=5;
  boardX[1]=45;
  boardX[2]=85;
  boardX[3]=125;
  boardX[4]=165;
  boardX[5]=205;
  boardX[6]=245;
  
  //音樂
  minim = new Minim(this);
  player = minim.loadFile("Music/Bald Bros - We Are (Radio Edit).mp3", 1024);
}

//顯示combo
void showCombo(int num)
{
  if(num&rt;=100){
    c=num%10;
    num/=10;
    b=num%10;
    num/=10;
    a=num%10;
    image(number[a],240,100,60,80);
    image(number[b],300,100,60,80);
    image(number[c],360,100,60,80);
    image(lv,420,100,330,80);
  }
  else if(num&rt;=10){
    c=num%10;
    num/=10;
    b=num%10;
    image(number[b],300,100,60,80);
    image(number[c],360,100,60,80);
    image(lv,420,100,330,80);
  }
  
}

//刪除元素
void del()
{
  s++;
  count--;
  if(s==ARR_SIZE) s=0;
}

//增加元素
void push(int tx,int ty)
{
  sx[sp]=tx;
  sy[sp++]=ty; 
  count++;
  if(sp==ARR_SIZE) sp=0;
}

//產生下降游標
void btn(int type)
{
  int tx=0,ty=0;
  switch(type)
  {
   case 0: tx=5;break;
   case 1: tx=45;break;
   case 2: tx=85;break;
   case 3: tx=125;break;
   case 4: tx=165;break;
   case 5: tx=205;break;
   case 6: tx=245;break;
  } 
  push(tx,ty); 
}

void keyPressed()
{
  //output.println(millis());
  
  switch(key){
  case 'q': btn_q=color(246,100,196,200);ctl[0]=true;break;
  case 'w': btn_w=color(246,100,196,200);ctl[1]=true;break;
  case 'e': btn_e=color(246,100,196,200);ctl[2]=true;break;
  case 'i': btn_i=color(246,100,196,200);ctl[4]=true;break;
  case 'o': btn_o=color(246,100,196,200);ctl[5]=true;break;
  case 'p': btn_p=color(246,100,196,200);ctl[6]=true;break;
  case ' ': btn_space=color(246,100,196,200);ctl[3]=true;break;
  case '+': if(SPEED<12) SPEED++; DELAY+=250;break;
  case '-': if(SPEED&rt;1) SPEED--; DELAY-=250;break;
  case 'z': if(DIFFACULT &rt; 5) DIFFACULT--;break;
  case 'x': if(DIFFACULT < 20) DIFFACULT++;break;
  case 'c': btnStyle=!btnStyle;break;
  case 'm' :save("C:/save.jpg");break;

  //case 'b': output.flush();output.close();exit();
  
  }
  if(tempcount++<6){
    for(i=0;i<7;i++)
      if(ctl[i] && sy[s]<=560 && sy[s]&rt;510 && sx[s]==boardX[i] ){
        combo++;
        decide = 0;
        gradeNum+=combo*100;
        maxCombo=combo&rt;maxCombo?combo:maxCombo;
        good++;
        del();
        break;
      }
  }
  
}

void keyReleased()
{
  switch(key){
  case 'q': btn_q=color(255,128,128,150); ctl[0]=false; break;
  case 'w': btn_w=color(128,255,128,150); ctl[1]=false; break;
  case 'e': btn_e=color(128,128,255,150); ctl[2]=false; break;
  case ' ': btn_space=color(255,255,255,150); ctl[3]=false; break;
  case 'i': btn_i=color(128,128,255,150); ctl[4]=false; break;
  case 'o': btn_o=color(128,255,128,150); ctl[5]=false; break;
  case 'p': btn_p=color(255,128,128,150); ctl[6]=false; break;
  } 
  tempcount=0;
}
void drawBtnArea()
{
  //游標區域
    strokeWeight(3);
    fill(btn_q);
    rect(5,0,40,540);
    fill(btn_p);
    rect(245,0,40,540);
    fill(btn_w);
    rect(45,0,40,540);
    fill(btn_o);
    rect(205,0,40,540);
    fill(btn_e);
    rect(85,0,40,540);
    fill(btn_i);
    rect(165,0,40,540);
    fill(btn_space);
    rect(125,0,40,540);
    fill(255,255,125);
    rect(5,530,280,30,18);
}
void draw()
{
  
  
  /*Game*/
  switch(typeSel)
  {
  /*Menu*/
  case 0:
    background(0);
    //Start 
    if(millis() < 9000){
      image(title,250,move,300,260);
      if(move<100) move += 2 ;
      else{
        //Show Name's
        nameArea.mask(maskArr);
        image(nameArea,160,350,500,70);
        if(++site < 499) 
          for(i=site;i<35000;i+=225){
            if(i&rt;=35000) break;
            maskArr[i]=250;
          }
          for(i=site++;i<35000;i+=230){
            if(i&rt;=35000) break;
            maskArr[i]=250;
          }
       }
    }
    else{    
    //Waiting and Illustrate  
      image(example,0,0,800,600);
      image(check,550+30*cos(fly),300+60*sin(fly+=0.04),200,50);
      if(mousePressed){
        typeSel = 1 ;
        //Memo Select process time
        player.play();
      }
    }
    break;
    
  case 1:
    /*Menu*/
    image(bg_menu,0,0,800,600);
    good=bad=maxCombo=0;
    decide=2;
    textFont(font,40);
    
    /*Select Music*/
    if(mouseX<225&&mouseX&rt;50&&mouseY<225&&mouseY&rt;50){
      image(Music1,50,50,200,200);
      fill(255,255,0);
      text("Highest Grade",450,450);
      text(r1,450,500);
    }
    else image(Music1plus,50,50,150,150);
    if(mouseX<325&&mouseX&rt;150&&mouseY<445&&mouseY&rt;270){
      image(Music2,150,270,200,200);
      fill(255,255,0);
      text("Highest Grade",450,450);
      text(r2,450,500);
    }
    else image(Music2plus,150,270,140,140);
    
    /*difficult*/
    if(runType==0) image(easy,50,470,120,120);
    else image(easyPlus,50,470,120,120);
    if(runType==1) image(nor,200,460,120,120);
    else image(norPlus,200,460,120,120);
    if(runType==2) image(dif,350,460,120,120);
    else image(difPlus,350,460,120,120);
    
    if(mouseX<800&&mouseX&rt;600&&mouseY<600&&mouseY&rt;500) image(exitImg,600,500,200,100);
    else image(exitImgP,600,500,200,100);
    
    if(btnStyle==true){
      fill(255,255,0);
      strokeWeight(10);
      rect(600,150,120,50,18);
      image(btnP,400,100,150,150);
    }
    else{
     fill(200,200,200);
     strokeWeight(10);
     rect(600,150,120,50,18); 
     image(btn,400,100,150,150);
    }
    
    if(hid==false) image(hiddenP,420,300,300,75);
    else image(hidden,420,300,300,75);
    
    if(mousePressed){
       if(mouseX<800&&mouseX&rt;600&&mouseY<600&&mouseY&rt;500) exit();
       else if(mouseY&rt;460&&mouseY<590){
           if(mouseX<170&&mouseX&rt;50) runType=0;
           else if(mouseX<320&&mouseX&rt;50) runType=1;
           else if(mouseX<470&&mouseX&rt;50) runType=2;  
       }
       else if(mouseY&rt;100&&mouseY<250){
           if(mouseX&rt;400&&mouseX<550) btnStyle=false;
           else if(mouseX&rt;600&&mouseX<720) btnStyle=true;
       }
       else if(mouseY<375&&mouseY&rt;300){
          if(tempcount++==0&&mouseX&rt;420&&mouseX<720) hid = !hid;
       }
    }
    else tempcount = 0;
    
    /*Music*/
    if(mousePressed){
       if(mouseX<225&&mouseX&rt;50&&mouseY<225&&mouseY&rt;50){
         img = loadImage("background/1.jpg");
         result=loadImage("menu/1.jpg");
         lv= loadImage("gameUse/lv.png");
         DIFFACULT=9;
         SPEED=5;
         limitTime=254000;
         for(i=0;i<10;i++){
           tmp = i + ".png";
           number[i]=loadImage("number/" + tmp); 
         }
   
         if(runType==0){
           reader = createReader("btn/positions.txt"); 
           DELAY = -2160;
         }
         else if(runType==1){
           reader = createReader("btn/1d.txt"); 
           DELAY = -4600;
         }
         if(runType!=2) runType=0;
         if(runType!=2){
           try{
              linee = reader.readLine();
              t=int(linee) + DELAY ;
           } 
           catch (IOException e){
              e.printStackTrace();
              linee = null;
           }
         }
         player.pause();
         player = minim.loadFile("Music/04 Happy End.mp3", 1024);
         player.play();
         typeSel=2;
         selectTime=millis();
       }
       else if(mouseX<325&&mouseX&rt;150&&mouseY<445&&mouseY&rt;270){
         img = loadImage("background/2.jpg");
         result=loadImage("menu/2.jpg");
         
         DIFFACULT=7;
         SPEED=5;
         limitTime=209000;
         lv= loadImage("gameUse/cbo.png");
         
         for(i=0;i<10;i++){
           tmp = i + "a" + ".png";
           number[i]=loadImage("number/" + tmp); 
         }
         
         if(runType==0){
           reader = createReader("btn/2.txt");
           DELAY = -1650; 
         }
         else if(runType==1){
           reader = createReader("btn/2d.txt");
           DELAY = -1950; 
         }
         if(runType!=2) runType=0;
         if(runType!=2){
           try{
              linee = reader.readLine();
              t=int(linee) + DELAY ;
           } 
           catch (IOException e){
              e.printStackTrace();
              linee = null;
           }
         }
         player.pause();
         player = minim.loadFile("Music/03 I'm OK.mp3", 1024);
         player.play();
         typeSel=2;
         selectTime=millis();
       }
    }
    break;
       
  case 2:
    rtime++;
    image(img,0,0,800,600);
    image(menu,600,450,200,130);
    drawBtnArea();
    
    //產生游標
    
    switch(runType)
    {
      case 0:  
      /*easy and normal mode about*/
        if(t<-50000){
          typeSel=3;
          rankin=createWriter("data/rank.txt");
          if(limitTime==254000){
            rankin.println((gradeNum&rt;r1?gradeNum:r1)); 
            rankin.println(r2);
          }
          else{
            rankin.println(r1);
            rankin.println((gradeNum&rt;r2?gradeNum:r2)); 
          }
          rankin.flush();
          rankin.close();
          rank=createReader("data/rank.txt");
          for(i=0;i<2;i++){
            try{
                rk = rank.readLine();
                if(i==0) r1= int(rk);
                else if(i==1) r2=int(rk);
                
             } 
             catch (IOException e) {
                e.printStackTrace();
                rk = null;
             }  
          }
        }
        else if(millis()-selectTime&rt;t){
          btn((int)random(0,6.99));
          
          try{
            linee = reader.readLine();
            t=int(linee) + DELAY;
          }
          catch(IOException e) 
          {
            
          }
          
        }
        break;
        
      case 2:
      /*difficult mode product about*/
        if((rtime%DIFFACULT)==0) btn((int)random(0,6.99));
        if(millis()-selectTime&rt;limitTime){
          typeSel=3;
          rankin=createWriter("data/rank.txt");
          if(limitTime==254000){
            rankin.println((gradeNum&rt;r1?gradeNum:r1)); 
            rankin.println(r2);
          }
          else{
            rankin.println(r1);
            rankin.println((gradeNum&rt;r2?gradeNum:r2)); 
          }
          rankin.flush();
          rankin.close();
          rank=createReader("data/rank.txt");
          for(i=0;i<2;i++){
            try{
                rk = rank.readLine();
                if(i==0) r1= int(rk);
                else if(i==1) r2=int(rk);
                
             } 
             catch (IOException e) {
                e.printStackTrace();
                rk = null;
             }  
          }
          tmpgrade=gradeNum;
          gradeNum=0;
          while(count!=0) del(); 
          player.pause();
          player = minim.loadFile("Music/Bald Bros - We Are (Radio Edit).mp3", 1024);
          player.play();
          selectTime=millis();
        }
        break;
    }
    
    //Show Combo   
    showCombo(combo);
    fill(255,0,255);
    text("Grade: " + gradeNum,20,590);
    fill(255,255,0);
    
    //游標繪製下降游標及調整Y
    for(i=s,k=0;k<count;i++,k++){
      if(i==ARR_SIZE) i=0;
      if(hid == false){
        if(btnStyle == true) rect(sx[i],sy[i],40,20,18);
        else  image(btn,sx[i],sy[i],40,30);
      }
      else if(hid == true){
        if(btnStyle == true){
          if(sy[i]<380) rect(sx[i],sy[i],40,20,18);
        }
        else{
          if(sy[i]<380) image(btn,sx[i],sy[i],40,30);
        }
      }
      sy[i]+=SPEED;
      
      /*to show good or bad */
      
      if(decide==1){
        fill(255,0,0);
        text("MISS",100,550);
      }
      else if(decide==0){
        fill(0,255,0);
        text("GOOD",100,550); 
      }
      fill(255,255,0);
      if(sy[i]&rt;560){
        decide = 1;
        combo=0;
        bad++; 
        del();
      }
    }
    /*menu click*/
    if(mousePressed&&mouseX&rt;600&&mouseY&rt;450){
       while(count != 0) del();
       selectTime=millis();
       combo=0;
       tmpgrade=gradeNum;
       gradeNum=0;
       typeSel=3;
          rankin=createWriter("data/rank.txt");
          if(limitTime==254000){
            rankin.println((gradeNum&rt;r1?gradeNum:r1)); 
            rankin.println(r2);
          }
          else{
            rankin.println(r1);
            rankin.println((gradeNum&rt;r2?gradeNum:r2)); 
          }
          rankin.flush();
          rankin.close();
          rank=createReader("data/rank.txt");
          for(i=0;i<2;i++){
            try{
                rk = rank.readLine();
                if(i==0) r1= int(rk);
                else if(i==1) r2=int(rk);
                
             } 
             catch (IOException e) {
                e.printStackTrace();
                rk = null;
             }  
          }
       player.pause();
       player = minim.loadFile("Music/Bald Bros - We Are (Radio Edit).mp3", 1024);
       player.play();
    }
    
    break;
  /*Result area*/
  case 3:
    textFont(font, 70);
    if(millis()-selectTime&rt;5000)
      typeSel=1;
    background(255,255,0);
    image(result,171,0,458,650);
    image(goodImg,200,100,100,100);
    image(badImg,200,250,100,100);
    image(grade,150,330,200,150);
    image(resultImg,300,10,200,100);
    image(comboImg,150,480,200,100);
    fill(255,0,255);
    text(good, 350, 180);
    text(bad, 350, 310);
    text(tmpgrade, 340, 420);
    text(maxCombo, 380, 550);
    break;
    
  }
  for(i=0;i<7;i++) image(mu,Msitex[i]-15,Msitey[i]-10,30,20);
  for(i=6;i&rt;0;i--){
    Msitex[i]=Msitex[i-1];
    Msitey[i]=Msitey[i-1]; 
  }
  Msitex[0]=mouseX;
  Msitey[0]=mouseY;
  delay(5);
}

程式碼(以防上面格式跑掉、錯誤的一般格式):


import ddf.minim.*;

AudioPlayer player;
Minim minim;

PFont font;


/*Mouse point*/
PImage mu;                   //mouse image
int[] Msitex=new int[7];     //save mouse site X
int[] Msitey=new int[7];     //save mouse site Y

/*Title use Varible*/
PImage title,nameArea,bomb,example,check;   //Include logo name studID illu
int move = -300,site=0;                     //save motion information
int[] maskArr;                              //use to save alpha value to mask image
float fly=0;                                //use to ellipse motion
int runType=0;                              //decide what kind difficult level

/*Result use*/
int good=0,bad=0,maxCombo=0;                //save good num and bad num
long gradeNum=0,tmpgrade;                            //save grade
PImage result,goodImg,badImg,grade,resultImg,comboImg;  //save image include good bad grade...word

/*Menu Use */
PImage bg_menu,Music1,Music1plus,Music2,Music2plus;    //save music pic
PImage easy,nor,dif;                                   //save difficult level img
PImage easyPlus,norPlus,difPlus;                       //save difficult level img pencil style
PImage btnP;                                           //save another kind btn
PImage hidden,hiddenP;                                 //save word hidden 
PImage exitImg,exitImgP;                               //save word exit
long r1=0,r2=0;                                        //to load highest grade value
String rk;                                             //to scan file's string ( grade )

/* Game Use Varible*/
int SPEED = 5 ,ARR_SIZE=500 , DIFFACULT=9;  //Define
PImage img,lv,btn;                    //背景 combo,按鈕圖片
PImage[] number;               //紀錄數字圖片
PImage menu;                   //to save menu background
float[] sx,sy;                 //下降游標位置
int combo,a,b,c;               //段數
int count,s,sp;                //游標數,柱列指標
int rtime;                     //隨機時間
int i,k;                     //迴圈使用變數
color btn_q,btn_w,btn_e,btn_i,btn_o,btn_p,btn_space;       //按件顏色
boolean[] ctl ;                //控制判斷 X 座標
boolean btnStyle=true;         //按鈕類型
int[] boardX;                  //判斷X邊界 
String tmp,linee;              //to temp file string
long t;                        //to save system time (already colculate
int DELAY = -2250;             //set delay
boolean hid=false;             //choose hidden?
int decide=0;
int tempcount=0; 
int limitTime;
/*Time Controler*/
long selectTime ;
int typeSel=0;   //Start script: 0  menu script: 1 game script: 2 result script: 3

//PrintWriter output;

BufferedReader reader;
BufferedReader rank;
PrintWriter rankin;

void setup()
{
  //宣告陣列
  ctl=new boolean[10];
  boardX=new int[10];
  sx=new float[ARR_SIZE];
  sy=new float[ARR_SIZE];
  number=new PImage[10];
  
  //output = createWriter("2d.txt");

  //size and loadImage
  size(800,600);
  
  font = loadFont("data/txt.vlw");
  
  btn=loadImage("gameUse/btn.png");
  title=loadImage("start/title.png");
  nameArea=loadImage("start/name.png");
  example= loadImage("start/Eg.jpg");
  check=loadImage("start/check.png");
  bg_menu=loadImage("menu/background_menu.jpg");
  Music1=loadImage("menu/1.jpg");
  Music1plus=loadImage("menu/1plus.jpg");
  Music2=loadImage("menu/2.jpg");
  Music2plus=loadImage("menu/2plus.jpg");
  maskArr=new int[nameArea.width * nameArea.height];
  mu=loadImage("start/mu.png");
  easy=loadImage("gameUse/Easy.png");
  nor=loadImage("gameUse/Normal.png");
  dif=loadImage("gameUse/Diffacult.png");
  easyPlus=loadImage("gameUse/EasyPlus.png");
  norPlus=loadImage("gameUse/NormalPlus.png");
  difPlus=loadImage("gameUse/DiffacultPlus.png");
  menu=loadImage("gameUse/menuu.png");
  btnP=loadImage("gameUse/btnP.png");
  hiddenP=loadImage("menu/hiddenP.png");
  hidden=loadImage("menu/hidden.png");
  goodImg=loadImage("result/good.png");
  badImg=loadImage("result/bad.png");
  grade=loadImage("result/grade.png");
  resultImg=loadImage("result/resultWord.png");
  comboImg=loadImage("result/combo.png");
  result=loadImage("background/2.jpg");
  rank=createReader("data/rank.txt");
  exitImg=loadImage("menu/exit.png");
  exitImgP=loadImage("menu/exitP.png");
  for(i=0;i<2;i++){
    try{
        rk = rank.readLine();
        if(i==0) r1= int(rk);
        else if(i==1) r2=int(rk);
        
     } 
     catch (IOException e) {
        e.printStackTrace();
        rk = null;
     }  
  }
  //Set orinage color value
  btn_q=color(255,128,128,150);
  btn_w=color(128,255,128,150);
  btn_e=color(128,128,255,150);
  btn_space=color(255,255,255,150);
  btn_i=color(128,128,255,150);
  btn_o=color(128,255,128,150);
  btn_p=color(255,128,128,150);
  
  //初值化
  for(i=0;i<10;i++) ctl[i]=false;
  rtime=count=sp=s=combo=0;
  
  //Setting Board
  boardX[0]=5;
  boardX[1]=45;
  boardX[2]=85;
  boardX[3]=125;
  boardX[4]=165;
  boardX[5]=205;
  boardX[6]=245;
  
  //音樂
  minim = new Minim(this);
  player = minim.loadFile("Music/Bald Bros - We Are (Radio Edit).mp3", 1024);
}

//顯示combo
void showCombo(int num)
{
  if(num>=100){
    c=num%10;
    num/=10;
    b=num%10;
    num/=10;
    a=num%10;
    image(number[a],240,100,60,80);
    image(number[b],300,100,60,80);
    image(number[c],360,100,60,80);
    image(lv,420,100,330,80);
  }
  else if(num>=10){
    c=num%10;
    num/=10;
    b=num%10;
    image(number[b],300,100,60,80);
    image(number[c],360,100,60,80);
    image(lv,420,100,330,80);
  }
  
}

//刪除元素
void del()
{
  s++;
  count--;
  if(s==ARR_SIZE) s=0;
}

//增加元素
void push(int tx,int ty)
{
  sx[sp]=tx;
  sy[sp++]=ty; 
  count++;
  if(sp==ARR_SIZE) sp=0;
}

//產生下降游標
void btn(int type)
{
  int tx=0,ty=0;
  switch(type)
  {
   case 0: tx=5;break;
   case 1: tx=45;break;
   case 2: tx=85;break;
   case 3: tx=125;break;
   case 4: tx=165;break;
   case 5: tx=205;break;
   case 6: tx=245;break;
  } 
  push(tx,ty); 
}

void keyPressed()
{
  //output.println(millis());
  
  switch(key){
  case 'q': btn_q=color(246,100,196,200);ctl[0]=true;break;
  case 'w': btn_w=color(246,100,196,200);ctl[1]=true;break;
  case 'e': btn_e=color(246,100,196,200);ctl[2]=true;break;
  case 'i': btn_i=color(246,100,196,200);ctl[4]=true;break;
  case 'o': btn_o=color(246,100,196,200);ctl[5]=true;break;
  case 'p': btn_p=color(246,100,196,200);ctl[6]=true;break;
  case ' ': btn_space=color(246,100,196,200);ctl[3]=true;break;
  case '+': if(SPEED<12) SPEED++; DELAY+=250;break;
  case '-': if(SPEED>1) SPEED--; DELAY-=250;break;
  case 'z': if(DIFFACULT > 5) DIFFACULT--;break;
  case 'x': if(DIFFACULT < 20) DIFFACULT++;break;
  case 'c': btnStyle=!btnStyle;break;
  case 'm' :save("C:/save.jpg");break;

  //case 'b': output.flush();output.close();exit();
  
  }
  if(tempcount++<6){
    for(i=0;i<7;i++)
      if(ctl[i] && sy[s]<=560 && sy[s]>510 && sx[s]==boardX[i] ){
        combo++;
        decide = 0;
        gradeNum+=combo*100;
        maxCombo=combo>maxCombo?combo:maxCombo;
        good++;
        del();
        break;
      }
  }
  
}

void keyReleased()
{
  switch(key){
  case 'q': btn_q=color(255,128,128,150); ctl[0]=false; break;
  case 'w': btn_w=color(128,255,128,150); ctl[1]=false; break;
  case 'e': btn_e=color(128,128,255,150); ctl[2]=false; break;
  case ' ': btn_space=color(255,255,255,150); ctl[3]=false; break;
  case 'i': btn_i=color(128,128,255,150); ctl[4]=false; break;
  case 'o': btn_o=color(128,255,128,150); ctl[5]=false; break;
  case 'p': btn_p=color(255,128,128,150); ctl[6]=false; break;
  } 
  tempcount=0;
}
void drawBtnArea()
{
  //游標區域
    strokeWeight(3);
    fill(btn_q);
    rect(5,0,40,540);
    fill(btn_p);
    rect(245,0,40,540);
    fill(btn_w);
    rect(45,0,40,540);
    fill(btn_o);
    rect(205,0,40,540);
    fill(btn_e);
    rect(85,0,40,540);
    fill(btn_i);
    rect(165,0,40,540);
    fill(btn_space);
    rect(125,0,40,540);
    fill(255,255,125);
    rect(5,530,280,30,18);
}
void draw()
{
  
  
  /*Game*/
  switch(typeSel)
  {
  /*Menu*/
  case 0:
    background(0);
    //Start 
    if(millis() < 9000){
      image(title,250,move,300,260);
      if(move<100) move += 2 ;
      else{
        //Show Name's
        nameArea.mask(maskArr);
        image(nameArea,160,350,500,70);
        if(++site < 499) 
          for(i=site;i<35000;i+=225){
            if(i>=35000) break;
            maskArr[i]=250;
          }
          for(i=site++;i<35000;i+=230){
            if(i>=35000) break;
            maskArr[i]=250;
          }
       }
    }
    else{    
    //Waiting and Illustrate  
      image(example,0,0,800,600);
      image(check,550+30*cos(fly),300+60*sin(fly+=0.04),200,50);
      if(mousePressed){
        typeSel = 1 ;
        //Memo Select process time
        player.play();
      }
    }
    break;
    
  case 1:
    /*Menu*/
    image(bg_menu,0,0,800,600);
    good=bad=maxCombo=0;
    decide=2;
    textFont(font,40);
    
    /*Select Music*/
    if(mouseX<225&&mouseX>50&&mouseY<225&&mouseY>50){
      image(Music1,50,50,200,200);
      fill(255,255,0);
      text("Highest Grade",450,450);
      text(r1,450,500);
    }
    else image(Music1plus,50,50,150,150);
    if(mouseX<325&&mouseX>150&&mouseY<445&&mouseY>270){
      image(Music2,150,270,200,200);
      fill(255,255,0);
      text("Highest Grade",450,450);
      text(r2,450,500);
    }
    else image(Music2plus,150,270,140,140);
    
    /*difficult*/
    if(runType==0) image(easy,50,470,120,120);
    else image(easyPlus,50,470,120,120);
    if(runType==1) image(nor,200,460,120,120);
    else image(norPlus,200,460,120,120);
    if(runType==2) image(dif,350,460,120,120);
    else image(difPlus,350,460,120,120);
    
    if(mouseX<800&&mouseX>600&&mouseY<600&&mouseY>500) image(exitImg,600,500,200,100);
    else image(exitImgP,600,500,200,100);
    
    if(btnStyle==true){
      fill(255,255,0);
      strokeWeight(10);
      rect(600,150,120,50,18);
      image(btnP,400,100,150,150);
    }
    else{
     fill(200,200,200);
     strokeWeight(10);
     rect(600,150,120,50,18); 
     image(btn,400,100,150,150);
    }
    
    if(hid==false) image(hiddenP,420,300,300,75);
    else image(hidden,420,300,300,75);
    
    if(mousePressed){
       if(mouseX<800&&mouseX>600&&mouseY<600&&mouseY>500) exit();
       else if(mouseY>460&&mouseY<590){
           if(mouseX<170&&mouseX>50) runType=0;
           else if(mouseX<320&&mouseX>50) runType=1;
           else if(mouseX<470&&mouseX>50) runType=2;  
       }
       else if(mouseY>100&&mouseY<250){
           if(mouseX>400&&mouseX<550) btnStyle=false;
           else if(mouseX>600&&mouseX<720) btnStyle=true;
       }
       else if(mouseY<375&&mouseY>300){
          if(tempcount++==0&&mouseX>420&&mouseX<720) hid = !hid;
       }
    }
    else tempcount = 0;
    
    /*Music*/
    if(mousePressed){
       if(mouseX<225&&mouseX>50&&mouseY<225&&mouseY>50){
         img = loadImage("background/1.jpg");
         result=loadImage("menu/1.jpg");
         lv= loadImage("gameUse/lv.png");
         DIFFACULT=9;
         SPEED=5;
         limitTime=254000;
         for(i=0;i<10;i++){
           tmp = i + ".png";
           number[i]=loadImage("number/" + tmp); 
         }
   
         if(runType==0){
           reader = createReader("btn/positions.txt"); 
           DELAY = -2160;
         }
         else if(runType==1){
           reader = createReader("btn/1d.txt"); 
           DELAY = -4600;
         }
         if(runType!=2) runType=0;
         if(runType!=2){
           try{
              linee = reader.readLine();
              t=int(linee) + DELAY ;
           } 
           catch (IOException e){
              e.printStackTrace();
              linee = null;
           }
         }
         player.pause();
         player = minim.loadFile("Music/04 Happy End.mp3", 1024);
         player.play();
         typeSel=2;
         selectTime=millis();
       }
       else if(mouseX<325&&mouseX>150&&mouseY<445&&mouseY>270){
         img = loadImage("background/2.jpg");
         result=loadImage("menu/2.jpg");
         
         DIFFACULT=7;
         SPEED=5;
         limitTime=209000;
         lv= loadImage("gameUse/cbo.png");
         
         for(i=0;i<10;i++){
           tmp = i + "a" + ".png";
           number[i]=loadImage("number/" + tmp); 
         }
         
         if(runType==0){
           reader = createReader("btn/2.txt");
           DELAY = -1650; 
         }
         else if(runType==1){
           reader = createReader("btn/2d.txt");
           DELAY = -1950; 
         }
         if(runType!=2) runType=0;
         if(runType!=2){
           try{
              linee = reader.readLine();
              t=int(linee) + DELAY ;
           } 
           catch (IOException e){
              e.printStackTrace();
              linee = null;
           }
         }
         player.pause();
         player = minim.loadFile("Music/03 I'm OK.mp3", 1024);
         player.play();
         typeSel=2;
         selectTime=millis();
       }
    }
    break;
       
  case 2:
    rtime++;
    image(img,0,0,800,600);
    image(menu,600,450,200,130);
    drawBtnArea();
    
    //產生游標
    
    switch(runType)
    {
      case 0:  
      /*easy and normal mode about*/
        if(t<-50000){
          typeSel=3;
          rankin=createWriter("data/rank.txt");
          if(limitTime==254000){
            rankin.println((gradeNum>r1?gradeNum:r1)); 
            rankin.println(r2);
          }
          else{
            rankin.println(r1);
            rankin.println((gradeNum>r2?gradeNum:r2)); 
          }
          rankin.flush();
          rankin.close();
          rank=createReader("data/rank.txt");
          for(i=0;i<2;i++){
            try{
                rk = rank.readLine();
                if(i==0) r1= int(rk);
                else if(i==1) r2=int(rk);
                
             } 
             catch (IOException e) {
                e.printStackTrace();
                rk = null;
             }  
          }
        }
        else if(millis()-selectTime>t){
          btn((int)random(0,6.99));
          
          try{
            linee = reader.readLine();
            t=int(linee) + DELAY;
          }
          catch(IOException e) 
          {
            
          }
          
        }
        break;
        
      case 2:
      /*difficult mode product about*/
        if((rtime%DIFFACULT)==0) btn((int)random(0,6.99));
        if(millis()-selectTime>limitTime){
          typeSel=3;
          rankin=createWriter("data/rank.txt");
          if(limitTime==254000){
            rankin.println((gradeNum>r1?gradeNum:r1)); 
            rankin.println(r2);
          }
          else{
            rankin.println(r1);
            rankin.println((gradeNum>r2?gradeNum:r2)); 
          }
          rankin.flush();
          rankin.close();
          rank=createReader("data/rank.txt");
          for(i=0;i<2;i++){
            try{
                rk = rank.readLine();
                if(i==0) r1= int(rk);
                else if(i==1) r2=int(rk);
                
             } 
             catch (IOException e) {
                e.printStackTrace();
                rk = null;
             }  
          }
          tmpgrade=gradeNum;
          gradeNum=0;
          while(count!=0) del(); 
          player.pause();
          player = minim.loadFile("Music/Bald Bros - We Are (Radio Edit).mp3", 1024);
          player.play();
          selectTime=millis();
        }
        break;
    }
    
    //Show Combo   
    showCombo(combo);
    fill(255,0,255);
    text("Grade: " + gradeNum,20,590);
    fill(255,255,0);
    
    //游標繪製下降游標及調整Y
    for(i=s,k=0;k<count;i++,k++){
      if(i==ARR_SIZE) i=0;
      if(hid == false){
        if(btnStyle == true) rect(sx[i],sy[i],40,20,18);
        else  image(btn,sx[i],sy[i],40,30);
      }
      else if(hid == true){
        if(btnStyle == true){
          if(sy[i]<380) rect(sx[i],sy[i],40,20,18);
        }
        else{
          if(sy[i]<380) image(btn,sx[i],sy[i],40,30);
        }
      }
      sy[i]+=SPEED;
      
      /*to show good or bad */
      
      if(decide==1){
        fill(255,0,0);
        text("MISS",100,550);
      }
      else if(decide==0){
        fill(0,255,0);
        text("GOOD",100,550); 
      }
      fill(255,255,0);
      if(sy[i]>560){
        decide = 1;
        combo=0;
        bad++; 
        del();
      }
    }
    /*menu click*/
    if(mousePressed&&mouseX>600&&mouseY>450){
       while(count != 0) del();
       selectTime=millis();
       combo=0;
       tmpgrade=gradeNum;
       gradeNum=0;
       typeSel=3;
          rankin=createWriter("data/rank.txt");
          if(limitTime==254000){
            rankin.println((gradeNum>r1?gradeNum:r1)); 
            rankin.println(r2);
          }
          else{
            rankin.println(r1);
            rankin.println((gradeNum>r2?gradeNum:r2)); 
          }
          rankin.flush();
          rankin.close();
          rank=createReader("data/rank.txt");
          for(i=0;i<2;i++){
            try{
                rk = rank.readLine();
                if(i==0) r1= int(rk);
                else if(i==1) r2=int(rk);
                
             } 
             catch (IOException e) {
                e.printStackTrace();
                rk = null;
             }  
          }
       player.pause();
       player = minim.loadFile("Music/Bald Bros - We Are (Radio Edit).mp3", 1024);
       player.play();
    }
    
    break;
  /*Result area*/
  case 3:
    textFont(font, 70);
    if(millis()-selectTime>5000)
      typeSel=1;
    background(255,255,0);
    image(result,171,0,458,650);
    image(goodImg,200,100,100,100);
    image(badImg,200,250,100,100);
    image(grade,150,330,200,150);
    image(resultImg,300,10,200,100);
    image(comboImg,150,480,200,100);
    fill(255,0,255);
    text(good, 350, 180);
    text(bad, 350, 310);
    text(tmpgrade, 340, 420);
    text(maxCombo, 380, 550);
    break;
    
  }
  for(i=0;i<7;i++) image(mu,Msitex[i]-15,Msitey[i]-10,30,20);
  for(i=6;i>0;i--){
    Msitex[i]=Msitex[i-1];
    Msitey[i]=Msitey[i-1]; 
  }
  Msitex[0]=mouseX;
  Msitey[0]=mouseY;
  delay(5);
}