2015年3月7日土曜日

paplioテトリス

メガウイング アーケードを用いて

-----

#include "VGA.h"

#define HSync WING_A_1
#define VSync WING_A_0
#define Red0 WING_A_7
#define Red1 WING_A_5
#define Green0 WING_A_6
#define Green1 WING_A_4
#define Blue0 WING_A_2
#define Blue1 WING_A_3
#define RIGHT_PIN WING_B_11
#define LEFT_PIN WING_B_8
#define ROTATE_PIN WING_B_9
#define DOWN_PIN WING_B_10

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 spaseX=3;
int spaseY=5;

void setup_pin_select() {
  pinMode(HSync,OUTPUT);
  digitalWrite(HSync,HIGH);
  outputPinForFunction(HSync, 15);
  pinModePPS(HSync, HIGH);

  pinMode(VSync,OUTPUT);
  digitalWrite(VSync,HIGH);
  outputPinForFunction(VSync, 14);
  pinModePPS(VSync, HIGH);   
  
  pinMode(Red0,OUTPUT);
  digitalWrite(Red0,HIGH);
  outputPinForFunction(Red0, 9);
  pinModePPS(Red0, HIGH);   

  pinMode(Red1,OUTPUT);
  digitalWrite(Red1,HIGH);
  outputPinForFunction(Red1, 8);
  pinModePPS(Red1, HIGH); 
  
  pinMode(Green0,OUTPUT);
  digitalWrite(Green0,HIGH);
  outputPinForFunction(Green0, 11);
  pinModePPS(Green0, HIGH); 

  pinMode(Green1,OUTPUT);
  digitalWrite(Green1,HIGH);
  outputPinForFunction(Green1, 10);
  pinModePPS(Green1, HIGH); 

  pinMode(Blue0,OUTPUT);
  digitalWrite(Blue0,HIGH);
  outputPinForFunction(Blue0, 13);
  pinModePPS(Blue0, HIGH); 

  pinMode(Blue1,OUTPUT);
  digitalWrite(Blue1,HIGH);
  outputPinForFunction(Blue1, 12);
  pinModePPS(Blue1, HIGH);     
}

void setup(){
setup_pin_select();
  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));
  VGA.begin(VGAWISHBONESLOT(9),CHARMAPWISHBONESLOT(10));
VGA.clear();
}

