顯示具有 期末作品 標籤的文章。 顯示所有文章
顯示具有 期末作品 標籤的文章。 顯示所有文章

2015年1月25日 星期日

期末作品

總共有三種速度(三排),有A~Z共26個英文字母隨機編排,只要按到相對應的字母就可消除,消除一個得10分,若未及時消除則game over並結算分數。



影片網址:https://www.youtube.com/watch?v=VQcOnpL-kI4&feature=youtu.be

2015年1月22日 星期四

期末作品 -遙控車

期末作品: 遙控車


透過手機藍芽傳訊號給藍芽模組後,讓模型車體可以依手機打的指令分別:  前進,後退,轉彎。



操作說明:
在手機輸入指令:        


                                     f,100                         前進 ,速度:100   
                                     b,200                        後退,速度:200      
                                     a,20                           轉20度






過程:                     


將HC-06 藍芽模組的 :  VCC   分別用電線接到 ----->  Arduino Uno版子:   5 V
   將HC-06 藍芽模組的 :  GND   分別用電線接到 ----->  Arduino Uno版子:   GND
            將HC-06 藍芽模組的 :  TXD   分別用電線接到 ----->  Arduino Uno版子:   Pin 10(RX)
             將HC-06 藍芽模組的 : RXD   分別用電線接到 ----->  Arduino Uno版子:   Pin 11(TX)
                                



                                       通電後,藍芽模組開始亮紅燈。(測試線路)




接完藍芽模組的線路後,接著拔掉藍芽模組,並將L293D模組疊在上方,接著伺服馬達也接在在上面,並將USB線插入Arduino的插孔與電腦上。    




執行編譯Arduino 程式後




                                            接著將程式上傳到Arduino版上。



                                                將藍芽模組接在剛剛已經設好的線路上。





                                         
                                          連通後藍芽模組開始閃紅燈。




                                     
開啟手機的藍芽,並與藍芽模組 配對。

點入App中

搜尋藍芽,並配對藍芽。





                                          將手機藍芽與該藍芽模組的藍芽配對後,並在上面輸入指令,
                                          " a,50"  讓伺服馬達轉50度。
                           




測試減速馬達是否正常運轉,測試結果為正常。




但與 L293D模組接好後,卻無法運轉,初步判斷可能是線路差反,確定線路的正負沒錯後,
詢問過他人的想法後,在猜想有可能是馬達的電壓 9 V  與 Arduino 版的供電數 有關。



參考資料:    

                                 Arduino 從基礎到實踐 / Michael McRoberts著 ; 杨继志, 郭敬译




                                             







車子模型



2015年1月19日 星期一

HW19, Week19, 期末作品

期末作品-Row, row, row your boat 
(version 2-2) 

[Version 2-2]遊戲規則與解說:

●操控:
◎向右=>滑左槳
◎向左=>滑右槳

●開始畫面:
◎player玩家
◎help幫助=>score+100
◎avoid避開=>score-100

◎Row to right=>Practice
 向右可以進入練習模式
◎Row to left=>Start
 向左可以直接遊戲

●練習模式:
◎Row to right=>good!
◎Row to left=>good!

●遊戲畫面:
◎失敗
分數為0即失敗
失敗後
Row to right=>Start

◎勝利
救到3隻水獺即可勝利
救到1隻水獺以圖式告知還需救幾隻(右下方)
勝利後
Row to right=>Start

◎遊戲中有音樂
◎碰到avoid與help均有音效
◎失敗與勝利之後
 Row to right=>Start
 向右均可再次遊戲


已改進:

●有練習模式,讓玩家可以先熟知玩法
●開始畫面:
 向右可以進入練習模式
 向左可以直接遊戲


作品第二版本影片:


Practice 模式 


互動概論期末作品-Row, row, row your boat (version 2-2) Demo Practice 模式 




失敗畫面

互動概論期末作品-Row, row, row your boat (version 2-2) Demo 失敗畫面 




勝利畫面

互動概論期末作品-Row, row, row your boat (version 2-2) Demo 勝利畫面 




硬體介紹

互動概論期末作品-Row, row, row your boat (version 2-2) 硬體介紹




