本人想做一個16X16的點陣游戲機,在網上看到有人做了,但是程序有些不明白,求大神幫忙。
下面是程序
#include"reg51.h"
#include"stdlib.h"
#include"intrins.h"
#include"keyscan.h"
#define uchar unsigned char
#define uint unsigned int
sbit SDI=P3^4; //串行數據輸入
sbit SCK=P3^6; //移位
sbit RCK=P3^5; //并行輸出
extern uchar startcontrol;
uchar h; //底部下落的高度,y=0,剛剛出現
uchar shape_num; //一共19種形狀,=0~18
uint speed; //下落速度
uint initial_speed; //下落的初始速度
uint system_speed; //系統下落速度,會隨著分數的增加而減小,下落速度會加快
uint fast_speed; //按下down鍵時,方塊的下落速度
uint rand_num; //隨機數變量,產生隨機方塊
uint k;
uint score; //游戲分數
uchar code num_hang[]={ 0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,
0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00}; //從最上面一行開始向下
//uchar code num_qian[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
uchar code num_one[]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
16,4,16,21,208,36,136,36,136,4,236,63,138,4,136,20,136,21,232,24,136,40,136,40,136,52,232,34,0,0,0,0,//俄
252,63,68,34,68,34,68,34,252,63,64,0,32,0,240,31,44,16,64,8,128,4,0,3,224,0,30,0,0,0,0,0, //羅
36,24,36,7,126,1,36,1,36,1,60,63,36,9,60,9,36,9,36,9,126,9,0,9,164,8,66,8,0,0,0,0, //斯
64,0,128,0,254,63,32,0,32,0,32,0,224,15,32,8,32,8,16,8,16,8,8,8,4,8,2,6,0,0,0,0, //方
8,1,8,1,200,31,8,17,62,17,8,17,8,17,232,63,8,5,56,5,142,8,128,8,64,16,32,32,0,0,0,0, //塊
64,4,132,4,8,60,224,5,64,2,66,28,196,17,80,9,80,63,72,9,72,9,36,9,164,9,16,12,0,0,0,0, //游
0,10,0,18,124,18,64,2,64,62,164,3,40,18,16,18,48,10,40,10,72,36,68,42,2,49,128,32,0,0,0,0, //戲
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
//uchar code num_hou[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
uchar code shape[19][8]={
0x00,0x00,0x00,0x00,0x80,0x01,0x80,0x01, //19種方塊形狀
0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,
0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x00,
0x00,0x00,0x00,0x00,0xc0,0x00,0x80,0x01,
0x00,0x00,0x80,0x00,0x80,0x01,0x00,0x01,
0x00,0x00,0x00,0x00,0x80,0x01,0xc0,0x00,
0x00,0x00,0x00,0x01,0x00,0x01,0x80,0x01,
0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x01,
0x00,0x00,0x80,0x01,0x80,0x00,0x80,0x00,
0x00,0x00,0x00,0x00,0x40,0x00,0xc0,0x01,
0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x01,
0x00,0x00,0x00,0x00,0x00,0x01,0xc0,0x01,
0x00,0x00,0x80,0x01,0x00,0x01,0x00,0x01,
0x00,0x00,0x00,0x00,0xc0,0x01,0x40,0x00,
0x00,0x00,0x00,0x00,0x80,0x00,0xc0,0x01,
0x00,0x00,0x00,0x01,0x80,0x01,0x00,0x01,
0x00,0x00,0x00,0x00,0xc0,0x01,0x80,0x00,
0x00,0x00,0x80,0x00,0x80,0x01,0x80,0x00
};
char staticdata[20][2]={ 0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0xff,0xff }; //方塊落下后固定顯示
// 后8列 前8列 下8行 上8行
void HC595_Send(uchar d0,uchar d1,uchar d2,uchar d3)
{
uchar i;
// SCK=1;
// RCK=1;
for(i=0;i<8;i++)
{
SDI=d0>>7;//&0x01;
d0<<=1;//>>=1;
SCK=0;
_nop_();
_nop_();
SCK=1;
}
for(i=0;i<8;i++)
{
SDI=d1>>7;//&0x01;
d1<<=1;//>>=1;
SCK=0;
_nop_();
_nop_();
SCK=1;
}
for(i=0;i<8;i++)
{
SDI=d2>>7;//&0x01;
d2<<=1;//>>=1;
SCK=0;
_nop_();
_nop_();
SCK=1;
}
for(i=0;i<8;i++)
{
SDI=d3>>7;//&0x01;
d3<<=1;//>>=1;
SCK=0;
_nop_();
_nop_();
SCK=1;
}
RCK=0;
_nop_();
_nop_();
RCK=1;
}
/**********開始界面*************/
void initial_image()
{
uchar j,k,ms;
startcontrol=1;
while(startcontrol)
{
for(ms=10;ms>0;ms--)
{
for(j=0;j<32;j+=2)
HC595_Send(~num_one[k+j+1],~num_one[k+j],num_hang[j],num_hang[j+1]);
}
k+=2;
if(k==(32*8)) k=0;
keyscan(); //鍵盤掃描
}
}
/***********數據初始化**********/
void initial_set()
{
char j;
h=0;
startcontrol=1;
shape_num=0;
initial_speed=50;
speed=initial_speed;
system_speed=initial_speed;
fast_speed=5;
rand_num=rand()%19;
shape_num=rand_num;
score=0;
for(j=0;j<19;j++)
{
staticdata[j][0]=0;
staticdata[j][1]=0;
}
}
/**********顯示形狀************/
void shape_display()
{
uchar j;
for(j=(h<3)?(3-h):0;j<4;j++)
{
HC595_Send(~shape[shape_num][2*j+1],~shape[shape_num][2*j],num_hang[2*(j+h-3)],num_hang[2*(j+h-3)+1]);
}
for(j=0;j<16;j++)
{
HC595_Send(~staticdata[j+3][1],~staticdata[j+3][0],num_hang[2*j],num_hang[2*j+1]); //[3][0] [3][1]~[18][0] [18][1]
}
}
/**********檢查方塊是否遇到障礙物***********/
uchar check(uchar shapenum) //????????????
{
char i=3,j=0;
while((!j)&&(i>=0))
{
if(((shape[shapenum][2*i]+staticdata[h+i][0])!=(shape[shapenum][2*i]|staticdata[h+i][0]))||
((shape[shapenum][2*i+1]+staticdata[h+i][1])!=(shape[shapenum][2*i+1]|staticdata[h+i][1]))) j++;
//((shape[shapenum][2*i]+staticdata[h+i][0]!=shape[shapenum][2*i]|staticdata[h+i][0])||
//(shape[shapenum][2*i+1]+staticdata[h+i][1]!=shape[shapenum][2*i+1]|staticdata[h+i][1])) j++;
i--; //???
}
return j;
}
/************主函數************/
void main()
{
char j;
initial_image();
initial_set();
while(1)
{
k=speed;
while(k--)
{
//keyscan();
shape_display();
}
h++; //方塊下落一格
if(check(shape_num))
{
h--;
if(!h)
{
initial_image();
initial_set();
}
else
{
for(j=0;j<4;j++)
{
staticdata[h+j][0]+=shape[shape_num][2*j]; //[30]~[37]
staticdata[h+j][1]+=shape[shape_num][2*j+1];
}
h=0;
rand_num=rand()%19;
shape_num=rand_num;
}
}
}
}
我想知道那個staticdata數組是什么意思,求相助。
|