2012年1月23日月曜日

アルデウィーノ・テトリス・ソースコード

//LEDmatrixと74HC138APを利用したテトリス

/*******電源*******/
//5V(オレンジ)を+
//GND(青)を-

/*******ボタン信号*******/
//30i(緑)をA0
//26i(黄)をA1
//22i(黄)をA2

/*******74HC138APの入力信号*******/
//12a(黄)を13
//11a(黄)を12
//10a(黄)を8

/*******LEDmatrix直接制御******/
//8a(緑)を7
//7a(緑)を3
//5a(緑)を2
//2a(橙)を10
//1a(橙)を9
//3j(青)を4
//5j(灰)を6
//8j(白)を9



#define YOKO 8
#define TATE 9
#define RIGHT_PIN 14
#define LEFT_PIN 16
#define ROTATE_PIN 15
//表示キャラクタeJのデータ
boolean matrix[8][8]={
// 
{ 0,0,0,0,0,0,0,0},
{ 0,0,0,0,0,0,0,0},
{ 0,0,1,1,1,0,0,0},
{ 0,1,0,0,0,1,0,0},
{ 1,1,1,1,1,1,0,0},
{ 1,1,0,0,0,0,0,0},
{ 1,1,0,0,0,0,0,0},
{ 0,1,1,1,1,0,0,0}
};
int right_old_val = 0;
int right_val = 0;
int left_old_val = 0;
int left_val = 0;
int rotate_old_val = 0;
int rotate_val = 0;

//初期化
void setup(){
  for(int i=2;i<=17;i++){
    pinMode(i,OUTPUT);
    digitalWrite(i,LOW);
  }
  pinMode(RIGHT_PIN,INPUT);
  pinMode(LEFT_PIN,INPUT);
  pinMode(ROTATE_PIN,INPUT);
  randomSeed(analogRead(5));
}

//LEDマトリクス制御ピンの配置設定 14=A0,15=A1,16=A2,17=A3
byte col[8]={ 5,11,10, 8,16, 7, 3, 2};
//byte row[8]={ 9, 4,14, 6,13,15,12,17};
byte row[8]={ 9, 4,7, 6,10,3,11,2};
byte base[3]={8,12,13};

#define DUTY 10     // DUTYの値は1~20までの値。値が大きいとLEDが明るく点灯
#define S_DELAY 80  // S_DELAYの値を大きくするとゆっくりスクロールする

void drawMatrix(){
  int count=S_DELAY;
   for(int r=0;r<=7;r++){
     if(r==0){
       digitalWrite(base[0],LOW);
       digitalWrite(base[1],LOW);
       digitalWrite(base[2],LOW);
     }else if(r==1){
       digitalWrite(base[0],HIGH);
       digitalWrite(base[1],LOW);
       digitalWrite(base[2],LOW);
     }else if(r==2){
       digitalWrite(base[0],LOW);
       digitalWrite(base[1],HIGH);
       digitalWrite(base[2],LOW);
     }else if(r==3){
       digitalWrite(base[0],HIGH);
       digitalWrite(base[1],HIGH);
       digitalWrite(base[2],LOW);
     }else if(r==4){
       digitalWrite(base[0],LOW);
       digitalWrite(base[1],LOW);
       digitalWrite(base[2],HIGH);
     }else if(r==5){
       digitalWrite(base[0],HIGH);
       digitalWrite(base[1],LOW);
       digitalWrite(base[2],HIGH);
     }else if(r==6){
       digitalWrite(base[0],LOW);
       digitalWrite(base[1],HIGH);
       digitalWrite(base[2],HIGH);
     }else if(r==7){
       digitalWrite(base[0],HIGH);
       digitalWrite(base[1],HIGH);
       digitalWrite(base[2],HIGH);
     }
    //digitalWrite(col[r],LOW);  //row
    for(int c=0;c<=7;c++){
      digitalWrite(row[c],matrix[r][c]);   //col
      delayMicroseconds(DUTY);//"_"" žŠ
      digitalWrite(row[c],LOW);//ƒIƒt‚ ‚ ‚  
      delayMicroseconds(21-DUTY);
     }
      //digitalWrite(col[r],HIGH);//ƒIƒt‚ ‚ ‚
    }
}