上課 Demo 側錄

互動概論期末作品-Row, row, row your boat (version 2-2) 上課 Demo 側錄




作品第一版本影片:

2015.0118互動概論期末作品-Row, row, row your boat (version 2-1)




硬體photo:

●船槳上的鐵絲與海平面上的鐵絲觸碰,
 Arduino 即可傳送訊息給 Processing




●船槳上的鐵絲部分
 藏在船槳的海綿裡與吸管裡


●船內有 Board 的固定位置
 Board 才不會滑動



●所有材料:
 粗吸管(船桿)
 海綿(船槳)
 紙箱(海平面30*30*3、船高20)
 鐵絲
 上色用具









期末作品-快打旋風


遊戲名字:快打旋風



此遊戲為一個簡單的打擊遊戲,玩家可以使用箱子上的紅色按鈕,遊戲中會出現不同種臉部表情的頭,點擊不同的表情會有不同的分數,相反的點到有骨頭的圖示就會結束遊戲(影片中有介紹各個圖片對應到的分數),主要是考驗玩家的手速和反應力。


2015年1月18日 星期日

期末作品 SmashBird20s 粉碎小鳥 (Arduino & Processing)




Arduino操控器(模組包裝圖)
















期末作品




我們期末作品是做接蘋果
做八個按鈕分別有八個道會掉蘋果
有紅色和綠色的蘋果
分數過了30分後會出現綠蘋果
綠蘋果比紅蘋果高分
遊戲時間為30秒
結束後螢幕會顯現總得分


p語言

import ddf.minim.*;
Minim m;
AudioPlayer player;
int []bz=new int[1000];
PImage imgZombie;
PImage imgRZombie;
PImage imgShoot;
PImage imgBG;

import processing.serial.*;
Serial myPort;  // Create object from Serial class
int val;

void setup() {

  size(800, 600);
  imgZombie=loadImage("apple01.png");
  imgRZombie=loadImage("apple02.png");
  imgShoot=loadImage("shoot.png");
  imgBG=loadImage("sky.png");
  for (int i=0;i<1000;i++) {
    bz[i]=int(random(8));

  }


  m = new Minim(this);
  player = m.loadFile("apple.mp3");
  //player.play();
 
  String [] all = Serial.list();
  String portName = all[all.length-1];
      player.play();
  myPort = new Serial(this, portName, 9600);
}

int now=0;
int a;
int total=0;
int countDown=300;
int countDown2=1860;//1860

void draw() {
  background(imgBG);
 
   print("val=" + val);

  if ( myPort.available() > 0) {  // If data is available,
    val = myPort.read();         // read it and store it in val
  }
 
  int a=0;
  if (a==0) {
    if (countDown>0) {
      countDown--;
      textSize(100);
      text(countDown/30+"Seconds", 200, 300);
      return;
    }
    a++;
  }
 
  if (a==1) {

    if (countDown2>0) {
      countDown2--;
      textSize(50);
      text(countDown2/60+"Second", 20, 40);
      for (int i=now;i<now+5;i++) {
        if (now<=30)image(imgZombie, bz[i]*100, 400-(i-now)*100);
        if (now>30)image(imgRZombie, bz[i]*100, 400-(i-now)*100);
      }
      image(imgShoot, 0, 500);
      image(imgShoot, 100, 500);
      image(imgShoot, 200, 500);
      image(imgShoot, 300, 500);
      image(imgShoot, 400, 500);
      image(imgShoot, 500, 500);
      image(imgShoot, 600, 500);
      image(imgShoot, 700, 500);
    }
    a++;
  }
 
  if (a==2) {
    if (countDown2/60==0)text("Score:"+total, 300, 350);
  }
 
    if (val-48==bz[now])
  {
    if (total<50)a=1;
    if (total==50)a=2;
    if (countDown2/60==0)a=0;
    now++;
    total=total+a;
  }
}

/*void keyPressed(int val) {

  //if (val==bz[now])
  //{
  //  if (total<50)a=1;
  //  if (total==50)a=2;
   // if (countDown2/60==0)a=0;
  //  now++;
  //  total=total+a;
 // }
 
}*/



