顯示具有 99163072盧彥佑 標籤的文章。 顯示所有文章
顯示具有 99163072盧彥佑 標籤的文章。 顯示所有文章

2014年1月12日 星期日

99163072 99163134 第十九周 期末作品

遊戲小精靈
遊戲名稱:小精靈
遊戲網址:http://my-gamer.com/games/gj540.html
遊戲說明:將黃色小點點吃完,並且不能被小怪物碰到,中點點吃到可以讓     小精靈移動速度變快,且可以吃掉小怪物,碰到小怪物就死掉。

操作說明:
   小精靈移動的方法,可以利用ARDUINO的旋轉來操作。


遊戲腳色



ARDUINO 硬體程式碼

int const potPin = A0;
int const potPin1 = A1;
int potValue;
int potValue1;
int angle;
int angle1;


void setup () {

  Serial.begin(9600);
}

void loop () {

  potValue = analogRead(potPin);
  potValue1 = analogRead(potPin1);

  potValue = constrain(potValue,0,1000);
  angle= map(potValue, 0, 1023, 0, 179);
  angle1= map(potValue1, 0, 1023, 0, 179);

if(0<angle && 30>angle)
  {
    Serial.print("d");
  }

  else if (115<angle && 180>angle)
  {
    Serial.print("a");
  }
else{
  if(0<angle1 && 30>angle1)
    {
      Serial.print("w");
    }
    else if (115<angle1 && 180>angle1)
    {
      Serial.print("s");
    }

}
  delay(15);
}


processing 程式碼

import processing.serial.*;
Serial myPort;
PImage [] master  = new PImage[8];
PImage [] monster  = new PImage[4];
int masterX, masterY;
int masterVX, masterVY;
boolean keyW = false;
boolean keyS = false;
boolean keyA = true;
boolean keyD = true;
byte [][] maze = new byte[33][32];
byte [][] mode = new byte[33][32];
short [][] wigh = new short[33][32];
char now = 0;
String [] name = new String[11];
int j = 0, k;
int i = 4;
int time = 0;
int [] monsterX = new int[4];
int [] monsterY = new int[4];
int [] monsterVX = new int[4];
int [] monsterVY = new int[4];
int [] delatetime = new int [4];
boolean checkvalueX, checkvalueY;
int stage = 1;
int hacktime = 0;
boolean hackmode = false;
void setup() {
  size(20*30, 20*33);
  byte [] b = loadBytes("maze1.txt");
  byte [] m = loadBytes("mode.txt");
  for (int f = 0 ; f < 33*32; f++) {
    maze[int (f/32)][f%32] = b[f];
    mode[int (f/32)][f%32] = m[f];
    char c = (char)b[f];
    if (b[f] == '.') wigh[int (f/32)][f%32] = 1;
    else if (b[f] == 'o')wigh[int (f/32)][f%32] = 3;
    else wigh[int (f/32)][f%32] = 0;
  }
  textSize(20);
  for (int i = 0 ; i < 8 ; i++) {
    name[i] = "gg" + i + ".png";
    master[i] = loadImage(name[i]);
  }
  for (int i = 0 ; i < 4 ; i++) {
    name[i] = "monster" + i + ".png";
    monster[i] = loadImage(name[i]);
  }
  drawpic();
  for (int i = 0 ; i < 4 ; i++) {
    monsterVX[i] = -5;
    delatetime[i] = 300*(i+1);
    masterVX = -5;
  }
  myPort = new Serial(this, "COM3", 9600);
}
int cc;
void draw() {
  if (stage == 1) {
    hacktime++;
  if(myPort.available()>0){
   now = (char)myPort.read();//第三個重點:如果讀到數字就拿出來用
 
  }
    print(now+"\t");
    hacktime = hacktime % 360;
    if (hacktime == 0) {
      hackmode = !hackmode;
    }
    drawpic();
    drawmaster();
    checkpoint();
    for (int i = 0 ; i < 4 ; i++) {
      drawmoster(monsterX[i], monsterY[i], monsterVX[i], monsterVY[i], i, delatetime[i]);
      monsterAttack(monsterX[i]+290, monsterY[i]+310, masterX+300, masterY+490);
    }
    int speed = 5;
    switch((char)now) {
    case 's':
      if (keyS) {
        masterVY = speed;
        masterVX = 0;
      }
      break;
    case 'w':
      if (keyW) {
        masterVY = -speed;
        masterVX = 0;
      }
      break;
    case 'a':
      if (keyA) {
        masterVY = 0;
        masterVX = -speed;
      }
      break;
    case 'd':
      if (keyD) {
        masterVY = 0;
        masterVX = speed;
      }
      break;
    case ' ':
      masterVY = 0;
      masterVX = 0;
      break;
    }
    if (keyA && keyD && (300+masterX)%20!=15) {
      keyW = false;
      keyS = false;
    }
    else if (keyW && keyS && (490+masterY)%20 != 10) {
      keyA = false;
      keyD = false;
    }
    masterX += masterVX;
    masterY += masterVY;
    pushMatrix();
    if (masterVX !=0||masterVY !=0)time = (time+1)%4;
    if (masterVX !=0&&masterVY !=0)time = 0;
    imageMode(CENTER);
    if (masterVY > 0) {
      i = 2;
    }
    else if (masterVY < 0) {
      i = 6;
    }
    else if (masterVX < 0) {
      i = 4;
    }
    else if (masterVX > 0) {
      i = 0;
    }
    if (time == 2) j = (j+1)%2;
    k = j + i;
    image(master[k], 290+masterX, 490+masterY, 30, 30);
    popMatrix();
  }
}