void loop(){
      int start=300;
int i, j,k,c,d,e,l,m,o,g,yon,next,t,p,n,w,x,y,h,f[49],a[TATE],b[(TATE+2)*YOKO];

for(k=0;k<8;k++){
for(g=0;g<8;g++){
matrix[k][g] = 0;
}
}

/*nとwとaの初期化*/
h=start;
for(n=0;n<TATE;n++){
a[n]=0;
}
w=0;
for(k=0;k<TATE+2;k++){
for(g=0;g<YOKO;g++){
b[YOKO*k+g]=0;
}
}
for(g=0;g<YOKO;g++){
b[g]=1;
}
next=random(7);
  
  int count=S_DELAY;
 
  while(true){
yon=next;
next=random(7);
katakime(f,yon);
k=2;
t=0;
p=0;
for (i = 1; i <=TATE ; i++) {
sayuu(i,&k,f,b,&j,h);
/*さっそく描画(?*/
sayuu2(f,b,&k,&t,i);
t=k;
if(p!=1){
kaku( k, i, f);
}
/*時間稼ぎ*/
for (j = 0; j <= h; j++) {
if(p!=1){
drawMatrix();
                                        
sayuu(i,&k,f,b,&j,h);
sayuu2(f,b,&k,&t,i);
if(t!=k){
kesu( t, i, f);
t=k;
kaku( k, i,f);
}
}
}
stopp(f, b, &p, &t, k, i, a, h);
sorou(a,b);
if(p!=1){

/*とりあえず、消し去ろう*/
kesu( k, i, f);
t=k;
}
}

  }
}
int kaitenhuka(int *f,int k,int i,int *b)
{
int m,n;

for(m=0;m<7;m++){
for(n=0;n<7;n++){
if(f[7*n+m]==1){
if(k-3+m<0){
return 0;
}
if(k-3+m>12){
return 0;
}
if((i-3+n)<1){
return 0;
}
if(b[(TATE-(i-3+n))*YOKO+k-3+m]==1){
return 0;
}
}
}
}
return 1;
}

int katakime(int *f,int yon)
{
int n;
for(n=0;n<49;n++){
f[n]=0;
}
if(yon==0){
f[16]=1;
f[24]=1;
f[25]=1;
f[23]=1;
}
if(yon==1){
f[18]=1;
f[24]=1;
f[25]=1;
f[23]=1;
}
if(yon==2){
f[23]=1;
f[24]=1;
f[25]=1;
f[26]=1;
}
if(yon==3){
f[17]=1;
f[24]=1;
f[25]=1;
f[23]=1;
}
if(yon==4){
f[17]=1;
f[24]=1;
f[23]=1;
f[18]=1;
}
if(yon==5){
f[17]=1;
f[24]=1;
f[25]=1;
f[16]=1;
}
if(yon==6){
f[17]=1;
f[18]=1;
f[25]=1;
f[24]=1;
}
}
int zikan(int h)
{
int j;
for (j = 0; j <= h; j++) {
drawMatrix();
}
}

int stopp(int *f,int *b,int *p,int *t,int k,int i,int *a,int h)
{
int m,n,o,q,r,s;

for(n=0;n<7;n++){
for(m=0;m<7;m++){
if(f[7*n+m]==1){
if(*p!=1){
if(b[(TATE-1-(i-3+n))*YOKO+k-3+m]==1){
*t=k;
for(o=0;o<7;o++){
for(q=0;q<7;q++){
a[TATE-(i-3+o)]=a[TATE-(i-3+o)]+f[7*o+q];
}
}
for(r=0;r<7;r++){
for(s=0;s<7;s++){
b[(TATE-(i-3+r))*YOKO+k-3+s]=b[(TATE-(i-3+r))*YOKO+k-3+s]+f[7*r+s];
}
}
*p=1;
zikan(h);

}

}
}
}
}
}
int sayuu2(int *f,int *b,int *k,int *t,int i)
{
int m,n;

for(m=0;m<7;m++){
for(n=0;n<7;n++){
if(f[7*n+m]==1){
if(*t<*k){
if(*k-3+m<0){
*k=*k-1;
}
if(*k-3+m>12){
*k=*k-1;
}
if(b[(TATE-(i-3+n))*YOKO+*k-3+m]==1){
*k=*k-1;
}
}
}
}
}


for(m=0;m<7;m++){
for(n=0;n<7;n++){
if(f[7*n+m]==1){
if(*t>*k){
if(*k-3+m<0){
*k=*k+1;
}
if(*k-3+m>12){
*k=*k+1;
}
if(b[(TATE-(i-3+n))*YOKO+*k-3+m]==1){
*k=*k+1;
}
}
}
}
}
}