期末作品:World war


期末作業 貪吃小精靈


import processing.serial.*;
Serial myPort;

void draw() {
  background(imgBG);
  ser();
  image(Elf, EX, EY);
  touchGhost();
  if(dir!=0){
    image(ghostr, redx, redy);
    ghost();
  }
  if(dirp!=0){
    image(ghostp, pinkx, pinky);
    ghostp();
  }
  if(dirg!=0){
    image(ghostg, greenx, greeny);
    ghostg();
  }
}
void ser(){
  if(myPort.available()>0){
    int value=myPort.read();
    int leftEX=EX, leftEY=EY, rightEX=EX+15, rightEY=EY+15;
    if (table[leftEX][leftEY]<0)
    {
      if(value==82)
        EY+=5;
      if(value==76)
        EX-=5;
    }
    
    if (table[rightEX][rightEY]<0)
    {
        if(value==85)
          EX+=5;
        if(value==68)
          EY-=5;
    }
    println(value);
  }
}
void mouseMoved() {
  println(mouseX, mouseY);
}
void keyPressed()
{
  int leftEX=EX, leftEY=EY, rightEX=EX+15, rightEY=EY+15;
  if (table[leftEX][leftEY]<0)
  {
    if (keyCode == UP)
      EY-=5;
    if (keyCode == LEFT)
      EX-=5;
  }
  if (table[rightEX][rightEY]<0)
  {
    if (keyCode == RIGHT)
      EX+=5;
    if (keyCode == DOWN)
      EY+=5;
  }
 /* if (table[rightEX][rightEY]<0) println("safe");
  else println("ac");*/
}
int dir= 1;
void ghost() {
  float r = random(1, 5);
  //if(table[redx][redy]==0)
  //println("dir:"+dir+"*");
  switch(dir) {
  case 1: 
    {
      if (table[redx+25][redy]<0)
      {
        redx+=2;
        break;
      }
      else {  
        r = random(1, 5);
        dir = int(r);
        break;
      }
    }
  case 2: 
    {
      if (table[redx][redy+25]<0) {
        redy+=2;
        break;
      }
      else {  
        r = random(1, 5);
        dir = int(r);
        break;
      }
    }
  case 3: 
    {
      if (table[redx-5][redy]<0) {
        redx-=2;
        break;
      }
      else {  
        r = random(1, 5);
        dir = int(r);
        break;
      }
    }
  case 4: 
    {
      if (table[redx][redy-5]<0) {
        redy-=2;
        break;
      }
      else {  
        r = random(1, 5);
        dir = int(r);
        break;
      }
    }
  }
  println("rgb:"+table[redx][redy]);
}
int dirp= 2;
void ghostp() {
  float r = random(1, 5);
  //if(table[redx][redy]==0)
  //println("dir:"+dir+"*");
  switch(dirp) {
  case 1: 
    {
      if (table[pinkx+25][pinky]<0)
      {
        pinkx+=2;
        break;
      }
      else {  
        r = random(1, 5);
        dirp = int(r);
        break;
      }
    }
  case 2: 
    {
      if (table[pinkx][pinky+25]<0) {
        pinky+=2;
        break;
      }
      else {  
        r = random(1, 5);
        dirp = int(r);
        break;
      }
    }
  case 3: 
    {
      if (table[pinkx-5][pinky]<0) {
        pinkx-=2;
        break;
      }
      else {  
        r = random(1, 5);
        dirp = int(r);
        break;
      }
    }
  case 4: 
    {
      if (table[pinkx][pinky-5]<0) {
        pinky-=2;
        break;
      }
      else {  
        r = random(1, 5);
        dirp = int(r);
        break;
      }
    }
  }
}
int dirg= 3;
void ghostg() {
  float r = random(1, 5);
  //if(table[redx][redy]==0)
  //println("dir:"+dir+"*");
  switch(dirg) {
  case 1: 
    {
      if (table[greenx+25][greeny]<0)
      {
        greenx+=2;
        break;
      }
      else {  
        r = random(1, 5);
        dirg = int(r);
        break;
      }
    }
  case 2: 
    {
      if (table[greenx][greeny+25]<0) {
        greeny+=2;
        break;
      }
      else {  
        r = random(1, 5);
        dirg = int(r);
        break;
      }
    }
  case 3: 
    {
      if (table[greenx-5][greeny]<0) {
        greenx-=2;
        break;
      }
      else {  
        r = random(1, 5);
        dirg = int(r);
        break;
      }
    }
  case 4: 
    {
      if (table[greenx][greeny-5]<0) {
       greeny-=2;
        break;
      }
      else {  
        r = random(1, 5);
        dirg = int(r);
        break;
      }
    }
  }
}
void touchGhost()
{
  println("EX"+EX+",EY"+EY+",PX"+pinkx+",PY"+pinky);
  if(abs(pinkx-EX)<=10 && abs(pinky-EY)<=10)
  {
    dirp=0;
  }
  if(abs(redx-EX)<=10 && abs(redy-EY)<=10)
  {
    dir=0; 
  }
  if(abs(greenx-EX)<=10 && abs(greeny-EY)<=10)
  {
    dirg=0; 
  }
  if(dir==0 && dirp==0 && dirg==0)
  println("YOU WIN");
}

