遊戲名稱:小精靈
遊戲網址:http://my-gamer.com/games/gj540.html
遊戲說明:將黃色小點點吃完,並且不能被小怪物碰到,中點點吃到可以讓 小精靈移動速度變快,且可以吃掉小怪物,碰到小怪物就死掉。
操作說明:
小精靈移動的方法,可以利用ARDUINO的旋轉來操作。
遊戲腳色遊戲說明:將黃色小點點吃完,並且不能被小怪物碰到,中點點吃到可以讓 小精靈移動速度變快,且可以吃掉小怪物,碰到小怪物就死掉。
操作說明:
小精靈移動的方法,可以利用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
實行成果
電腦側錄情形
沒有留言:
張貼留言