void loop(){
int i, j,k,c,d,e,l,m,o,g,yon,next,t,p,n,w,x,y,h,f[49],a[21],b[299];

/*nとwとaの初期化*/
h=300;
for(n=0;n<21;n++){
a[n]=0;
}
w=0;
for(k=0;k<23;k++){
for(g=0;g<13;g++){
b[13*k+g]=0;
}
}
for(g=0;g<13;g++){
b[g]=1;
}


next=rand() % 7;
        drawArea();

        while(true){
kesu2(f);
yon=next;
next=rand() % 7;
katakime(f,next);
kaku2(f);
katakime(f,yon);
k=5;
t=0;
p=0;
for (i = 1; i <=20 ; 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){
                                        delay(1);
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);
}
}
}
stop(f, b, &p, &t, k, i, a, h);
sorou(a,b);
if(p!=1){
/*とりあえず、消し去ろう*/
if(p!=1){
kesu( k, i, f);
t=k;
}
}
}
}
return;
}
void drawArea(void)
{
        int i;
VGA.begin(VGAWISHBONESLOT(9),CHARMAPWISHBONESLOT(10));
VGA.setBackgroundColor(BLACK);
VGA.setColor(RED);
/*横軸*/
for(i=0;i<30;i++){
VGA.printtext((i)*spaseX,(0)*spaseY,"-");
VGA.printtext((i)*spaseX,(21)*spaseY,"-");
}
for(i=30;i<41;i++){
VGA.printtext((i)*spaseX,(0)*spaseY,"-");
VGA.printtext((i)*spaseX,(2)*spaseY,"-");
VGA.printtext((i)*spaseX,(7)*spaseY,"-");
}
/*縦軸*/
for(i=0;i<22;i++){
VGA.printtext((1)*spaseX,(i)*spaseY,"|");
VGA.printtext((30)*spaseX,(i)*spaseY,"|");
}
VGA.printtext((40)*spaseX,(1)*spaseY,"|");

for(i=3;i<7;i++){
VGA.printtext((40)*spaseX,(i)*spaseY,"|");
}
VGA.printtext((32)*spaseX,(1)*spaseY,"NEXT");
}
int sorou(int *a,int *b){
int c,d,e;
for(c=1;c<21;c++){
if(a[c]==13){
for(d=c;d<20;d++){
for(e=0;e<13;e++){
b[13*d+e]=b[13*d+13+e];
a[d]=a[d+1];
b[260+e]=0;
}
}

VGA.begin(VGAWISHBONESLOT(9),CHARMAPWISHBONESLOT(10));
VGA.clear();
VGA.setBackgroundColor(BLACK);
VGA.setColor(RED);
drawArea();
/*全部描く*/
for(d=1;d<21;d++){
for(e=0;e<13;e++){
if(b[13*d+e]==1){  
VGA.printtext((e+e+3)*spaseX,(21-d)*spaseY,"*");
}
}
}
}
}
}
int zikan(int h)
{
delay(1000);
}
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[(21-(i-3+n))*13+k-3+m]==1){
return 0;
}
}
}
}
return 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 stop(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[(20-(i-3+n))*13+k-3+m]==1){
*t=k;
for(o=0;o<7;o++){
for(q=0;q<7;q++){
a[21-(i-3+o)]=a[21-(i-3+o)]+f[7*o+q];
}
}
for(r=0;r<7;r++){
for(s=0;s<7;s++){
b[(21-(i-3+r))*13+k-3+s]=b[(21-(i-3+r))*13+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[(21-(i-3+n))*13+*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[(21-(i-3+n))*13+*k-3+m]==1){
*k=*k+1;
}
}
}
}
}
}
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<13-(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){
if(down_val == HIGH){
*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;
}
int kaku(int k,int i,int *f)
{
int m,n;
VGA.begin(VGAWISHBONESLOT(9),CHARMAPWISHBONESLOT(10));
VGA.setBackgroundColor(BLACK);
VGA.setColor(RED);
for(m=0;m<7;m++){
for(n=0;n<7;n++){
if(f[m*7+n]==1){
if(i-3+m!=0){
VGA.printtext((n+n+k+k-3)*spaseX,(i-3+m)*spaseY,"*");
                                }
}
}
}
}


int kesu(int k,int i,int *f)
{
int m,n;
VGA.begin(VGAWISHBONESLOT(9),CHARMAPWISHBONESLOT(10));
VGA.setBackgroundColor(BLACK);
VGA.setColor(BLACK);
for(m=0;m<7;m++){
for(n=0;n<7;n++){
if(f[m*7+n]==1){
if(i-3+m!=0){
VGA.printtext((n+n+k+k-3)*spaseX,(i-3+m)*spaseY,"*");
}
}
}
}
}
int kaku2(int *f)
{
int m,n;
VGA.begin(VGAWISHBONESLOT(9),CHARMAPWISHBONESLOT(10));
VGA.setBackgroundColor(BLACK);
VGA.setColor(RED);
for(m=0;m<7;m++){
for(n=0;n<7;n++){
if(f[m*7+n]==1){
VGA.printtext((31+n+n-3)*spaseX,(2+m)*spaseY,"*");
}
}
}
}

int kesu2(int *f)
{
int m,n;
VGA.begin(VGAWISHBONESLOT(9),CHARMAPWISHBONESLOT(10));
VGA.setBackgroundColor(BLACK);
VGA.setColor(BLACK);
for(m=0;m<2;m++){
for(n=0;n<4;n++){
VGA.printtext((33+n+n-1)*spaseX,(4+m)*spaseY,"*");
}
}
}

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;
}
}

0 件のコメント:

コメントを投稿