互動技術概論_期末作業

import ddf.minim.*;
AudioPlayer player;
AudioPlayer player1;
AudioPlayer player2;
Minim minim;//audio context
PImage img;
PImage img1;
PImage img2;
PImage img3;
PImage img4;
PImage img5;
PImage img6;
PImage win;
PImage lose;
PImage ready;
PImage GO;
int r1x=0;
int r2x=0;
float runnerx=80;
float runner2x=80;
float bgx=1500;
int checktype=-1;
int runtype=1;
int background=0;
int count=0;
int badrunner=0;
int readyt=0;
import processing.serial.*;
Serial myPort;
void setup() {
  myPort=new Serial(this,"COM3",9600);
  minim = new Minim(this);
  player = minim.loadFile("file.mp3", 2048);
  player1 = minim.loadFile("winner.wav", 2048);
  player2 = minim.loadFile("loser.WAV", 2048);
  img = loadImage("bg.jpg");
  img1 = loadImage("2.png");
  img2 = loadImage("1.png");
  img3 = loadImage("3.png");
  img4 = loadImage("5.png");
  img5 = loadImage("4.png");
  img6 = loadImage("6.png");
  win = loadImage("win.jpg");
  lose = loadImage("lose.jpg");
  ready = loadImage("ready.png");
  GO = loadImage("GO.png");
  imageMode(CENTER);
  size(800, 256);
}
int xx=0,zz=0;
void draw() {
 
  //-------------------------------
 
  if(myPort.available()>0)
{
int a=myPort.read();
if(a=='A') {xx=1;}
if(a=='B') {zz=1;}
}

  if (background==1)
    if (checktype!=-2)
      if (xx==1) {
        r1x+=20;
        checktype=0;
        runtype=2;
        if (bgx>=-700)bgx-=20;
        else runnerx+=20;
       
        xx=0;
      }
  if (background==1)
    if (checktype!=-3)
      if (zz==1) {
        r1x+=20;
        checktype=11;
        runtype=3;
        if (bgx>=-700)bgx-=20;
        else runnerx+=20;
        zz=0;
    }
  //-------------------------------
  if (background==0) {
    image(img, bgx, 128);
    image(img1, runnerx, 160);
    image(img5, runner2x, 210);
    count++;
    if (count<=70)image(ready, 400, 128, 394, 150);
    else image(GO, 400, 128, 394, 150);
    if (count==100)background=1;
  }


  if (background==1) {
    player.play();

    image(img, bgx, 128);

    if (runtype==1)image(img1, runnerx, 160);
    if (checktype==10) {
      runtype=1;
      checktype=-2;
    }
    if (checktype==20) {
      runtype=1;
      checktype=-3;
    }

    if (runtype==2&&checktype<=10&&checktype>=0) {
      image(img2, runnerx, 160);
      checktype++;
    }

    if (runtype==3&&checktype<=20&&checktype>=11) {
      image(img3, runnerx, 160);
      checktype++;
    }
    badrunner++;
    if ((badrunner%20)<=10&&(badrunner%20)>=0)image(img5, runner2x, 210);
    if ((badrunner%20)>=11&&(badrunner%20)<=19)image(img6, runner2x, 210);
    r2x+=5;
    runner2x=runnerx+(r2x-r1x);

    if (runnerx>=500||r2x>=2630)background=2;
  }
  if (background==2)
  {
    if (r2x<2630)
    {
      player1.play();
      image(win, 400, 128);
    } else  if (r2x>=2630)
    {
      player2.play();
      image(lose, 400, 128);
    }
  }
}