/*void keyPressed() {
  now = key;
}*/
void drawpic() {
  background(0);
  stroke(11, 38, 160);
  strokeWeight(3);
  for (int i = 0 ; i < 32*33; i++) {
    int y = 20*int(i/32), x = 20*(i%32);
    char c = (char)maze[int(i/32)][i%32];
    switch(c) {
    case '|' :
      stroke(11, 38, 160);
      line(x+10, y, x+10, y+20);
      break;
    case '-' :
      stroke(11, 38, 160);
      line(x, y+10, x+20, y+10);
      break;
    case '1' :
      stroke(11, 38, 160);
      noFill();
      arc(x+20, y+20, 20, 20, PI, PI*3/2);
      break;
    case '2' :
      stroke(11, 38, 160);
      noFill();
      arc(x, y+20, 20, 20, PI*3/2, PI*2);
      break;
    case '3' :
      stroke(11, 38, 160);
      noFill();
      arc(x+20, y, 20, 20, PI/2, PI);
      break;
    case '4' :
      stroke(11, 38, 160);
      noFill();
      arc(x, y, 20, 20, 0, PI/2);
      break;
    }
  }
}
void checkpoint() {
  for (int i = 0 ; i < 32*33; i++) {
    int y = 20*int(i/32), x = 20*(i%32);
    char c = (char)maze[int(i/32)][i%32];
    if (wigh[int(i/32)][i%32] ==1)if (dist(490+masterY, 290+masterX, (y+10), (x+10))<=15) wigh[int(i/32)][i%32] = 2;
    if (wigh[int(i/32)][i%32] ==3)if (dist(490+masterY, 290+masterX, (y+10), (x+10))<=15) wigh[int(i/32)][i%32] = 4;
    if ( c == '.') {
      if (wigh[int(i/32)][i%32]==1) {
        stroke(255);
        fill(255);
        ellipse(x+10, y+10, 1, 1);
      }
    }
    else if (  c == 'o') {
      if (wigh[int(i/32)][i%32]==3) {
        stroke(255);
        fill(255);
        ellipse(x+10, y+10, 10, 10);
      }
    }
  }
}
void drawmaster() {
  char c = (char)mode[(490+masterY)/20][(290+masterX)/20];
  switch(c) {
  case 'q':
    if ( (300+masterX)%20 == 15 ) if (masterVX < 0) masterVX = 0;
    if ( (490+masterY)%20 == 10 ) if (masterVY < 0) masterVY = 0;
    keyW = false;
    keyS = true;
    keyA = false;
    keyD = true;
    break;
  case 'w':
    if ((490+masterY)%20 == 10 )  if (masterVY < 0) masterVY = 0;
    keyW = false;
    keyS = true;
    keyA = true;
    keyD = true;
    break;
  case 'e':
    if ((300+masterX)%20 ==15) if (masterVX > 0) masterVX = 0;
    if ((490+masterY)%20 == 10 ) if (masterVY < 0) masterVY = 0;
    keyW = false;
    keyS = true;
    keyA = true;
    keyD = false;
    break;
  case 'a':
    if ( (300+masterX)%20 ==15) if (masterVX < 0) masterVX = 0;
    keyW = true;
    keyS = true;
    keyA = false;
    keyD = true;
    break;
  case 's':
    keyW = true;
    keyS = true;
    keyA = true;
    keyD = true;
    break;
  case 'd':
    if ( (300+masterX)%20 ==15) if (masterVX > 0) masterVX = 0;
    keyW = true;
    keyS = true;
    keyA = true;
    keyD = false;
    break;
  case 'z':
    if ((300+masterX)%20 == 15 ) if (masterVX < 0) masterVX = 0;
    if ((490+masterY)%20 == 10 ) if (masterVY > 0) masterVY = 0;
    keyW = true;
    keyS = false;
    keyA = false;
    keyD = true;
    break;
  case 'x':
    if ((490+masterY)%20 == 10) if (masterVY > 0) masterVY = 0;
    keyW = true;
    keyS = false;
    keyA = true;
    keyD = true;
    break;
  case 'c':
    if ((300+masterX)%20 ==15) if (masterVX > 0) masterVX = 0;
    if ((490+masterY)%20 == 10) if (masterVY > 0) masterVY = 0;
    keyW = true;
    keyS = false;
    keyA = true;
    keyD = false;
    break;
  case '0':
    masterVY = 0;
    keyW = false;
    keyS = false;
    keyA = true;
    keyD = true;
    break;
  case '9':
    masterVX = 0;
    keyW = true;
    keyS = true;
    keyA = false;
    keyD = false;
    break;
  }
}
void drawmoster(int x, int y, int vx, int vy, int i, int time) {
  char c = (char)mode[(310+y)/20][(290+x)/20];

  if ( time !=0 ) {
    delatetime[i]--;
    switch(c) {
    case '<':
      if ((290+x)%20 ==15) vx = -vx;
      break;
    case '>':
      if ((290+x)%20 ==15) vx = -vx;
      break;
    }
  }
  else {
    if (!hackmode) {
      int a = (int)random(2);
      int b = (int)random(3);
      int l = (int)random(4);
      switch(c) {
      case '<':
        if ((290+x)%20 == 15) vx = -vx;
        break;
      case '>':
        if ((290+x)%20 == 15) vx = -vx;
        break;
      case '^':
        if ((290+x)%20 == 15) {
          vx = 0;
          vy = -5;
        }
        break;
      case '!':

        if ( a == 1 ) {
          vx = 5;
        }
        else {
          vx = -5;
        }        
        vy = 0;
        break;
      case 'q':
        checkvalueX = vx!=0 && (290+x)%20==15;
        checkvalueY = vy!=0 && (310+y)%20==10;
        if (checkvalueX || checkvalueY) {
          if ( a == 1 ) {
            vx = 5;
            vy = 0;
          }
          else {
            vx = 0;
            vy = 5;
          }
        }
        break;
      case 'w':
        if ( (290+x)%20 == 15 && (310+y)%20 == 10) {

          if ( b == 1 ) {
            vx = 5;
            vy = 0;
          }
          else if (b==2) {
            vx = -5;
            vy = 0;
          }
          else {
            vx = 0;
            vy = 5;
          }
        }
        break;
      case 'e':
        checkvalueX = vx!=0 && (290+x)%20==15;
        checkvalueY = vy!=0 && (310+y)%20==10;
        if (checkvalueX || checkvalueY) {
          if ( a == 1 ) {
            vx = -5;
            vy = 0;
          }
          else {
            vx = 0;
            vy = 5;
          }
        }
        break;
      case 'a':
        if ( (290+x)%20 == 15 && (310+y)%20 == 10) {

          if ( b == 1 ) {
            vx = 5;
            vy = 0;
          }
          else if (b==2) {
            vx = 0;
            vy = -5;
          }
          else {
            vx = 0;
            vy = 5;
          }
        }
        break;
      case 's':
        if ( (290+x)%20 == 15 && (310+y)%20 == 10) {
          if ( l == 1 ) {
            vx = 5;
            vy = 0;
          }
          else if (l==2) {
            vx = -5;
            vy = 0;
          }
          else if (l==3) {
            vx = 0;
            vy = 5;
          }
          else {
            vx = 0;
            vy = -5;
          }
        }
        break;
      case 'd':
        if ( (290+x)%20 == 15 && (310+y)%20 == 10) {
          if ( b == 1 ) {
            vx = -5;
            vy = 0;
          }
          else if (b==2) {
            vx = 0;
            vy = -5;
          }
          else {
            vx = 0;
            vy = 5;
          }
        }
        break;
      case 'z':
        checkvalueX = vx!=0 && (290+x)%20==15;
        checkvalueY = vy!=0 && (310+y)%20==10;
        if (checkvalueX || checkvalueY) {
          if ( a == 1 ) {
            vx = 5;
            vy = 0;
          }
          else {
            vx = 0;
            vy = -5;
          }
        }
        break;
      case 'x':
        if ( (290+x)%20 == 15 && (310+y)%20 == 10) {
          if ( c == 1 ) {
            vx = 5;
            vy = 0;
          }
          else if (c==2) {
            vx = -5;
            vy = 0;
          }
          else {
            vx = 0;
            vy = -5;
          }
        }
        break;
      case 'c':
        checkvalueX = vx!=0 && (290+x)%20==15;
        checkvalueY = vy!=0 && (310+y)%20==10;
        if (checkvalueX || checkvalueY) {
          if ( a == 1 ) {
            vx = -5;
            vy = 0;
          }
          else {
            vx = 0;
            vy = -5;
          }
        }
        break;
      }
    }
    else {
      switch(c) {
      case '<':
        if ((290+x)%20 == 15) vx = -vx;
        break;
      case '>':
        if ((290+x)%20 == 15) vx = -vx;
        break;
      case '^':
        if ((290+x)%20 == 15) {
          vx = 0;
          vy = -5;
        }
        break;
      case '!':
        if ( (300+masterX)- (290+x)>=0) {
          vx = 5;
        }
        else {
          vx = -5;
        }        
        vy = 0;
        break;
      case 'q':
        checkvalueX = vx!=0 && (290+x)%20==15;
        checkvalueY = vy!=0 && (310+y)%20==10;
        if (checkvalueX||checkvalueY) {
          if ((300+masterX)- (290+x)>=0) {
            vx = 5;
            vy = 0;
          }
          else if ((490+masterY)- (310+y)>=0) {
            vx = 0;
            vy = 5;
          }
          else {
            vx = -vx;
            vy = -vy;
          }
        }
        break;
      case 'w':
        if ( (290+x)%20 == 15 && (310+y)%20 == 10) {
          if ((300+masterX)- (290+x)>=0) {
            vx = 5;
            vy = 0;
          }
          else if ((300+masterX)- (290+x)<=0) {
            vx = -5;
            vy = 0;
          }
          else if ((490+masterY)- (310+y)>=0) {
            vx = 0;
            vy = 5;
          }
          else {
            vx = -vx;
            vy = -vy;
          }
        }
        break;
      case 'e':
        checkvalueX = vx!=0 && (290+x)%20==15;
        checkvalueY = vy!=0 && (310+y)%20==10;
        if (checkvalueX||checkvalueY) {
          if ((300+masterX)- (290+x)<=0) {
            vx = -5;
            vy = 0;
          }
          else if ((490+masterY)- (310+y)>=0) {
            vx = 0;
            vy = 5;
          }
          else {
            vx = -vx;
            vy = -vy;
          }
        }
        break;
      case 'a':
        if ( (290+x)%20 == 15 && (310+y)%20 == 10) {
          if ((300+masterX)- (290+x)>=0) {
            vx = 5;
            vy = 0;
          }
          else if ((490+masterY)- (310+y)<=0) {
            vx = 0;
            vy = -5;
          }
          else if ((490+masterY)- (310+y)>=0) {
            vx = 0;
            vy = 5;
          }
          else {
            vx = -vx;
            vy = -vy;
          }
        }
        break;
      case 's':
        if ( (290+x)%20 == 15 && (310+y)%20 == 10) {
          if ((300+masterX)- (290+x)>=0) {
            vx = 5;
            vy = 0;
          }
          else if ((300+masterX)- (290+x)<=0) {
            vx = -5;
            vy = 0;
          }
          else if ((490+masterY)- (310+y)>=0) {
            vx = 0;
            vy = 5;
          }
          else {
            vx = -vx;
            vy = -vy;
          }
        }
        break;
      case 'd':
        if ( (290+x)%20 == 15 && (310+y)%20 == 10) {
          if ((300+masterX)- (290+x)<=0) {
            vx = -5;
            vy = 0;
          }
          else if ((490+masterY)- (310+y)<=0) {
            vx = 0;
            vy = -5;
          }
          else if ((490+masterY)- (310+y)>=0) {
            vx = 0;
            vy = 5;
          }
          else {
            vx = -vx;
            vy = -vy;
          }
        }
        break;
      case 'z':
        checkvalueX = vx!=0 && (290+x)%20==15;
        checkvalueY = vy!=0 && (310+y)%20==10;
        if (checkvalueX||checkvalueY) {
          if ((300+masterX)- (290+x)>=0) {
            vx = 5;
            vy = 0;
          }
          else if ((490+masterY)- (310+y)<=0) {
            vx = 0;
            vy = -5;
          }
          else {
            vx = -vx;
            vy = -vy;
          }
        }
        break;
      case 'x':
        if ( (290+x)%20 == 15 && (310+y)%20 == 10) {
          if ((300+masterX)- (290+x)<=0) {
            vx = 5;
            vy = 0;
          }
          else if ((300+masterX)- (290+x)<=0) {
            vx = -5;
            vy = 0;
          }
          else if ((490+masterY)- (310+y)>=0) {
            vx = 0;
            vy = -5;
          }
          else {
            vx = -vx;
            vy = -vy;
          }
        }
        break;
      case 'c':
        checkvalueX = vx!=0 && (290+x)%20==15;
        checkvalueY = vy!=0 && (310+y)%20==10;
        if (checkvalueX||checkvalueY) {
          if ((300+masterX)- (290+x)<=0) {
            vx = -5;
            vy = 0;
          }
          else if ((490+masterY)- (310+y)<=0) {
            vx = 0;
            vy = -5;
          }
          else {
            vx = -vx;
            vy = -vy;
          }
        }
        break;
      }
    }
  }
  monsterX[i] += vx;
  monsterY[i] += vy;
  x = monsterX[i];
  y = monsterY[i];
  monsterVX[i] = vx;
  monsterVY[i] = vy;
  image(monster[i], 290+x, 310+y, 30, 30);
}
void monsterAttack(int x, int y, int x1, int y1) {
  if (dist(x, y, x1, y1) <= 30) {
    stage = 2;
  }
}