int sorou(int *a,int *b){
int c,d,e;
for(c=1;c<TATE;c++){
if(a[c]==YOKO){
for(d=c;d<TATE-1;d++){
for(e=0;e<YOKO;e++){
b[YOKO*d+e]=b[YOKO*d+YOKO+e];
a[d]=a[d+1];
b[(TATE-1)*YOKO+e]=0;
}
}

/*全部消す*/
for(d=1;d<TATE;d++){
for(e=1;e<YOKO+1;e++){
setMatrix(e+e+1,d,0);//=0;
}
}
/*全部描く*/
for(d=1;d<TATE;d++){
for(e=0;e<YOKO;e++){
if(b[YOKO*d+e]==1){
setMatrix(e+e+3,TATE-d,1);//=1;
}
}
}
}
}
}
void setMatrix(int x,int y,int value){
x=(x-3)/2;
y=y-1;
matrix[x][y]=value;
}

int kesu(int k,int i,int *f)
{

int m,n;
for(m=0;m<7;m++){
for(n=0;n<7;n++){
if(f[m*7+n]==1){
if(i-3+m!=0){
setMatrix(n+n+k+k-3,i-3+m,0);//=0;
}
}
}
}
}
int kaku(int k,int i,int *f)
{
int m,n;

for(m=0;m<7;m++){
for(n=0;n<7;n++){
if(f[m*7+n]==1){
if(i-3+m!=0){
setMatrix(n+n+k+k-3,i-3+m,1);
}
}
}
}
}

int migikaiten(int *f,int k,int i,int *b){
int g[49],m,n,t;
for(m=0;m<7;m++){
for(n=0;n<7;n++){
g[m*7+6-n]=f[n*7+m];

}
}
t=kaitenhuka(g,k,i,b);
if(t==1){
kesu(k,i, f);
for(m=0;m<7;m++){
for(n=0;n<7;n++){
f[m*7+n]=g[m*7+n];

}
}
kaku(k,i, f);
}


}

int sayuu(int i,int *k,int *f, int *b,int *j,int h)
{
int l,t,s[7],m,n,o,p,q,r;

l=*k;

for(n=0;n<7;n++){
s[n]=0;
}
o=1;
p=1;
q=0;
r=0;

for(m=0;m<7;m++){
for(n=0;n<7;n++){
s[m]=s[m]+f[n*7+m];
}
}

for(n=0;n<7;n++){
q=q+1;
if(s[n]<1){
if(o==q){
o=o+1;
}
}
}


for(n=6;n>=0;n--){
r=r+1;
if(s[n]<1){
if(p==r){
p=p+1;
}
}
}
        right_val=digitalRead(RIGHT_PIN);
        left_val=digitalRead(LEFT_PIN);
        rotate_val=digitalRead(ROTATE_PIN);
        if(right_val == HIGH && right_old_val == LOW){
          if(l<YOKO-(5-p)){
                    l=l+1;
}
        }
        if(left_val == HIGH && left_old_val == LOW){
          if(l>0-4+o){
                    l=l-1;
}
        }
        if(rotate_val == HIGH && rotate_old_val == LOW){
          migikaiten(f,l,i,b);
        }
        right_old_val = right_val;
        left_old_val = left_val;
        rotate_old_val = rotate_val;

        


//if (kbhit()==1) {      /* キー入力があると1を返す */
       // t = getch();    /* 入力をエコーバックなしに取得 */
/*switch (t) {
case '9':
if(l<YOKO-(5-p)){
                    l=l+1;
}
break;

case '7':
if(l>0-4+o){
                    l=l-1;
}
                break;
case '8':
migikaiten(f,l,i,b);
break;
case 'i':
*j=*j+h;
break;
case 'k':
mugen(h);
break;
}
}*/

*k=l;
}