2015年1月12日 星期一

期末作品


小朋友過馬路



processing:

import processing.serial.*;
Serial myPort;
int savetime=20;//time
PImage people, amb, imgBG;
PImage car[]=new PImage[8];
float pX=300, pY=366;
void setup() {
  size(600, 400);
  frameRate(50);
  myPort = new Serial(this, "COM4", 9600);
  imgBG = loadImage("bg.png");
  people = loadImage("super.png");//people  
  amb = loadImage("amb.png");//ambullance
  for (int i=0;i<8;i++) {
    car[i]=loadImage("car"+i+".png");
  }
}

float carX[]= { 600, 0, 600, 600, 0, 0, 600, 0};//direction
float carVX[]= { -8, 4, -4, -5, 9, 5, -7, 6};//speed
int but;//button
void draw() {
  background(imgBG);
  image(people, pX, pY, 25, 35);
  if (myPort.available()>0)
  {
    but = myPort.read();
  }

  textSize(24);//time
    int passtime = millis() - savetime;
    int gametime = 20-passtime/1000;
    textSize(24);
    text("T I M E : "+gametime, 400, 50);
    
   for (int i=0;i<8;i++) { //car
     image(car[i], carX[i], 85+i*35, 50, 35);
     carX[i]+=carVX[i];
     if (carX[i]>600) carX[i]=0;
     if (carX[i]<0) carX[i]=+600;    
  }
  for (int i=0;i<8;i++) { 
  if(dist(carX[i],85+i*35,pX,pY)<=20){   
      carX[i] = pX;     
      rect(150,100,300,200);    
      fill(255,255,0);
      textSize(30);
      text(" L O S E ",250,200);
      fill(255,0,0);  
    }
  }
  //people
  if (but == 'U'&& pY>50) pY-=5;//up
  if (but == 'D'&& pY<365) pY+=5;//down
  if (but == 'L'&& pX>15) pX-=5;//left
  if (but == 'R'&& pX<565) pX+=5;//right   

  if( gametime <= 0 ){    
  //rect(150,100,300,200);
  //fill(255,255,255);
  background(#81FF7C);
  textSize(30);
  text(" T I M E  I S  U P ",170,200);
  fill(255,0,0);
  }
  
  if(pY>35 && pY<50) {    
  //rect(150,100,300,200); 
  //fill(255,255,255);
  background(#81FF7C);
  textSize(30);
  text(" W I N ",250,200);
  fill(255,0,0);
  }
}



arduino:


void setup(){
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
}

int up=0,down=0,left=0,right=0;
void loop(){
  if(up==0 && digitalRead(2)==LOW){//pressed
    Serial.write('u'); up=1;
  }
  if(up==1 && digitalRead(2)==HIGH){//not pressed
    Serial.write('U'); up=0;
  }
  
   if(down==0 && digitalRead(3)==LOW){//pressed
    Serial.write('d'); down=1;
  }
  if(down==1 && digitalRead(3)==HIGH){//not pressed
    Serial.write('D'); down=0;
  }
  
   if(left==0 && digitalRead(4)==LOW){//pressed
    Serial.write('l'); left=1;
  }
  if(left==1 && digitalRead(4)==HIGH){//not pressed
    Serial.write('L'); left=0;
  }
  
   if(right==0 && digitalRead(5)==LOW){//pressed
    Serial.write('r'); right=1;
  }
  if(right==1 && digitalRead(5)==HIGH){//not pressed
    Serial.write('R'); right=0;
  }
  delay(10);//to avoid noise while pressing
}


按扭設置

從左到右為:上 下 左 右


DEMO影片