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

實行成果



電腦側錄情形

沒有留言:

張貼留言