硬體設備裝置

硬體操作外觀

硬體內部細節

紅色部分的操作為向左邊走與向右邊走
黑色部分的操作為向上面走與向下面走




影片DEMO

實行成果



電腦側錄情形

2013年12月29日 星期日

Week17 期末作品

硬體程式碼
int const potPin = A1;
int const potPin1 = A0;
int potValue;
int potValue1;
int angle;
int angle1;


void setup () {

  Serial.begin(9600);
}

void loop () {

  potValue = analogRead(potPin);
  potValue1 = analogRead(potPin1);

  Serial.print("Potentiometer Value: ");
  Serial.print(potValue);
  Serial.print("Potentiometer Value1: ");
  Serial.print(potValue1);
// potValue = constrain(potValue,0,1000);
  angle= map(potValue, 0, 1023, 0, 179);
  angle1= map(potValue1, 0, 1023, 0, 179);

  Serial.print("\t \t Motor Angle: ");
  Serial.println(angle);

  Serial.print("\t \t Motor Angle1: ");
  Serial.println(angle1);


  delay(15);
}
硬體部分

硬體操作外觀

內部細節

2013年12月16日 星期一

Week15 期末作品企劃

第1 2節
探討如何接arduino 的路線控制鈕

int buttonPin1 = 2;
int buttonPin2 = 3;
int buttonPin3 = 4;
int buttonPin4 = 5;

