予定通り、右手の親指と人差し指を火傷し、
無事に完成。
しかも、一発で!!!
もう、無茶苦茶感動的です。
こんなこと、あっていいのかぁ。
学生時代のリベンジ終了。
これで、とりあえず半田ごてはお片付け。
次はOS自作入門を制覇しながら、
ユニバーサル基盤の配線のシミュレーターを作成する。
終わったら、CPUの創り方に沿って、
また半田付けかしら。
とりあえず、もろもろに楽しかった!
そして、完成して気が付いたこと。
ボタンを三つ並べてくっつけて配置したことは
押しにくくなるという問題を発生させた。
かといって、直せないわけですが。
そんな反省点に出会いました。
後は、やっぱりリセットボタンが欲しかったかな。
これは検討次第で追加が可能そうだ。
以上、そんなこんな。
で、以下、コード。
-----------
//LEDmatrixと74HC138APを利用したテトリス
#define YOKO 8
#define TATE 9
#define RIGHT_PIN 15
#define LEFT_PIN 17
#define ROTATE_PIN 14
#define DOWN_PIN 16
//表示キャラクタ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;
int down_old_val = 0;
int down_val = 0;
int delete_flag =-1;
//初期化
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);
pinMode(DOWN_PIN,INPUT);
randomSeed(analogRead(5));
}
//LEDマトリクス制御ピンの配置設定 14=A0,15=A1,16=A2,17=A3
byte row[8]={ 8, 13, 6, 12,11, 7,10, 9};
byte base[3]={2,3,4};
#define DUTY 10 // DUTYの値は1〜20までの値。値が大きいとLEDが明るく点灯
#define S_DELAY 80 // S_DELAYの値を大きくするとゆっくりスクロールする
void drawMatrix(){
int count=S_DELAY;
if(delete_flag==0){
delete_flag==-1;
}
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){
delete_flag=0;
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);
down_val=digitalRead(DOWN_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);
}
if(down_val == HIGH && down_old_val == LOW){
*j=*j+h;
}
right_old_val = right_val;
left_old_val = left_val;
rotate_old_val = rotate_val;
down_old_val =down_val;
*k=l;
}
0 件のコメント:
コメントを投稿