int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;
int buttonState4 = 0;

void setup() {

  Serial.begin(9600);
  pinMode(buttonPin1, INPUT);  
  pinMode(buttonPin2, INPUT);  
  pinMode(buttonPin3, INPUT);  
  pinMode(buttonPin4, INPUT);  

}

void loop() {
  buttonState1 = digitalRead(buttonPin1);
  buttonState2 = digitalRead(buttonPin2);
  buttonState3 = digitalRead(buttonPin3);
  buttonState4 = digitalRead(buttonPin4);

  if (buttonState1 == HIGH) {  
   Serial.write('W');
  }
  if (buttonState2 == HIGH) {  
   Serial.print('S');
  }
  if (buttonState3 == HIGH) {  
   tone(8, 165 , 300);
   Serial.print('A');
  }
  if (buttonState4 == HIGH) {  
   tone(8, 175 , 300);
   Serial.print('D');
  }
  delay(100);
}

2013年12月8日 星期日

Week14 期末作品企劃

第一節討論期末作品
 
遊戲名稱:小精靈
遊戲網址:http://my-gamer.com/games/gj540.html
遊戲說明:將黃色小點點吃完,並且不能被小怪物碰到,即可進行下一關,中點點吃到可以讓     小精靈移動速度變快,且可以吃掉小怪物,並且加更多分數,當分數到達一定分數時可以加   生命,為吃到中點點時,碰到小怪物就死掉,一開始有3條生命。
 
操作說明:
   小精靈移動的方法,可以利用ARDUINO 按鈕操作, 如果可以用搖桿則會以搖桿改來操作。


第二、三節開始製作作品腳色

小精靈*1

 

怪物*4
 



2013年12月1日 星期日

WEEK13,課堂作業

第一節課
Project 05  MOOD CUE

利用SPAIN的旋轉角度來控制馬達旋轉角度






第二節課
Project 06  Light Theremin

利用光線的變化控制音頻大小







第三節課
Project 07 Keyboard Instrument

利用4個按鈕控制固定音頻





Project 08 Digital Hourglass

利用Switch 的變換,讓所有的燈泡不亮


2013年11月24日 星期日

WEEK12,課堂作業

第1節課
Project 03 Love-O-Meter 溫度測試亮燈

隨著溫度的上升,讓燈泡亮起來,
起始是30度,當溫度達到32度時,亮起第1個燈,
34度的時候亮第2個燈,36度時是第3個燈,30度以下不亮燈
當我們握著TMP36的器材,我們實際測得溫度介於33-34度
可由影片得知,亮燈的情況




第2節課
Project 04 Color Mixing Lamp 改變顏色
利用光敏電阻,當手壓著光敏電阻,讓LED燈該顏色不會亮。
我們的光敏電阻順序為:紅色、綠色、藍色
當我們壓色紅色時此紅色不會亮,只會呈現其他兩種顏色,
其他顏色,同樣道理,可以呈現不同的顏色。
由影片得知,亮燈的情況





2013年11月17日 星期日

WEEK11,課堂作業

第一、二節課教學如何使用Arudino的工具
  (1)插入Arudino硬體,
  (2)跑Arudino軟體
  File-Example
  Basic-Blink
  (3)範例Blink
  改delay(1000)慢閃
      delay(200)快閃

自己打的程式碼
void setup(){
pinMode(13,OUTPUT);
}
void loop(){
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(500);
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(500);
}


實作的Arudino硬體
第三節程式碼
void setup(){
pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
pinMode(11,OUTPUT);

}
void loop(){
digitalWrite(13, HIGH);
delay(200);
digitalWrite(12, HIGH);
delay(400);
digitalWrite(11, HIGH);
delay(600);

digitalWrite(13, LOW);
delay(200);
digitalWrite(12, LOW);
delay(400);
digitalWrite(11, LOW);
delay(600);

修改程式,變成展得比較特別的作法





2013年11月10日 星期日

第十週期中作品展示

youtube影片介紹:

簡介:
遊戲說明:當隨機一顆球出現時,請點選他,他會開始往下掉,如果掉到底部就輸了,點選他之後會分裂變小,最終遊戲沒有球在螢幕上,就輸了,點選到球就有分數,點到越小顆的球分數越高。
進階遊戲可以兩人一組一起操作讓分數更高,且附遊戲說明。
遊戲目的:訓練眼睛和手的反應速度。
組員:簡尉倫99163134



2013年10月28日 星期一

WEEK08,期中作業

組員: 99163072盧彥佑
          99163134簡尉倫
遊戲名稱:BALLS BOMB!!


第一節
討論期中作業以及想法

第二節、第三節
將程式碼修改,新增封面和結束畫面、可以選取按鈕、跑分數。

float [] ballX = new float [50];
float [] ballY = new float [50];
float [] ballVX = new float [50];
float [] ballVY = new float [50];
float [] ballR = new float [50];
int h = 600;
int w = 600;
int test = 0;
int aa = 0, bb = 0;
int stage =0;   //控制目前場景位置
PImage [] game = new PImage [11];
PImage bkImage ;
String [] name = new String [11];
int moteX = 0, moteY = 0, mote = 0;   //切割按鈕位置用
int checkanswer = 0;           //title控制按鈕
int checktime = 0;             //讓大球跑一遍
void setup() {
  size(h, w);
  for (int i = 0 ; i < 11; i++) {
    name[i] = "title"+ i + ".png";
    game[i] = loadImage(name[i]);
  }
  bkImage = loadImage("bk.png");
}
void draw() {
  switch(stage) {
  case 0:
    image(bkImage, 0, 0, w, h);
    image(game[0], w/8, h/8, w/8*6, h/8);
    for (int i=1 ; i<=4;i++) {
      image(game[i], w/4 + w/8, h/8*(2+i), w/2-(w/4), h/16);
    }
    moteX = mouseX - w/4 - w/8;
    moteY = mouseY - h/8*3;
    if ( moteX >= 0 && moteX /(w/4) == 0 ) {
      mote = moteY /  (h/8/2)+2;
      if ( mote%2 == 0 && mote < 9 && moteY > 0) {
        image(game[mote/2+4], w/4+ w/8, h/8*(2+mote/2), w/2-(w/4), h/16);
        checkanswer = mote/2;
      }
      else checkanswer =0;
    }
    checktime = 0;
    aa = 0;
    bb = 0;
    break;
  case 1:
    background(255);
    noStroke();
    fill(0, 255, 255);
    if (checktime==0) {
      ballX[0] = w/8*4 ;
      ballY[0] = w/8*3/2;
      ballVX[0] = 0 ;
      ballVY[0] = 0.5;
      ballR[0] = w/8*3;
      checktime++;
    }
    for (int i = 0;i<50;i++) {
      ellipse(ballX[i], ballY[i], ballR[i], ballR[i]);
      if (ballX[i] != 0) ballVY[i] +=0.15;
      ballX[i] += ballVX[i];
      ballY[i] += ballVY[i];
    }
    attack();
    balls();
    releaseball();
    fill(255, 0, 0);
    textSize(20);
    text("grade:" + aa, 20, 20, 100, 50);
    endgame();
    break;
  case 2 :
    break;
  case 3 :
    text("grade:" + aa, 20, 20, 100, 50);
    break;
  case 4:
    exit();
    break;
  case 10 :
    background(0);
    fill(255, 0, 0);
    textSize(100);
    text("GAME OVER!!", w/4, h/4-h/8, w/2, h/2);
    fill(255, 128, 0);
    textSize(50);
    if (bb<aa) {
      bb++;
    }
    if (bb/1000!=0) text("grade:" + bb, w/4, h*4/8+h/16, w/8*7, h/8);
    else if (bb/100!=0) text("grade:0" + bb, w/4, h*4/8+h/16, w/8*7, h/8);
    else if (bb/10!=0) text("grade:00" +bb, w/4, h*4/8+h/16, w/8*7, h/8);
    else  text("grade:000" + bb, w/4, h*4/8+h/16, w/8*7, h/8);
    image(game[10],w/4-w/8, h/8*6, w/2-(w/4), h/16);
    image(game[8],w/2+w/8, h/8*6, w/2-(w/4), h/16);
    if (mouseX >= w/4-w/8 && mouseX <= w/2 - w/8 && mouseY >= h/8*6 && mouseY <= h/8*6 + h/16){
      image(game[9],w/4-w/8, h/8*6, w/2-(w/4), h/16);
      checkanswer =1;
    }else if(mouseX >= w/2+w/8 && mouseX <= w - w/8 && mouseY >= h/8*6 && mouseY <= h/8*6 + h/16){
      image(game[4],w/2+w/8, h/8*6, w/2-(w/4), h/16);
      checkanswer =2;
    }else checkanswer =0;
    break;
  }
}
void keyPressed() {
  switch(stage) {
  case 1:
    break;
  }
}
void mousePressed() {
  switch(stage) {
  case 0:
    if (checkanswer == 1) stage =1;
    if (checkanswer == 2) stage =2;
    if (checkanswer == 3) stage =3;
    if (checkanswer == 4) stage =4;
    break;
  case 1:
    for (int i = 0;i<50;i++) {
      if (dist (ballX[i], ballY[i], mouseX, mouseY)<=(ballR[i]/2)) {
        if (ballR[i]/2 <= 15 && ballR[i]/2 != 0) {
          aa += int (w*9/8/ ballR[i]);
          bigball(i);
        }
        else {
          aa += int (w*9/8 / ballR[i]);
          if ((mouseX - ballR[i]/10) - ballR[i]*1/3 <= 0) {
            ballY[i] = ballY[i];
            ballVY[i] = -ballVY[i] + random(1);
            ballR[i] = ballR[i]*2/3;
          }
          else {
            ballX[i] = mouseX - ballR[i]/10;
            ballY[i] = ballY[i];
            ballVX[i] = -3*cos(random(PI/2));
            ballVY[i] = -ballVY[i] + random(1);
            ballR[i] = ballR[i]*2/3;
          }
          newball(i, 1);
          for (int j = 0 ; j < 50 ; j ++ ) {
            if (ballX[j] == 0.0 && ballY[j] == 0.0 ) {
              test ++ ;
            }
            if (test != 0) {
              if ((mouseX + ballR[i]) + ballR[i]/2 >= w) {
                ballX[j] = ballX[i];
                ballY[j] = ballY[i]+ballR[i];
                ballVY[j] = ballVY[i]+random(1);
                ballVX[j] = 3*cos(random(PI/2)) ;
                ballR[j] = ballR[i];
              }
              else {
                ballX[j] = mouseX + ballR[i];
                ballY[j] = ballY[i];
                ballVX[j] = 3*cos(random(PI/2)) ;
                ballVY[j] = ballVY[i]+random(1);
                ballR[j] = ballR[i];
              }
              newball(j, 1);
              test=0;
              break;
            }
          }
        }
      }
    }
    break;
  case 2:
    stage = 0;
    break;
  case 3:
    stage = 0;
    break;
  case 10:
    if (checkanswer == 1) stage = 0;
    if (checkanswer == 2) exit();
    break;
  }
}
void attack() {
  for (int i=0 ; i <50 ; i++ ) {
    if ( ballX[i] - ballR[i]/2 <= 0 || ballX[i] + ballR[i]/2 >= w) {
      ballVX[i] = -ballVX[i];
    }
  }
}
void balls() {
  for (int i = 0 ; i <50 ;i ++) {
    for (int j = i ; j <50 ; j ++) {
      if (dist(ballX[j], ballY[j], ballX[i], ballY[i]) <= (ballR[i]/2 + ballR[j]/2) ) {
        if (i!=j) {
          if (ballX[j] >= ballX[i]) ballVX[i] = -abs(ballVX[i]+ballVX[j])/2;
          else ballVX[j] = abs(ballVX[i]+ballVX[j])/2;
          if (ballY[j] >= ballY[i]) ballVY[i] = -abs(ballVY[i]+ballVY[j])/2;
          else ballVY[j] = abs(ballVY[j]+ballVY[j])/2;
        }
      }
    }
  }
}
void releaseball() {
  for (int i = 0 ; i <50 ;i ++) {
    if (ballY[i] - ballR[i] / 2 >= h ) {
      ballX[i] = 0;
      ballY[i] = 0;
      ballVX[i] = 0;
      ballVY[i] = 0;
      ballR[i] = 0;
    }
  }
}
void bigball(int i) {
  ballX[i] = int(random(w/8*3)+w/8*3/2);
  ballY[i] = w/8*3/2;
  ballVX[i] = 3*cos(random(PI*2));
  ballVY[i] = 0;
  ballR[i] = w/8*3;
}
int count = 0;
void endgame() {
  for (int i = 0 ; i <50 ;i ++) {
    if (ballR[i] == 0 ) count++;
  }
  if (count == 50) {
    stage = 10;
  }
  else count = 0;
}
void newball(int i, int k) {
  switch (k) {
  case 0 :
    break;
  default :
    k = 0;
    for (int j = 0 ; j < 50 ; j++) {
      if (dist(ballX[j], ballY[j], ballX[i], ballY[i]) <= (ballR[i]/2 + ballR[j]/2)) if ( i != j) {
        ballY[i] +=1;
        k++;
      }
    }
    if ( k != 0 ) newball(i, k);
    else break;
  }
}
遊戲介面


遊戲結束畫面以及算分數



最後還有進階遊戲和遊戲說明還沒有完成,預計還會加背景音樂,讓遊戲更生動有趣。




2013年10月20日 星期日

WEEK07,期中作業

學號:99163072,99163134
名字:盧彥佑,簡尉倫

第一節

計畫如何完成期中作品以及今日目標,以及組員互相討論。
今日目標:在今天這3小時的任務,任務一:產生球根球之間的碰撞。
                                                           任務二:按球的瞬間,球產生分裂時,讓球不會重疊。
                                                           任務三:球點到一定小的時候,產生新的一顆大球。
                                                           任務四:點球時可以算分數。


第二節
 這節課解決了任務一和任務二

float [] ballX = new float [50];
float [] ballY = new float [50];
float [] ballVX = new float [50];
float [] ballVY = new float [50];
float [] ballR = new float [50];
int h = 800;
int w = 800;
int test = 0;
void setup() {
  size(h, w);
  ballX[0] =  400 ;
  ballY[0] =  150;
  ballVX[0] = 0 ;
  ballVY[0] = 0.5;
  ballR[0] = 300;
}
void draw() {
  background(255);
  noStroke();
  fill(0, 255, 255);
  for (int i = 0;i<50;i++) {  
    ellipse(ballX[i], ballY[i], ballR[i], ballR[i]);
    if (ballX[i] != 0) ballVY[i] +=0.15;
    ballX[i] += ballVX[i];
    ballY[i] += ballVY[i];
  }
  attack();
  balls();
  releaseball();
}
void newball(int i, int k) {
  switch (k) {
  case 0 :
    break;
  default :
    k = 0;
    for (int j = 0 ; j < 50 ; j++) {
      if (dist(ballX[j], ballY[j], ballX[i], ballY[i]) <= (ballR[i]/2 + ballR[j]/2))
        if ( i != j)
        {
          ballY[i] +=1;
          k++;
        }
    }
    if ( k != 0 ) newball(i, k);
    else break;
  }
}

void mousePressed() {
  for (int i = 0;i<50;i++) {
    if (dist (ballX[i], ballY[i], mouseX, mouseY)<=(ballR[i]/2)) {
      if ((mouseX - ballR[i]/10) - ballR[i]*1/3 <= 0) {
        ballY[i] = ballY[i];
        ballVY[i] = -ballVY[i] + random(1);
        ballR[i] = ballR[i]*2/3;
      }
      else {
        ballX[i] = mouseX - ballR[i]/10;
        ballY[i] = ballY[i];
        ballVX[i] = -3*cos(random(PI/2));
        ballVY[i] = -ballVY[i] + random(1);
        ballR[i] = ballR[i]*2/3;
      }
      newball(i, 1);
      for (int j = 0 ; j < 50 ; j ++ ) {
        if (ballX[j] == 0.0 && ballY[j] == 0.0  ) {
          test ++ ;
        }
        if (test != 0) {
          if ((mouseX + ballR[i]) + ballR[i]/2 >= 800) {
            ballX[j] = ballX[i];
            ballY[j] = ballY[i]+ballR[i];
            ballVY[j] = ballVY[i]+random(1);
            ballVX[j] = 3*cos(random(PI/2)) ;
            ballR[j] = ballR[i];
          }
          else {
            ballX[j] = mouseX + ballR[i];
            ballY[j] = ballY[i];
            ballVX[j] = 3*cos(random(PI/2)) ;
            ballVY[j] = ballVY[i]+random(1);
            ballR[j] = ballR[i];
          }
          newball(j, 1);
          test=0;
          break;
        }
      }
    }
  }
}

void attack() {
  for (int i=0 ; i <50 ; i++ ) {
    if ( ballX[i] - ballR[i]/2 <= 0 || ballX[i] + ballR[i]/2 >= 800) {
      ballVX[i] = -ballVX[i];
    }
  }
}
void balls() {
  for (int i = 0 ; i <50 ;i ++) {
    for (int j = i ; j <50 ; j ++) {
      if (dist(ballX[j], ballY[j], ballX[i], ballY[i]) <= (ballR[i]/2 + ballR[j]/2)  ) {
        if (i!=j) {
          if (ballX[j] >= ballX[i]) ballVX[i] = -abs(ballVX[i]);
          else ballVX[j] = abs(ballVX[j]);
          if (ballY[j] >= ballY[i]) ballVY[i] = -abs(ballVY[i]);
          else ballVY[j] = abs(ballVY[j]);
        }
      }
    }
  }
}

void releaseball() {
  for (int i = 0 ; i <50 ;i ++) {
    if (ballY[i] - ballR[i] / 2 >= h ) {
      ballX[i] = 0;
      ballY[i] = 0;
      ballVX[i] = 0;
      ballVY[i] = 0;
      ballR[i] = 0;
    }
  }
}

第三節
解決了任務三和任務四
float [] ballX = new float [50]; float [] ballY = new float [50]; float [] ballVX = new float [50]; float [] ballVY = new float [50]; float [] ballR = new float [50]; int h = 800; int w = 800; int test = 0; int aa = 0; void setup() { size(h, w); ballX[0] = 400 ; ballY[0] = 150; ballVX[0] = 0 ; ballVY[0] = 0.5; ballR[0] = 300; } void draw() { background(255); noStroke(); fill(0, 255, 255); for (int i = 0;i<50;i++) { ellipse(ballX[i], ballY[i], ballR[i], ballR[i]); if (ballX[i] != 0) ballVY[i] +=0.15; ballX[i] += ballVX[i]; ballY[i] += ballVY[i]; } attack(); balls(); releaseball(); fill(255, 0, 0); textSize(20); text("grade:" + aa, 20, 20, 100, 50); } void newball(int i, int k) { switch (k) { case 0 : break; default : k = 0; for (int j = 0 ; j < 50 ; j++) { if (dist(ballX[j], ballY[j], ballX[i], ballY[i]) <= (ballR[i]/2 + ballR[j]/2)) if ( i != j) { ballY[i] +=1; k++; } } if ( k != 0 ) newball(i, k); else break; } }
void mousePressed() { for (int i = 0;i<50;i++) { if (dist (ballX[i], ballY[i], mouseX, mouseY)<=(ballR[i]/2)) { if (ballR[i]/2 <= 15 && ballR[i]/2 != 0) { aa += int (900 / ballR[i]); bigball(i); } else { aa += int (900 / ballR[i]); if ((mouseX - ballR[i]/10) - ballR[i]*1/3 <= 0) { ballY[i] = ballY[i]; ballVY[i] = -ballVY[i] + random(1); ballR[i] = ballR[i]*2/3; } else { ballX[i] = mouseX - ballR[i]/10; ballY[i] = ballY[i]; ballVX[i] = -3*cos(random(PI/2)); ballVY[i] = -ballVY[i] + random(1); ballR[i] = ballR[i]*2/3; } newball(i, 1); for (int j = 0 ; j < 50 ; j ++ ) { if (ballX[j] == 0.0 && ballY[j] == 0.0 ) { test ++ ; } if (test != 0) { if ((mouseX + ballR[i]) + ballR[i]/2 >= 800) { ballX[j] = ballX[i]; ballY[j] = ballY[i]+ballR[i]; ballVY[j] = ballVY[i]+random(1); ballVX[j] = 3*cos(random(PI/2)) ; ballR[j] = ballR[i]; } else { ballX[j] = mouseX + ballR[i]; ballY[j] = ballY[i]; ballVX[j] = 3*cos(random(PI/2)) ; ballVY[j] = ballVY[i]+random(1); ballR[j] = ballR[i]; } newball(j, 1); test=0; break; } } } } } }
void attack() { for (int i=0 ; i <50 ; i++ ) { if ( ballX[i] - ballR[i]/2 <= 0 || ballX[i] + ballR[i]/2 >= 800) { ballVX[i] = -ballVX[i]; } } } void balls() { for (int i = 0 ; i <50 ;i ++) { for (int j = i ; j <50 ; j ++) { if (dist(ballX[j], ballY[j], ballX[i], ballY[i]) <= (ballR[i]/2 + ballR[j]/2) ) { if (i!=j) { if (ballX[j] >= ballX[i]) ballVX[i] = -abs(ballVX[i]); else ballVX[j] = abs(ballVX[j]); if (ballY[j] >= ballY[i]) ballVY[i] = -abs(ballVY[i]); else ballVY[j] = abs(ballVY[j]); } } } } }
void releaseball() { for (int i = 0 ; i <50 ;i ++) { if (ballY[i] - ballR[i] / 2 >= h ) { ballX[i] = 0; ballY[i] = 0; ballVX[i] = 0; ballVY[i] = 0; ballR[i] = 0; } } }
void bigball(int i) { ballX[i] = int(random(300)+150); ballY[i] = 150; ballVX[i] = 3*cos(random(PI*2)); ballVY[i] = 0; ballR[i] = 300; }


2013年10月14日 星期一

Week06

第一節
和組員一起做期中作品,討論期中作品如何做
遊戲名稱:點球球遊戲
遊戲說明:當隨機一顆球出現時,請點選他,他會開始往下掉,如果掉到底部就輸了,點選他之後會分裂變小,最終遊戲沒有球在螢幕上,就輸了,點選到球就有分數,點到越小顆的球分數越高。
遊戲目的:訓練眼睛和手的反應速度。
組員:簡尉倫99163134

第2節
開始寫程式碼

float [] ballX = new float [50];
float [] ballY = new float [50];
float [] ballVX = new float [50];
float [] ballVY = new float [50];
float [] ballR = new float [50];
int h = 800;
int w = 800;
int test = 0;
void setup() {
  size(h, w);
  ballX[0] =  400 ;
  ballY[0] =  150;
  ballVX[0] = 0 ;
  ballVY[0] = 0.5;
  ballR[0] = 300;
}
void draw() {
  background(255);
  noStroke();
  fill(0, 255, 255);
  for (int i = 0;i<50;i++) {     
    ellipse(ballX[i], ballY[i], ballR[i], ballR[i]);
    if (ballX[i] != 0) ballVY[i] +=0.2;
    ballX[i] += ballVX[i];
    ballY[i] += ballVY[i];
  }
}
void newball(int i) {
}

void mousePressed() {
  for (int i = 0;i<50;i++) { 
    if (dist (ballX[i], ballY[i], mouseX, mouseY)<=(ballR[i]/2)) {
      ballX[i] = mouseX - ballR[i]/10;
      ballY[i] = ballY[i];
      ballVX[i] = -cos(random(PI/2));
      ballVY[i] = -ballVY[i];
      ballR[i] = ballR[i]*2/3;
      for (int j = 0 ; j < 50 ; j ++ ) {
        if (ballX[j] == 0.0 && ballY[j] == 0.0  ) {
          test ++ ;
        }
        if (test != 0) {
          ballX[j] = mouseX + ballR[i];
          ballY[j] = ballY[i];
          ballVX[j] = cos(random(PI/2)) ;
          ballVY[j] = ballVY[i];
          ballR[j] = ballR[i];
          test=0;
          break;
        }
      }
    }
  }
}

一開始出現的球

                                                             點選球後開始分裂
第3節
增加球碰到牆壁會反彈
float [] ballX = new float [50];
float [] ballY = new float [50];
float [] ballVX = new float [50];
float [] ballVY = new float [50];
float [] ballR = new float [50];
int h = 800;
int w = 800;
int test = 0;
void setup() {
  size(h, w);
  ballX[0] =  400 ;
  ballY[0] =  150;
  ballVX[0] = 0 ;
  ballVY[0] = 0.5;
  ballR[0] = 300;
}
void draw() {
  background(255);
  noStroke();
  fill(0, 255, 255);
  for (int i = 0;i<50;i++) {    
    ellipse(ballX[i], ballY[i], ballR[i], ballR[i]);
    if (ballX[i] != 0) ballVY[i] +=0.2;
    ballX[i] += ballVX[i];
    ballY[i] += ballVY[i];
  }
  attack();
  balls();
}
void newball(int i) {
}

void mousePressed() {
  for (int i = 0;i<50;i++) {
    if (dist (ballX[i], ballY[i], mouseX, mouseY)<=(ballR[i]/2)) {
      if ((mouseX - ballR[i]/10) - ballR[i]*2/3 <= 0) {
        ballY[i] = ballY[i];
        ballVY[i] = -ballVY[i] + random(1);
        ballR[i] = ballR[i]*2/3;
      }
      else {
        ballX[i] = mouseX - ballR[i]/10;
        ballY[i] = ballY[i];
        ballVX[i] = -3*cos(random(PI/2));
        ballVY[i] = -ballVY[i] + random(1);
        ballR[i] = ballR[i]*2/3;
      }
      for (int j = 0 ; j < 50 ; j ++ ) {
        if (ballX[j] == 0.0 && ballY[j] == 0.0  ) {
          test ++ ;
        }
        if (test != 0) {
          if ((mouseX + ballR[i]) + ballR[i] >= 800) {
            ballX[j] = ballX[i];
            ballY[j] = ballY[i]+ballR[i];
            ballVY[j] = ballVY[i]+random(1);
            ballVX[j] = 3*cos(random(PI/2)) ;
            ballR[j] = ballR[i];
          }
          else {
            ballX[j] = mouseX + ballR[i];
            ballY[j] = ballY[i];
            ballVX[j] = 3*cos(random(PI/2)) ;
            ballVY[j] = ballVY[i]+random(1);
            ballR[j] = ballR[i];
          }
          test=0;
          break;
        }
      }
    }
  }
}

void attack() {
  for (int i=0 ; i <50 ; i++ ) {
    if ( ballX[i] - ballR[i]/2 <= 0 || ballX[i] + ballR[i]/2 >= 800) {
      ballVX[i] = -ballVX[i];
    }
  }
}
void balls() {
  for (int i = 0 ; i <50 ;i ++) {
    for (int j = 0 ; j <50 ; j ++) {
      if (dist(ballX[j], ballY[j], ballX[i], ballX[i]) <= (ballR[i]/2 + ballR[j]/2)  ) {
        if (ballX[j] >= ballX[i]) ballVX[i] = -abs(ballVX[i]);
        else ballVX[j] = abs(ballVX[j]);
        if (ballY[j] >= ballY[i]) ballVY[i] = -abs(ballVY[i]);
        else ballVY[j] = abs(ballVY[j]);
      }
    }
  }
}
球碰到牆壁會反彈